Problema com a saída deste comando FOR

0

Acabei de perceber que estou executando um arquivo bat no início dessa chave de registro, que tinha echo running abc e algumas outras coisas irrelevantes

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

Então aqui eu modifiquei esse arquivo bat .. é apenas uma linha nada irrelevante nele.

você vê o conteúdo do arquivo bat.

Aqui está uma saída do prompt cmd mostrando a situação agora, que é o mesmo problema fundamental, mas você deve conseguir reproduzir o problema

A questão agora é,

  • Por que diz eco sss e não echo sss ttt?
  • Como posso suprimir a execução de cmd ou esse arquivo bat de inicialização com o FOR? A instrução FOR deve exibir apenas "echo g", não "echo sss" ou "echo sss ttt".
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
sss ttt
C:\Documents and Settings\Administrator>cd\

C:\>type \blah\startfile.bat <ENTER>
@echo sss ttt   

C:\>  

C:\>for /f %f in ('echo g ^| findstr "g"') do echo %f <ENTER>

C:\>echo sss
sss

C:\>echo g
g

C:\>
    
por barlop 31.07.2011 / 19:45

3 respostas

1

Why does it say echo sss and not echo sss ttt?

Porque a linha sss ttt contém um caractere de espaço. O comando for o tokeniza e armazena a primeira metade sss em %f e a segunda metade ttt em %g variable.

How can I suppress the running of cmd or that initialization bat file with the FOR? The FOR statement should really just display "echo g", not "echo sss" or "echo sss ttt".

Parece que, para avaliar echo g ^| findstr "g" , um novo interpretador de comandos é inicializado e seu \blah\startfile.bat é executado automaticamente. Faça o seu lote não produzir nada.

    
por 17.07.2013 / 08:31
0

Se você vai usar %f em um arquivo de lote, você precisa escapar com outro % :

for /f %%f in ('echo g ^| findstr "g"') do echo %%f

Coloque isso no seu arquivo de lote e você deve obter os resultados que está procurando.

    
por 03.11.2011 / 18:51
0

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:\>
    
por 27.05.2014 / 08:15