El bucle For no funciona cuando está precedido por "cd /d" (Windows 10, archivo por lotes)

El bucle For no funciona cuando está precedido por "cd /d" (Windows 10, archivo por lotes)

Si ejecuto esto en un archivo por lotes dentro de la carpeta de archivos MP4, funciona para configurar el último archivo MP4 modificado como una variable, para que pueda reproducirse con el reproductor multimedia predeterminado:

:: Set last modified MP4 file in current folder, as a variable...
for /f "eol=: delims=" %%F in ('dir /B /O:D *.mp4') do @set "newest=%%F"

:: Play the file (opens in default media player)...
"%newest%"

Si intento colocar lo siguiente en un archivo por lotes fuera de la carpeta de archivos MP4, cd /del bucle for lo ignora y no funciona:

:: Change to directory containing MP4 files...
cd /d "C:\My Videos"

:: Set last modified MP4 file in "C:\My Videos", as a variable (not working)...
for /f "eol=: delims=" %%F in ('dir /B /O:D *.mp4') do @set "newest=%%F"

:: Copy the MP4 to current folder...
xcopy "%newest%" "%CD%" /i /r /v /k /f /c /h /y >nul 2>&1

:: Change back to current directory
cd /d "%CD%"

Como puede ver, el comando del bucle for es exactamente el mismo en cada ejemplo. Funciona en el primero, pero no en el segundo.

Intenté poner pauseentre cada comando para ver si aparece algún error, ninguno aparece.

Intenté quitar las comillas dobles %CD%, no hay diferencia.

Intenté poner Setlocal EnableDelayedExpansionantes de los comandos, no hace nada.

Anteriormente, intenté especificar la carpeta directamente en el bucle FOR, agregándola /Sal comando DIR, pero eso copia el archivo MP4 incorrecto por alguna razón, donde la fecha de modificación era una fecha aleatoria sin sentido, no era el último MP4 modificado. Ese comando fue así:

for /f "eol=: delims=" %%F in ('dir /B /S /O:D "C:\My Videos\*.mp4"') do @set "newest=%%F"

Eso establece un MP4 como variable... ¡pero no el correcto!

Usando un archivo por lotes dentro de la carpeta de archivos MP4, sé que siempre funciona de esa manera.

Gracias de antemano a cualquiera que pueda arrojar algo de luz sobre por qué esto no funciona.

Respuesta1

Su script supone que %CD%conservará su valor original de principio a fin. Pero no es así como funciona esta variable: el intérprete la actualiza dinámicamente para representar siempre el directorio actual. Y después de tu primera cdorden, el caminoC:\My Videos se convierteel directorio "actual".

Entonces dirbusca archivos en la nueva ubicación e intenta xcopycopiar los archivos encontrados nuevamente a la misma ubicación en la que se encontraron y finalmente cd /d "%CD%"dice "cambiar al directorio en el que ya estoy". No te devolverá a la ubicación anterior porque en este punto %CD%es"C:\Mis vídeos".

Debes registrar explícitamente la ruta anterior.antescd en otro lugar, por ejemplo, usando set "PrevDir=%CD%".

información relacionada