Espuria 'system \ cmd.exe' en los bucles for / F
Pregunta
Este es uno de esos requisitos que parecen complicarse más, cada vez que me encuentro con una cáscara de corte / cmd de Windows que necesitan un 'evitar'. Esencialmente ... necesito iterar a través de una lista específica de las carpetas en un shell de DOS para el lazo. Aquí es el bucle que se me ocurrió:
echo ^ [start for test]
for /F "usebackq " %%f IN (`dir /b /adh "w:\sandbox\tmp\"`) DO (
echo ^ do with file: %%f
rem <do something>
)
echo ^ [for test done]
La necesidad principal es iterar a través de los directorios ocultos en la carpeta de origen (caja de arena \ tmp aquí).
El resultado es sorprendente y frustrante. Este es el resultado del uso de esta instrucción FOR en la línea de comandos de la consola.
W:..> for /F "usebackq " %f
IN (`dir /b /adh "w:\sandbox\tmp\"`) DO echo ^ folder = %f
File Not Found <1>
folder = C:\WINDOWS\system32\cmd.exe <2>
folder = any <4>
folder = hidden-folder-01 <3>
folder = hidden-folder-02 <3>
folder = morph <4>
folder = practice-northwind <4>
que enumera cinco carpetas. ¡Excelente! Y uno cmd.exe en la etiqueta: << strong> 2 > y un misterio en la etiqueta: << strong> 1 >. Debería explicar los DIR interruptores, creo.
- / b ....... nombres formato desnudo, solo archivo / carpeta.
- / a dh ..... Tanto ocultos y directorios, que trataron de manera exhaustiva - no funcionaba.
/ a HD - / a d ...... Los elementos con el atributo de Directorio (carpetas).
- / a h ...... archivos ocultos / carpeta (aparentemente).
He marcado la salida y esto es lo que he trabajado hasta ahora.
- 'archivo no encontrado' .. .. .. .. .. .. .. no tengo ni idea. Me parece que el "archivo no encontrado". << strong> 1 > es un artefacto de la fuerte <> / interruptor ah. Cuando acabo de decir:
(dir /b /adh "w:\sandbox\tmp\"
) - C: \ WINDOWS \ system32 ** ** cmd.exe .. .. iterador espurias ( %% f ); Este error sólo se muestra con F versión / comando. Quiero encontrar directorios ocultos, y la lista de archivos set no devuelve los archivos ocultos (d'oh). Por lo tanto, hasta ahora tengo que cargar con el usebackq de A / F .
- Las carpetas ocultos ... .. .. .. .. .. .. Estas carpetas son los esperada salida _.
- Las carpetas de directorio. .. .. .. .. .. .. Estos archivos son falsos resultados, y no quería.
El resultado previsto de la versión de la línea CMD (o de la muestra de la escritura DOS) es sólo el << strong> 3 > artículos.
W:..> for /F "usebackq " %f
IN (`dir /b /adh "w:\sandbox\tmp\"`) DO echo ^ folder = %f
folder = hidden-folder-01 <3>
folder = hidden-folder-02 <3>
Por desgracia, "puede también conseguir casi cualquier archivo en la carpeta de destino. Creo que es más que ver con el interruptor oculto (/ AH).
¿Cómo puedo obtener una lista sólo las carpetas ocultos (archivos) en un directorio conjunto; y iterar sobre la lista como el comando FOR?
Gracias de antemano / Will
Solución
Debe utilizar
for /F "usebackq delims=*" %f IN (`"dir /b /adh "%1" 2>NUL"`) DO @echo. folder = "%f"
para hacerlo.
2>NUL
se asegurará de que el canal de error (por ejemplo. Archivo no encontrado) no se muestra y se refirió a NULL (NUL)
delims=*
se asegurará de que el guión también funcionará si los nombres de archivo tienen espacios, ya que los nombres de archivo no pueden tener un "*" en la que les vamos a encontrar todos!
Espero que esto funcione para usted, funcionó para mi.
Me gustaría tener una retroalimentación si algo cambia a su lado, si no se utiliza% f%, pero utiliza una, tengo una idea de por qué sale el siguiente que está en su línea de salida
folder = C:\WINDOWS\system32\cmd.exe <2>
saluda PCFreak
Otros consejos
En el archivo por lotes dir /b /a dh "w:\sandbox\tmp\"
debe dir /b /adh "w:\sandbox\tmp\"
sin espacio entre / a y DH. Con el espacio del comando dir es la interpretación de DH como un directorio o un archivo paremer y es la causa de su archivo no se encuentra el error.
Cuando se ejecuta desde la línea de comandos que está utilizando un parámetro diferente a la dir /b /ah /ad "w:\sandbox\tmp\"
comando dir por lo que está recibiendo de salida diferente. Con / ah y / ad como parámetros separados dir parece interpretar que debería mostrar cosas que son directorios o archivos ocultos, mientras que / ADH mostrar lo que son ambos directorios y oculto.
También usted no necesita tener @ en todas sus líneas. Justo pero @echo off en la parte superior del archivo y que va a desactivar el comando de eco para todo el archivo por lotes.