win10 script off batch bat windows batch-file cmd

windows - script - Secuencia de comandos por lotes para bucle y tubería



batch script (3)

Me gustaría que todos los archivos csv en un directorio cuyo nombre de archivo no contenga la palabra "resumen". Dentro de la línea de comandos puedo escribir el siguiente comando

dir /b my_dir/*.csv | find /V "summary"

Cuando intento transferir el comando anterior a un archivo por lotes, me encuentro con un problema porque el comando de canalización no es compatible con el bucle for. Es decir, no puedo hacer lo siguiente.

FOR /f %%A in (''dir /b my_dir/*.csv | find /V "summary"'') do ( rem want to do something here )

¿Alguien me puede arrojar algo de luz sobre cómo resolver el problema anterior?

¡Gracias por adelantado!


Echa un vistazo a la Windows PowerShell. No es que alguna vez lo haya usado, mente.


Necesitas escapar de la | Carácter para evitar que se interprete en el momento de analizar el comando de bucle . Usa ^ para escapar de él:

FOR /f "delims=" %%A in (''dir /b "my_dir/*.csv" ^| find /V "summary"'') do ( rem do what you want with %%A here )

Una vez escapado, el | se convierte en parte de la cadena '' -delimitada '' . Solo se interpreta como un símbolo especial cuando esa cadena se analiza por separado del bucle, como un "subcomando", de acuerdo con la sintaxis. Y eso se hace después de analizar el bucle.


Si tiene el problema de que Gilbeg obtuvo "buscar: / V '': no ​​existe tal archivo o directorio", entonces es muy probable que tenga cygwin, o similar, en su ruta y que el archivo por lotes no esté usando el comando de búsqueda de Windows. Si modifica su secuencia de comandos para utilizar la ruta de acceso absoluta de la búsqueda de Windows, el error desaparecerá:

FOR /f "delims=" %%A in (''dir /b "my_dir/*.csv" ^| %SYSTEMROOT%/system32/find.exe /V "summary"'') do ( rem want to do something here with %%A )