如何在 vbscript 中使用字符串变量作为 telnet 命令?

Posted

技术标签:

【中文标题】如何在 vbscript 中使用字符串变量作为 telnet 命令?【英文标题】:How to use a string variable as a telnet command in a vbscript? 【发布时间】:2019-10-01 10:59:57 【问题描述】:

我正在尝试运行一个 Powershell 脚本,该脚本将调用一个批处理脚本,该脚本将启动一个 telnet 会话并运行以下命令:

mediaGet("gei",1)

感谢这个***问题Is it possible to use a batch file to establish a telnet session, send a command and have the output written to a file?我写了两个脚本:

telnet.bat

start telnet.exe 162.100.10.10
cscript telnet.vbs

telnet.vbs

set OBJECT=WScript.CreateObject("WScript.Shell")
Dim cmd
cmd = "mediaGet("gei",1)
WScript.sleep 50 
OBJECT.SendKeys cmd
WScript.sleep 50 
OBJECT.SendKeys "ENTER" 
WScript.sleep 50 
OBJECT.SendKeys "exitENTER" 
WScript.sleep 5000
OBJECT.SendKeys " "

但是,当我运行脚本时,vbs 脚本无法读取变量 cmd 的字符串。所以我把它改成了这样:

cmd = "mediaGet" & chr(40) & chr(34) & "gei" & ",1" & chr(41)

但是,它仍然在 telnet 终端上这样输出:

mediaGet"gei",1

如何让它读取字符串变量中的括号? 如果脚本最终可以工作,有谁知道如何将 vbs 脚本的输出保存到日志文件中?

【问题讨论】:

【参考方案1】:

我不知道 mediaget 是什么或它做什么(实际上我从未听说过),所以我不会对此发表评论。

但是,通过 PowerShell 运行外部命令非常常见且有据可查。见这些:

PowerShell: Running Executables

Execution of external commands in PowerShell done right

说了这么多……

如果您使用的是 powershell.exe 控制台主机,那是一回事,但您所做的只是调用 VBScript 和 cmd.exe 项。既然如此,那为什么不直接使用 cmd.exe 呢?

然而,PowerShell 可以直接执行此操作,那么,为什么要对 .bat 和 .vbs 进行额外的步骤?

示例:粗略且未经测试,因为我不需要下载和测试 mediaget

Start-Process -FilePath 'telnet.exe' -ArgumentList '162.100.10.10'
[system.reflection.assembly]::loadwithpartialname("System.Windows.Forms")
$SendKeys = [System.Windows.Forms.SendKeys]
$sendkeys::SendWait('mediaGet gei,1')
Start-Sleep -Seconds .5
$sendkeys::SendWait("ENTER")
Start-Sleep -Seconds .5
$sendkeys::SendWait("exitENTER")

您甚至可以使用 .Net 命名空间将 Telnet 替换为您自己的代码。

新对象 System.Net.Sockets.TcpClient

这样称呼它...

New-Object System.Net.Sockets.TcpClient('162.100.10.10', 80)

您可以将其用于write your own module 或使用来自 MS 的此powershellgallery.com。

在 YouTube 上的快速搜索表明 mediaget 是一种网络下载工具。

如果您所做的只是访问网站/ftp 站点以下载文件,您也可以直接在 PowerShell 中执行此操作。看到这个:

3 ways to download files with PowerShell

【讨论】:

我没有意识到可以直接在 PS 上完成。感谢您提供的信息丰富且很有帮助的回复。 mediaGet 原来是我正在使用的机器上内部开发的工具。发布问题时我没有意识到这一点。此工具会返回双工状态,其格式类似于:“media = 1234566, up: 1000 full duplex”。它在 telnet shell 上返回,我想在我的 Powershell 终端上检索该结果。 我注意到一个奇怪的事情是当输入 SendWait('mediaGet gei,1') 时,telnet shell 只将该命令读取为“diaGet gei,1”。所以我必须输入 '(space)(space)mediaGet gei,1' 才能正确读取命令。它以某种方式忽略了前两个字符,但我不知道为什么。 我已经尝试添加参数 -NoNewWindow 和 -RedirectStandardOutput 但两者都不起作用。我仍然无法将输出结果检索到我的 Powershell 终端中。你知道怎么做吗?提前致谢。

以上是关于如何在 vbscript 中使用字符串变量作为 telnet 命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBScript 中使用正则表达式替换部分子字符串?

如何从 cmd 获取变量并在 vbscript 中显示 - Vbscript

如何在函数中使用参数作为字符?

VBScript 执行和评估命令

如何在VBScript中的同一字符串的两个索引位置之间存储所有文本?

带有 HTA 前端的 VBScript