2013-10-24 91 views
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 

(我需要更換|與其他分隔符其實,但這不是問題的核心)。

我想在這個包含管道符號的命令輸出中存在問題,但我不知道它在具體如何工作以及如何解決它。

注意。我無法改變命令輸出的格式。

感謝您的任何建議。

回答

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到達回波線時,它在執行該線之前用變量內容替換變量參考。一旦更換完成,該行包含一個迴應命令,該回應命令將管道連接到另一個命令在這個示例中,爲了避免它,我只是將變量放在引號中以避免考慮管道字符。

如果您需要使用的變量是(不包括引號),然後通過管道字符需要被scaped爲

echo %tep:|=^|% 

也就是說,呼應%TEP%字符串與它scaped更換管道符(^)

爲什麼你的代碼卡住了?對於wget而言,這似乎更多是一個問題,而不是命令。

+0

你說得對,wget有問題。看來在命令中沒有正確處理192.168.1.200的延遲響應。所以我把wget命令放在其他批處理文件中,並從原始文件中調用它。它運作良好。謝謝。 – mez

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

輸出特殊字符的最佳方式是使用延遲擴展,因爲所有字符都可以毫無問題地處理。
您不需要引號也不會替換/轉義。

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