Просто чтобы немного расширить ответ Властимила ...
Когда команда FOR
выполняет "echo g"
и направляет вывод в findstr
, FOR должна сначала запустить новый командный процессор, который вызывает выполнение \blah\startfile.bat
.
\blah\startfile.bat выводит строку, содержащую sss ttt
. Эта строка обрабатывается FOR и НЕ передается в findstr.
Согласовывающ помощь для FOR:
Обработка состоит из ..., разбивая его на отдельные строки текста, а затем разбирая каждую строку в ноль или более токенов. Тело цикла for затем вызывается со значением (ями) переменной, установленными на найденную строку (и) токена. По умолчанию /F передает первый пустой токен из каждой строки ...
Разделителями по умолчанию для FOR являются: ",;" (пробел и точка с запятой).
Первая строка, которую обрабатывает FOR, содержит строку: sss ttt. Эта строка содержит " "
(пробел), который является разделителем по умолчанию для FOR, который анализирует строку и назначает первую строку токена: "sss" для "% f". Таким образом, «echo% f» выводит строку только: "sss". Это первая строка, которую вы видите напечатанной. "Ttt" просто отбрасывается, потому что в команде «FOR ... echo% f» не было указано ничего, кроме первого токена.
Если бы команда FOR была написана по-другому, вы бы увидели полную строку "sss ttt" .
Вот три способа, которыми команда FOR могла быть написана для этого.
Первый способ, используя опцию "delims="
, устанавливает разделитель FOR для "empty", поэтому FOR возвращает всю строку как 1 токен. Токены по-прежнему анализируются, и все разделители (",;") удаляются, затем все токены снова объединяются с пробелом между каждым токеном. Это объединенное значение возвращается в переменной "% f"
C:\>for /f "delims=" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\>echo mm nn oo ss tt
mm nn oo ss tt
Этот следующий способ, используя опцию "tokens=*"
, говорит FOR помещать все найденные токены в значение указанной переменной ("% f"). Токены все еще анализируются, и все разделители удаляются, затем все токены снова объединяются с пробелом между каждым токеном.
C:\>for /f "tokens=*" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt
Этот третий способ, используя опцию "tokens=1,*"
, указывает FOR помещать первый (1) найденный токен в значение указанной переменной («% f»). И, оставшиеся токены анализируются, и все разделители удаляются, затем все эти оставшиеся токены снова объединяются с пробелом между каждым токеном, и это объединенное значение возвращается в переменной, названной буквой, следующей за указанным именем переменной (так в этом случае переменная "% g").
C:\>for /f "tokens=1,*" %f in ('echo sss ttt') do echo %f %g
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"
C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"
Обратите внимание, что следующее не будет работать, потому что нет никаких «tokens =», определенных для переменных, кроме указанной переменной «% f»:
C:\>for /f %f in ('echo sss ttt') do echo %f %g
C:\>echo sss %g
sss %g
Итак, в вашем примере, если вы добавите опцию "delims="
, вы увидите это:
C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f
C:\>echo sss ttt
sss ttt
C:\>echo g
g
C:\>