在 VB 中,如何将一个命令的返回值作为另一个命令的参数?

83 天前
 lixyz

在工作中需要使用连接到一台设备上进行一些操作,

大致分为以下几步:

  1. netsh interface ip set address name="XXXXX" source=static addr=X.X.X.X mask=X.X.X.X

  2. ssh username@x.x.x.x

  3. xxxxxxx(密码)

  4. cat /xxx/xxxxx/xxx.conf

在第四部会返回一个字符串(例如:lisi ),然后将该字符串作为第五步的参数:

  1. export lisi

每次都得一步一步输入,感觉挺麻烦的,所以想要写成一个脚本,前几部可以使用 vb 来实现:

Dim WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe"
WScript.Sleep 1500 
WshShell.SendKeys "netsh interface ip set address name='XXXXX' source=static addr=X.X.X.X mask=X.X.X.X"
WScript.Sleep 1500
WshShell.SendKeys "ssh username@x.x.x.x"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 1500
WshShell.SendKeys "xxxxxxx"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 1500
WshShell.SendKeys "cat /xxx/xxxxx/xxx.conf"

该如何接收第四步的返回值作为第五步的参数呢?

不懂 VB ,请大佬们帮忙,感谢感谢

1592 次点击
所在节点    程序员
9 条回复
dito
83 天前
用 Dim 定义一个变量
aiqinxuancai
83 天前
授人鱼不如授人渔,我建议你使用 ChatGPT
julyclyde
83 天前
首先你这不是 VB 而是 VBS

其次建议你用 wscript 按顺序调用“各个”命令,而不是调一个 cmd.exe 然后给它发命令
li02
83 天前
在 Windows 的 VBS 脚本中,可以使用以下方法将一个命令的返回值作为另一个命令的参数:

方法一:使用 WshShell 对象

WshShell 对象是 VBS 脚本中用于执行命令的工具。可以使用 Run 方法执行命令,并使用 StdOut 属性获取命令的返回值。例如,以下脚本将使用 ipconfig 命令获取 IP 地址,并将 IP 地址作为 echo 命令的参数:

VBScript
Set objShell = CreateObject("WScript.Shell")

' 执行 ipconfig 命令
Set objExec = objShell.Run("ipconfig", 0, True)

' 获取 IP 地址
strIP = objExec.StdOut.ReadLine

' 显示 IP 地址
WScript.Echo strIP
请谨慎使用代码。
方法二:使用 StdOut 对象

StdOut 对象是 VBS 脚本中用于获取命令输出的工具。可以使用 CreateObject 函数创建 StdOut 对象,并使用 ReadLine 方法获取命令的返回值。例如,以下脚本将使用 ipconfig 命令获取 IP 地址,并将 IP 地址作为 echo 命令的参数:

VBScript
Set objStdOut = CreateObject("StdOut")

' 执行 ipconfig 命令
objStdOut.Exec "ipconfig"

' 获取 IP 地址
strIP = objStdOut.ReadLine

' 显示 IP 地址
WScript.Echo strIP
请谨慎使用代码。
方法三:使用 RegEx 对象

RegEx 对象是 VBS 脚本中用于匹配正则表达式的工具。可以使用 Exec 方法执行命令,并使用 Match 方法匹配命令的输出。例如,以下脚本将使用 ipconfig 命令获取 IP 地址,并将 IP 地址作为 echo 命令的参数:

VBScript
Set objRegEx = CreateObject("RegEx")

' 执行 ipconfig 命令
objRegEx.Exec "ipconfig"

' 匹配 IP 地址
Set objMatch = objRegEx.Match("IPv4 Address\s*:\s*(\d+\.\d+\.\d+\.\d+)", 1)

' 获取 IP 地址
strIP = objMatch.SubMatches(0)

' 显示 IP 地址
WScript.Echo strIP
请谨慎使用代码。
注意:

在使用 WshShell 对象时,需要确保 Run 方法的返回值为 0 ,表示命令执行成功。
在使用 StdOut 对象时,需要确保 Exec 方法的返回值为 True ,表示命令执行成功。
在使用 RegEx 对象时,需要确保 Match 方法的返回值为 True ,表示匹配成功。
以下是一些具体的示例:

示例一:使用 WshShell 对象获取 IP 地址并显示

VBScript
Set objShell = CreateObject("WScript.Shell")

' 执行 ipconfig 命令
Set objExec = objShell.Run("ipconfig", 0, True)

' 获取 IP 地址
strIP = objExec.StdOut.ReadLine

' 显示 IP 地址
WScript.Echo strIP
请谨慎使用代码。
示例二:使用 StdOut 对象获取 IP 地址并显示

VBScript
Set objStdOut = CreateObject("StdOut")

' 执行 ipconfig 命令
objStdOut.Exec "ipconfig"

' 获取 IP 地址
strIP = objStdOut.ReadLine

' 显示 IP 地址
WScript.Echo strIP
请谨慎使用代码。
示例三:使用 RegEx 对象获取 IP 地址并显示

VBScript
Set objRegEx = CreateObject("RegEx")

' 执行 ipconfig 命令
objRegEx.Exec "ipconfig"

' 匹配 IP 地址
Set objMatch = objRegEx.Match("IPv4 Address\s*:\s*(\d+\.\d+\.\d+\.\d+)", 1)

' 获取 IP 地址
strIP = objMatch.SubMatches(0)

' 显示 IP 地址
WScript.Echo strIP
drymonfidelia
83 天前
@Livid #4 复制粘贴 GPT 回复还是错的
@li02 GPT 完全没理解 OP 想做什么,OP 调键鼠模拟 API 来实现这个功能是为了 ssh 能是一个交互式窗口,从而在 ssh 目标主机执行命令,第四步应该在远程主机上执行。你的 GPT 回复完全是在误导 OP
lixyz
83 天前
@drymonfidelia 是正确的,我是需要在 windows 下通过 ssh 去连接一台 linux 设备,然后执行一些预处理命令,没办法提前在 linux 设备上做操作,只能每次连接之后进行操作,所以想着通过一个脚本直接把这些前期步骤做了
drymonfidelia
83 天前
@lixyz 他的 GPT 脚本只完成了第一步,完全没回答你的问题
geelaw
82 天前
本地 *nix Bash 上运行 cat 并把 stdout 作为 export 的参数,只需要 export $(cat blah)"。让远程 *nix Bash 运行 cat 之后把 stdout 当作远程计算机上的 export 的参数,直接

ssh user@remote "export $(cat blah)"

就好,于是只要用 VBS 执行上面的命令。

另外 netsh 的效果应该是长期的,所以单独运行就行了。要让 ssh 无交互登录,应该考虑使用密钥对验证,而不是密码。

楼主最开始的代码,如果打开 cmd.exe 后 5 秒后,焦点不在 cmd.exe ,那会失败,很不稳定。
tinola
82 天前
用 powershell 会不会方便一些.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1015876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX