在 VB 中,如何将一个命令的返回值作为另一个命令的参数? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
lixyz
V2EX    程序员

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

  •  
  •   lixyz 2024-02-16 17:18:48 +08:00 2500 次点击
    这是一个创建于 690 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    大致分为以下几步:

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

    2. ssh [email protected]

    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 [email protected]" WshShell.SendKeys "{ENTER}" WScript.Sleep 1500 WshShell.SendKeys "xxxxxxx" WshShell.SendKeys "{ENTER}" WScript.Sleep 1500 WshShell.SendKeys "cat /xxx/xxxxx/xxx.conf" 

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

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

    9 条回复    2024-02-18 01:39:27 +08:00
    dito
        1
    dito  
       2024-02-16 17:25:22 +08:00 via Android
    用 Dim 定义一个变量
    aiqinxuancai
        2
    aiqinxuancai  
       2024-02-16 22:05:54 +08:00
    授人鱼不如授人渔,我建议你使用 ChatGPT
    julyclyde
        3
    julyclyde  
       2024-02-16 22:16:07 +08:00
    首先你这不是 VB 而是 VBS

    其次建议你用 wscript 按顺序调用“各个”命令,而不是调一个 cmd.exe 然后给它发命令
    li02
        4
    li02  
       2024-02-16 22:51:02 +08:00
    在 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
        5
    drymonfidelia  
       2024-02-16 23:11:23 +08:00
    @Livid #4 复制粘贴 GPT 回复还是错的
    @li02 GPT 完全没理解 OP 想做什么,OP 调键鼠模拟 API 来实现这个功能是为了 ssh 能是一个交互式窗口,从而在 ssh 目标主机执行命令,第四步应该在远程主机上执行。你的 GPT 回复完全是在误导 OP
    lixyz
        6
    lixyz  
    OP
       2024-02-16 23:29:56 +08:00
    @drymonfidelia 是正确的,我是需要在 windows 下通过 ssh 去连接一台 linux 设备,然后执行一些预处理命令,没办法提前在 linux 设备上做操作,只能每次连接之后进行操作,所以想着通过一个脚本直接把这些前期步骤做了
    drymonfidelia
        7
    drymonfidelia  
       2024-02-16 23:36:09 +08:00
    @lixyz 他的 GPT 脚本只完成了第一步,完全没回答你的问题
    geelaw
        8
    geelaw  
       2024-02-17 05:19:18 +08:00 via iPhone
    本地 *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
        9
    tinola  
       2024-02-18 01:39:27 +08:00
    用 powershell 会不会方便一些.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5256 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:51 PVG 16:51 LAX 00:51 JFK 03:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86