Problema con la salida de este comando FOR

Problema con la salida de este comando FOR

Me acabo de dar cuenta de que estoy ejecutando un archivo bat al inicio de esta clave de registro, que tenía echo running abcy algunas otras cosas irrelevantes.

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

Así que aquí he modificado ese archivo bat... es solo una línea, nada irrelevante.

verás el contenido del archivo bat.

Aquí hay un resultado del indicador cmd que muestra la situación actual, que es el mismo problema fundamental, pero debería poder reproducir el problema.

La pregunta ahora es,

  • ¿Por qué dice echo sss y no echo sss ttt?
  • ¿Cómo puedo suprimir la ejecución de cmd o ese archivo bat de inicialización con FOR? La declaración FOR debería mostrar simplemente "echo g", no "echo sss" o "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:\>

Respuesta1

¿Por qué dice echo sss y no echo sss ttt?

Porque la línea sss tttcontiene un carácter de espacio. El forcomando lo tokeniza y almacena la primera mitad sssy %fla segunda mitad ttten %gla variable.

¿Cómo puedo suprimir la ejecución de cmd o ese archivo bat de inicialización con FOR? La declaración FOR realmente debería mostrar "echo g", no "echo sss" o "echo sss ttt".

Parece que para evaluar echo g ^| findstr "g"se inicializa un nuevo intérprete de comandos y \blah\startfile.batse ejecuta automáticamente. Haga que su lote no produzca nada.

Respuesta2

Si va a utilizar %fun archivo por lotes, debe escaparlo con otro %:

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

Ponlo en tu archivo por lotes y deberías obtener los resultados que estás buscando.

Respuesta3

Sólo para ampliar un poco la respuesta de Vlastimil...

Cuando elFOREl comando ejecuta el"echo g"y canaliza la salida afindstr,PARAprimero tiene que iniciar un nuevo procesador de comandos, lo que provoca\blah\startfile.batpara ser ejecutado.

\blah\startfile.batgenera una línea que contienesss ttt. Esa línea es procesada porPARAy esNOpasó aencontrartr.

Según la ayuda paraPARA:

El procesamiento consiste en... dividirlo en líneas individuales de texto y luego analizar cada línea en cero o más tokens. Luego se llama al cuerpo del bucle for con los valores de las variables establecidos en las cadenas de token encontradas. De forma predeterminada, /F pasa el primer token separado en blanco de cada línea...

Los delimitadores predeterminados paraPARAson:" ,;"(espacio coma y punto y coma).

La primera línea quePARAprocesos contiene la cadena:sss ttt. Esa cadena contiene un" "(espacio), que es un delimitador predeterminado paraPARA, que analiza la línea y asigna la primera cadena de token:"ss"a"%F". Entonces el"eco %f"genera una línea con solo:"ss". Esa es la primera línea que ve impresa. El"ttt"simplemente se descarta porque"PARA... eco %f"El comando no especificó incluir nada más que el primer token.

Si elPARAEl comando se escribió de manera diferente, habría visto la línea completa."sss ttt"repitió.

Aquí hay 3 maneras en quePARAEl comando podría haberse escrito para hacer eso.

La primera forma, utilizando el"delims="opción, establece el delimitador paraPARAa "vaciar", entoncesPARAdevuelve la línea completa como 1 token. Los tokens todavía están analizados y todos los delimitadores (" ,;") se eliminan, luego todas las fichas se combinan nuevamente con un espacio entre cada ficha. Este valor combinado se devuelve en la variable."%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

De esta siguiente manera, utilizando el"tokens=*"opción, dicePARApara poner todos los tokens encontrados en el valor de la variable especificada ("%F"). Los tokens aún se analizan y se eliminan todos los delimitadores, luego todos los tokens se combinan nuevamente con un espacio 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\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt

Esta tercera vía, utilizando el"tokens=1,*"opción, dicePARApara poner el primer (1) token encontrado en el valor de la variable especificada ("%F"). Y los tokens restantes se analizan y se eliminan todos los delimitadores, luego todos esos tokens restantes se combinan nuevamente con un espacio entre cada token y este valor combinado se devuelve en la variable nombrada con la letra que sigue al nombre de la variable especificada (por lo tanto en este caso variable"%gramo").

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"

Tenga en cuenta que lo siguiente no funcionará porque no hay "tokens=" definidos para variables más allá de la variable especificada de"%F":

C:\>for /f %f in ('echo sss ttt')  do echo %f %g

C:\>echo sss %g
sss %g


Entonces, en su ejemplo, si agregó el"delims="opción, verías esto:

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

C:\>echo sss ttt
sss ttt

C:\>echo g
g

C:\>

información relacionada