2013-10-24 2 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 достигает эхо-строки, он заменяет ссылку на переменную содержимым переменной перед выполнением строки. После того, как замена выполнена, строка содержит команду echo, которая передает другую команду. В этом примере, чтобы избежать этого, я просто включил переменную в кавычки, чтобы избежать рассмотрения символа трубы.

Если вам необходимо использовать переменную как (без кавычек), то труба символ должен быть scaped в

echo %tep:|=^|% 

То есть, эхо% строка% ТЭФ с характером трубы заменены его scaped (the ^)

Почему ваш код застревает? Это скорее проблема с 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 
Смежные вопросы