¿Cómo ejecuto comandos en archivos en varias carpetas?

¿Cómo ejecuto comandos en archivos en varias carpetas?

Estoy tratando de encontrar una manera de ejecutar comandos en varios archivos que existen en varias carpetas. Por lo que tengo entendido, un forbucle 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

  1. Una técnica de depuración estándar es insertar el echocomando en scripts e incluso en comandos compuestos/complejos. Si lo haces

    for /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 los echocomandosellos mismospara que no se muestre, por lo que solo verá su salida.
    • "delims=…"Indica for cómo analizar las líneas de salida del dir *.avi /b /scomando. 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.
  2. Si escribe for /?o help for, obtendrá documentación sobre el forcomando. Abajo en la quinta página, verás

    In 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é %~naobtiene solo el nombre de los *.aviarchivos cuyos nombres completos están en %a. Ahora intenta

    for /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 1y file 2en Folder A, y los directorios file 3y file 4en Folder B. Y, como señala @dave_thompson_085, puedes combinarlo %~pa%~naen %~pna.

información relacionada