¿Por qué %CD% no funciona después de usar pushd en una ruta UNC?

¿Por qué %CD% no funciona después de usar pushd en una ruta UNC?

en un archivo por lotes, estoy iterando a través de una lista de rutas unc en un archivo, usando pushd para cambiar el contexto a esa ubicación y luego ejecutando un comando. %CD% proporciona la ubicación del directorio anterior, no el directorio actualmente insertado.

for /f "tokens=*" %%A in (filesharelist.txt) do (
 pushd %%A
 echo CD=%CD% - expecting x:\ or x:\subpath here, but get previous directory
 REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
 popd
)

¿Cómo obtengo el directorio actual?

Respuesta1

%CD%Funciona como debería. Tu problema es que está ampliado.antestu forbucle incluso se ejecuta. Utilice la expansión retrasada en su lugar:

setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (filesharelist.txt) do (
 pushd %%A
 echo CD=!CD!
 REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
 popd
)

La expansión variable cmdes un poco contradictoria. Las variables de entorno normales (de la %foo%forma, incluidas pseudovariables como %date%, %cd%, ...) se expanden cuando se escribe una declaración.analizado, no cuando se ejecuta. Bloques como el que sigue docuentan como una sola declaración, por lo que cada variable en el bloque se reemplaza por su valor.antesel forbucle incluso se ejecuta. Lo cual significa %CD%que se reemplaza por el valor que tenía.antesel lazo. Como era de esperar, este es el valor.antesel pushd.

La expansión retrasada soluciona el problema expandiendo las variables justo antes de que se emita una declaración.ejecutado. Sin embargo , necesitan usar el !foo!formulario para eso.ydebe activarse explícitamente con setlocal enabledelayedexpansiono cmddebe iniciarse con cmd /v:ono debe estar habilitado en el registro. La forma más segura es la primera porque no depende de ninguna configuración o entorno externo.

Prueba extra: Por que %DestinationDirectory% ¿Aún funciona según lo previsto?

información relacionada