Só para expandir um pouco a resposta do Vlastimil ...
Quando o comando FOR
executa o "echo g"
e canaliza a saída para findstr
, FOR tem que primeiro iniciar um novo processador de comandos que faz com que \blah\startfile.bat
seja executado.
\ blah \ startfile.bat exibe uma linha contendo sss ttt
. Essa linha é processada por FOR e NÃO é passada para findstr .
De acordo com a ajuda de FOR :
Processing consists of ..., breaking it up into
individual lines of text and then parsing each line into zero or more tokens. The body of the for loop is then called with the variable value(s) set to the found token string(s). By default, /F
passes the first blank separated token from each line...
Os delimitadores padrão para FOR são: ",;" (vírgula espacial e ponto e vírgula).
A primeira linha que os processos FOR contém a string: sss ttt . Essa sequência contém um " "
(espaço), que é um delimitador padrão para FOR , que analisa a linha e atribui a primeira cadeia de token: "sss" para "% f" . Assim, o "echo% f" produz uma linha apenas com: "sss" . Essa é a primeira linha que você vê impressa. O "ttt" é simplesmente descartado porque o comando "FOR ... echo% f" não especificou incluir nada além do primeiro token.
Se o comando FOR fosse escrito de forma diferente, você teria visto a linha completa "sss ttt" ecoada.
Aqui estão 3 maneiras que o comando FOR poderia ter sido escrito para fazer isso.
A primeira forma, usando a opção "delims="
, define o delimitador de FOR como "empty", então FOR retorna todo linha como 1 token. Os tokens ainda são analisados e todos os delimitadores ( ",;" ) são removidos e, em seguida, todos os tokens são combinados novamente com um espaço entre cada token. Esse valor combinado é retornado na variável "% 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
Esta próxima forma, usando a opção "tokens=*"
, diz FOR para colocar todos os tokens encontrados no valor da variável especificada ( "% f "). Os tokens ainda são analisados e todos os delimitadores são removidos e, em seguida, todos os tokens são combinados novamente com um espaço entre cada token.
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-kevin>echo mm nn oo ss tt
mm nn oo ss tt
Esta terceira maneira, usando a opção "tokens=1,*"
, diz FOR para colocar o primeiro (1) token encontrado no valor da variável especificada ( "% f" ). E, os tokens restantes são analisados e todos os delimitadores são removidos e, em seguida, todos os tokens restantes são combinados novamente com um espaço entre cada token e esse valor combinado é retornado na variável nomeada com a letra que segue o nome da variável especificada neste caso, variável "% 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"
Observe que o seguinte não funcionará porque não há "tokens=" definido para variáveis além da variável especificada de "% f" :
C:\>for /f %f in ('echo sss ttt') do echo %f %g
C:\>echo sss %g
sss %g
Assim, no seu exemplo, se você adicionou a opção "delims="
, verá isso:
C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f
C:\>echo sss ttt
sss ttt
C:\>echo g
g
C:\>