在命令输出中处理管道符号

时间:2013-10-24 09:50:15

标签: batch-file

我有问题处理包含管道符号|的命令输出。

运行命令

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(并回答否以询问是否打破批处理)继续使用echo,然后输出

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

代替

2512|2250  

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

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

请注意。我无法改变命令输出的格式。

感谢您的任何建议。

3 个答案:

答案 0 :(得分: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:|=^|%

这将逃脱|

答案 1 :(得分: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 

您将看到命令因管道字符而失败。它可以处理它

当cmd到达回显线时,它会在执行行之前用变量内容替换变量引用。一旦完成替换,该行包含一个echo命令,该命令管道到另一个命令。在此示例中,为了避免它,我只是将变量括在引号中以避免考虑管道字符。

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

echo %tep:|=^|%

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

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

答案 2 :(得分: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