在不使用输入文件的情况下将命令发送到“ plink.exe”

时间:2020-08-15 11:11:08

标签: batch-file telnet netcat plink

我在批处理文件中使用以下命令行:

C:\my_folder\plink.exe 192.168.0.112 -P 6950 -raw -batch < C:\my_folder\string.txt > C:\my_folder\output.txt

string.txt包含字符串:

GET VALUE <PEP_LOGMODE>

命令行将保存在string.txt中的字符串发送到服务器192.168.0.112。然后,服务器响应将保存在output.txt中。

输出应包含三行文本,例如:

+Connected AppName="MyriadPlayout4" Version="4.0.28"
SET VALUE AUTO
+Success

这可行,但是我试图找到一种使用变量而不是文件的方法来发送字符串和接收响应。更具体地说,我尝试捕获第二行上的第三个令牌,在此示例中,它是AUTO。不幸的是,我不认为plink支持变量作为输入或输出,所以我认为它可能需要某种命令替换或管道,也许使用For /fusebackq,但是我是无法确定语法。

更新1

我不一定需要使用plink.exe。如果有人有可以使用类似的netcat,nc,telnet的解决方案,请提出建议。

@Aacini的建议非常接近答案。但是,我必须启用:

SetLocal EnableDelayedExpansion

因为字符串包含特殊字符<>,然后使用!var!而不是%var%来定义变量 这是我到目前为止所拥有的:

SetLocal EnableDelayedExpansion
SET "string=GET VALUE <PEP_LOGMODE>"
echo !string!
for /F "delims=" %%a in ('echo !string!^| C:\my_folder\plink.exe 192.168.0.112 -P 6950 -raw -batch') do set "output=%%a"
echo %output%

....但是当它尝试使用| was unexpected at this time.解析字符串时,它现在返回错误for /f

任何帮助将不胜感激。

更新2

@Compo提供的代码看起来应该可以解决问题:

@SetLocal EnableExtensions EnableDelayedExpansion
@Set "string=GET VALUE ^<PEP_LOGMODE^>"
@Set "output="
@For /F "EOL=+ Tokens=3" %%G In ('Echo !string! ^| "C:\my_folder\plink.exe" 192.168.0.112 -P 6950 -raw -batch') Do @Set "output=%%G"
@Set output 2> NUL
@Pause

@SetLocal EnableExtensions DisableDelayedExpansion
@Set "string=GET VALUE ^^^<PEP_LOGMODE^^^>"
@Set "output="
@For /F "EOL=+ Tokens=3" %%G In ('Echo %string% ^| "C:\my_folder\plink.exe" 192.168.0.112 -P 6950 -raw -batch') Do @Set "output=%%G"
@Set output 2> NUL
@Pause

...但是,两个示例中字符串中的插入号都试图用for /f解析字符串时导致语法错误。

更新3

我尝试过:

For /F "Delims=" %%G In ('Echo !string!') Do @Set "output=%%G"

这将产生:

output=GET VALUE <PEP_LOGMODE>

因此,看来输入字符串是正确的。

当我跑步时:

Echo GET VALUE ^<PEP_LOGMODE^>|"C:\my_folder\plink.exe" 192.168.0.112 -P 6950 -raw -batch

…。从命令行获取:

The syntax of the command is incorrect.
+Connected AppName="MyriadPlayout4" Version="4.0.28"

这将向我表明已与服务器建立连接,但命令丢失或不正确。

如果运行,我会得到相同的响应:

C:\my_folder\plink.exe 192.168.0.112 -P 6950 -raw -batch

...但没有语法错误:

1 个答案:

答案 0 :(得分:1)

似乎您需要使用插入符号 < <来转义 > ^ 字符/ strong>。

如果要使用延迟扩展,则只需在定义变量时将其转义:

@SetLocal EnableExtensions EnableDelayedExpansion
@Set "string=GET VALUE ^<PEP_LOGMODE^>"
@Set "output="
@For /F "EOL=+ Tokens=3" %%G In ('Echo !string! ^| "C:\my_folder\plink.exe" 192.168.0.112 -P 6950 -raw -batch') Do @Set "output=%%G"
@Set output 2> NUL
@Pause

如果您不想使用延迟扩展,则需要进行两次转义,需要三个插入符号

@SetLocal EnableExtensions DisableDelayedExpansion
@Set "string=GET VALUE ^^^<PEP_LOGMODE^^^>"
@Set "output="
@For /F "EOL=+ Tokens=3" %%G In ('Echo %string% ^| "C:\my_folder\plink.exe" 192.168.0.112 -P 6950 -raw -batch') Do @Set "output=%%G"
@Set output 2> NUL
@Pause