2011-05-17 9 views
21

Me gustaría tener todos los archivos csv en un directorio cuyo nombre de archivo no contenga la palabra "summary". Dentro de la línea de comandos que puede escribir el siguiente comandoBatch script with for loop and pipe

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

Cuando intento transferir el comando anterior en un archivo por lotes me encuentro con el problema de que la tubería de mando no se admite en el bucle. Es decir que no puedo hacer lo siguiente

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

Puede alguien arrojar algo de luz a mí en la forma de resolver el problema anterior?

¡Gracias de antemano!

+0

no hay 'for/f' en DOS. [cmd.exe y DOS son cosas completamente diferentes] (https://superuser.com/q/451432/241386) –

Respuesta

-3

eche un vistazo a Windows PowerShell. No es que alguna vez lo haya usado yo mismo, mente.

+0

Desafortunadamente, PowerShell es la ruta a la que el cliente desea ir. – Gilbeg

+0

Powershell funciona bien, pero como nota, anteriormente experimenté inestabilidades cuando llamé desde archivos bat (por ejemplo, call powershell.exe -command "blah blah blah"). Esto se relacionó en gran parte con las pruebas automáticas en las que la subcategoría PS nunca volvería (a pesar del comando "Salir"). No tuvimos tiempo para investigar a fondo, pero pensé que lo mencionaría. Tal vez le ahorrará a alguien más el dolor de cabeza de la depuración :) – TwoByteHero

41

Debe escapar del carácter | para evitar que se interprete en el momento de analizar el comando de bucle. Utilice ^ de escapar de ella:

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

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

+1

¡No! Tengo 'find:'/V ': Ningún archivo o directorio encontrar: 'summary': No existe ningún archivo o directorio' – Gilbeg

+0

@Gilbeg: Funciona para mí. ¿Estás seguro de que no te perdiste nada? ¿'My_dir \ *. Csv' contiene espacios? Si es así, ¿está entre comillas dobles? Aunque eso aún difícilmente produciría ese mensaje de error. –

5

Si obtiene el problema de que Gilbeg obtuvo "find:/V ': No existe tal archivo o directorio", es probable que tenga cygwin o similar en su ruta y el archivo por lotes no use el comando Windows find. Si modifica su secuencia de comandos para usar la ruta absoluta de Windows encontrar, entonces 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 
) 
+2

Bienvenido a StackOverflow. Es genial que te gustaría contribuir. Sin embargo, esta es una respuesta general. Es mucho mejor si adaptas tu respuesta a la pregunta. Por favor actualice en consecuencia. – kkuilla