Estoy tratando de encontrar una manera de ejecutar comandos en varios archivos que existen en varias carpetas. Por lo que tengo entendido, un for
bucle es la mejor manera de hacer esto en CMD (estoy usando Windows). Sin embargo, tengo algunos problemas y usaré una de las operaciones que necesito hacer como ejemplo.
Para este comando específico, estoy intentando crear carpetas para varios archivos, dentro de varias carpetas. Aquí hay una imagen:
Folder A
File 1.avi
File 2.avi
Folder B
File 3.avi
File 4.avi
Busqué un poco y encontré este comando:
for /f "delims=*" %a in ('dir *.avi /b /s') do md "%~na"
Del que me desechéaquí. Esto es casi correcto: crea una carpeta para cada archivo contenido dentro de las múltiples carpetas. El problema es que necesito que esas carpetas nuevas estén contenidas en las mismas carpetas que los archivos. Este comando específico colocaría las nuevas carpetas en el mismo lugar que las carpetas originales, en lugar de dentro de ellas.
¿Alguien tiene alguna idea? Cualquier ayuda sería apreciada. Gracias.
Respuesta1
Una técnica de depuración estándar es insertar el
echo
comando en scripts e incluso en comandos compuestos/complejos. Si lo hacesfor /f "delims=*" %a in ('dir *.avi /b /s') do @echo md "%~na"
obtendrás el resultado
"file 1" "file 2" "file 3" "file 4"
Notas:
- El
@
previene losecho
comandosellos mismospara que no se muestre, por lo que solo verá su salida. "delims=…"
Indicafor
cómo analizar las líneas de salida deldir *.avi /b /s
comando. No sé por qué sugiere la respuesta a la que vinculó"delims=*"
. Pero el comportamiento predeterminado es separar las líneas en espacios, por lo que, si su directorio y/o nombres de archivos contienen espacios (como indicó), debe usarlos"delims="
(especificando que no hay delimitadores) para que esto funcione.
- El
Si escribe
for /?
ohelp for
, obtendrá documentación sobre elfor
comando. Abajo en la quinta página, verásIn addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax: %~I - expands %I removing any surrounding quotes (") ︙ %~pI - expands %I to a path only %~nI - expands %I to a file name only ︙ The modifiers can be combined to get compound results … ︙
lo que explica por qué
%~na
obtiene solo el nombre de los*.avi
archivos cuyos nombres completos están en%a
. Ahora intentafor /f "delims=" %a in ('dir *.avi /b /s') do @echo md "%~pa"
y obtendrás
"el_directorio_actual\Carpeta A\" "el_directorio_actual\Carpeta A\" "el_directorio_actual\Carpeta B\" "el_directorio_actual\Carpeta B\"
De lo cual podemos concluir que quieres hacer
for /f "delims=" %a in ('dir *.avi /b /s') do md "%~pa%~na"
para crear los directorios
file 1
yfile 2
enFolder A
, y los directoriosfile 3
yfile 4
enFolder B
. Y, como señala @dave_thompson_085, puedes combinarlo%~pa%~na
en%~pna
.