#batch-file
#пакетный файл
Вопрос:
Моя пакетная программа
FINDSTR /C:"Result Comparison failure" %tmp_result_file%
Я хочу выполнить следующее, установить результат приведенной выше команды в переменную.
Если найдено, установите для первой строки значение varible или установите для всех найденных строк значение varible, для меня это нормально.
также приведенная выше команда commmand выведет команду findstr на консоль даже при выключенном @echo. есть ли какой-либо способ отключить печать.
большое спасибо
часть моего скрипта, что я делаю, это запускаю команду в каждой строке исходного файла и помещаю результат выполнения в файл tmp, затем используйте find str, чтобы найти строку с ошибкой, чтобы проверить результат выполнения.
for /f %%a in (%source_file%) do (
echo run %%a >> %output_file%
call %run_script_command% %%a > %tmp_result_file% 2>amp;1
::notepad %tmp_result_file%
for /f %%i in ('FINDSTR /C:"Result Comparison failure" %tmp_result_file%') do echo %%ixxx
echo xx
)
очень странно, результат:
xx Resultxxx xx
предыстория в том, что у меня есть два элемента %source_file%
, поэтому выход для запуска 2 раза.
для первого FINDSTR ничего не может найти, поэтому print xxx
для второго он находит один в findstr , но выводит только « Result
» вместо « Result Comparison failure
«, также перед ним в результате выводится xx. Очень странно!
Ответ №1:
Первая проблема заключается в том, что вы просто берете первый токен из FOR . Чтобы решить эту проблему, у вас есть два решения: либо повторить полную строку, в которой найдена строка…
for /f "tokens=*" %%i in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do echo %%i
или повторить три найденных токена
for /f %%i in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do echo %%i %%j %%k
вторая проблема, xx повторяется два раза, потому что вы запускаете команду два раза. Первый xx — это тот, который был получен при первом запуске, второй — при втором запуске. Если вы хотите предотвратить второе, вам нужно использовать некоторую дополнительную логику. Например, установка переменной, а затем ее проверка. Внимание, установка переменной в цикле требует включения отложенного расширения и использования !xx! синтаксис (подробное объяснение см. в СПРАВКЕ)
setlocal enabledelayedexpansion
...
set result=
for /f "tokens=*" %%i in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do (
set result=%%i
)
if "!result!"=="" (
echo !result!
) else (
echo xx
)
Комментарии:
1. 1, но почему бы не сравнить значение
%%i
напрямую? Вот так (в теле внутреннего цикла):IF "%%i" == "" (ECHO xx) ELSE ECHO %%i
.2. да, вы правы, это возможно.. Я просто повторно использовал код, обрабатывающий несколько результатов поиска.
3. токены =* принадлежат до %%i, не так ли?
4.
"tokens=*" was unexpected at this time.
В первой заданной команде возникает синтаксическая ошибкаfor /F
."tokens=*"
должно быть размещено раньше%%i
.
Ответ №2:
Проверьте команду FOR /F.
for /f %i in ('FINDSTR /C:"Result Comparison failure" %tmp_result_file%') do ...
Комментарии:
1. Введите
for /?
, чтобы увидеть все параметры. Опция delims кажется здесь уместной. Я пытался указать вам правильное направление, а не решить всю вашу проблему за вас.2. Вы, вероятно, хотите
for /f "delims=" %%i in (...
3. @RaymondChen Тогда как ожидать получения флажка для ответа ?
4. @Jamie Ответ заключается в использовании для /F. Первоначально поставленный вопрос был настолько широким, что в основном это была «запись программой для меня», которая SO не предназначена.
5. @RaymondChen Справедливо, в вопросе, как я вижу, отсутствует контекст, который, как я ожидал, у вас изначально был.