por que o% CD% não funciona depois de usar o pushd em um caminho UNC?

4

em um arquivo em lote, estou percorrendo uma lista de caminhos unc em um arquivo, usando o comando pushd para alterar o contexto para esse local e, em seguida, executando um comando. % CD% fornece a localização do diretório anterior, não o diretório atualmente enviado.

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
)

Como obtenho o diretório atual?

    
por JJS 09.11.2012 / 18:07

1 resposta

7

%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?

    
por 09.11.2012 / 19:27

Tags