%CD%
funciona como deveria. Seu problema é que ele é expandido antes que seu loop for
seja executado. Use a expansão atrasada:
setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (filesharelist.txt) do (
pushd %%A
echo CD=!CD!
REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
popd
)
A expansão variável em cmd
é um pouco contraintuitiva. Variáveis de ambiente normais (da forma %foo%
, incluindo pseudo-variáveis como %date%
, %cd%
, ...) são expandidas quando uma instrução é analisada , não quando é executada. Blocos como o que segue o do
contam como uma instrução única, portanto, todas as variáveis no bloco são substituídas por seu valor anterior , o loop for
é executado. O que significa que %CD%
é substituído pelo valor que tinha antes do loop. Sem surpresa, este é o valor antes do pushd
.
A expansão atrasada contorna o problema expandindo as variáveis antes que uma instrução seja executada . Eles precisam usar o formulário !foo!
para isso, embora e ele tenha que ser explicitamente ativado com setlocal enabledelayedexpansion
ou cmd
precisa ser iniciado com cmd /v:on
ou precisa ser ativado em o registro. A maneira mais segura é a primeira porque não depende de nenhuma configuração ou ambiente externo.
Questionário de bônus: Por que o %DestinationDirectory%
ainda funciona conforme o esperado?