我有问题处理包含管道符号|的命令输出。
运行命令
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
(事实上,我需要替换其他分隔符,但这不是问题的核心。)
我认为这个包含管道符号的命令输出存在问题,但我不知道它在具体如何工作以及如何解决它。
请注意。我无法改变命令输出的格式。
感谢您的任何建议。
答案 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