V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lixyz
V2EX  ›  程序员

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

  •  
  •   lixyz · 291 天前 · 1832 次点击
    这是一个创建于 291 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    大致分为以下几步:

    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  
       291 天前 via Android
    用 Dim 定义一个变量
    aiqinxuancai
        2
    aiqinxuancai  
       291 天前
    授人鱼不如授人渔,我建议你使用 ChatGPT
    julyclyde
        3
    julyclyde  
       291 天前
    首先你这不是 VB 而是 VBS

    其次建议你用 wscript 按顺序调用“各个”命令,而不是调一个 cmd.exe 然后给它发命令
    li02
        4
    li02  
       291 天前
    在 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  
       291 天前
    @Livid #4 复制粘贴 GPT 回复还是错的
    @li02 GPT 完全没理解 OP 想做什么,OP 调键鼠模拟 API 来实现这个功能是为了 ssh 能是一个交互式窗口,从而在 ssh 目标主机执行命令,第四步应该在远程主机上执行。你的 GPT 回复完全是在误导 OP
    lixyz
        6
    lixyz  
    OP
       291 天前
    @drymonfidelia 是正确的,我是需要在 windows 下通过 ssh 去连接一台 linux 设备,然后执行一些预处理命令,没办法提前在 linux 设备上做操作,只能每次连接之后进行操作,所以想着通过一个脚本直接把这些前期步骤做了
    drymonfidelia
        7
    drymonfidelia  
       291 天前
    @lixyz 他的 GPT 脚本只完成了第一步,完全没回答你的问题
    geelaw
        8
    geelaw  
       290 天前 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  
       290 天前
    用 powershell 会不会方便一些.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:08 · PVG 05:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.