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 for
bucle 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 cmd
es 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 do
cuentan como una sola declaración, por lo que cada variable en el bloque se reemplaza por su valor.antesel for
bucle 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 enabledelayedexpansion
o cmd
debe iniciarse con cmd /v:on
o 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?