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

次の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 に答える
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

試してみてください:

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 に答える