1

我在处理包含管道符号 | 的命令输出时遇到问题。

运行命令

wget.exe -O- -q http://192.168.1.200/get_sys[310]?rn=2  

输出(例如)

2512|2250  

但是批量使用

for /f "delims=" %%a in ('wget.exe -O- -q http://192.168.1.200/get_sys[310]?rn=2') do set tep=%%a
echo %tep%  

输出卡住。我必须使用 ^C (并回答否来询问是否中断批处理)继续回显,然后输出是

C:\Batch>set tep=2512
C:\Batch>echo 2512
2512  

反而

2512|2250  

(实际上我需要用其他分隔符替换 | ,但这不是问题的核心)。

我想这个包含管道符号的命令输出中存在问题,但我不知道它在具体中是如何工作的以及如何解决它。

笔记。我永远无法更改命令输出的格式。

感谢您的任何建议。

4

3 回答 3

1

你可以试试:

for /f "delims=" %%a in ('wget.exe -O- -q http://192.168.1.200/get_sys[310]?rn=2') do ( 
  set "tep=%%a"
)
echo %tep:|=^|%

这将逃脱|

于 2013-10-24T09:56:19.543 回答
1

输出特殊字符的最佳方式是使用延迟扩展,这样所有字符都可以毫无问题地处理。
您不需要引号,也不需要替换/转义。

for /f "delims=" %%a in ('wget.exe -O- -q http://192.168.1.200/get_sys[310]?rn=2') do ( 
  set "tep=%%a"
)
setlocal EnableDelayedExpansion
echo !tep!
endlocal
于 2013-10-24T10:48:39.390 回答
1

如果运行以下 cmd 文件

@echo off

    rem run a command which return a string with a pipe in it
    for /F "tokens=*" %%f in ('type "%~dpnx0" ^| find "DATA:"') do set line=%%f

    rem output the string to the console.
    rem quotes needed so cmd does not interpret pipe character
    echo "%line%"
    exit /b 

    DATA: THIS LINE WILL BE | PROCESSED BY THIS FILE

    rem end of file 

您会看到 for 命令不会因为管道字符而失败。它可以处理它

当 cmd 到达 echo 行时,它会在执行该行之前用变量内容替换变量引用。替换完成后,该行包含一个 echo 命令,该命令通过管道连接到另一个命令。在此示例中,为避免这种情况,我只是将变量括在引号中以避免要考虑管道字符。

如果您需要按原样使用变量(无引号),则管道字符需要转义为

echo %tep:|=^|%

也就是说,回显 %tep% 字符串,并将管道字符替换为转义符(^)

为什么你的代码卡住了?wget 似乎比命令更成问题。

于 2013-10-24T10:14:11.640 回答