Alterar temporariamente o diretório para o comando de arquivo em lote único

Alterar temporariamente o diretório para o comando de arquivo em lote único

No script de shell, se eu precisar executar um comando de um diretório, posso usar um subshell para garantir o retorno ao contexto original:

(cd temporary/new/directory ; command)
# now I am still in original directory

Isso pode ser feito em arquivos em lote do Windows (ou arquivos cmd)

Fazer o mesmo em arquivos em lote me deixa no novo diretório.

Eu posso fazer:

pushd temporary\new\directory && command && popd

Mas o popd depende do sucesso do command.

Alguma ideia?

Responder1

Se você fizer:

pushd \windows && foobar && popd

você será deixado (como você afirma) na pasta \windows. Tentar:

pushd \windows & foobar & popd

e você deve voltar ao ponto de partida.

Responder2

Por padrão, os arquivos em lote do Windows são executados no contexto do shell pai (o que é incomum para usuários Unix, onde sourceé necessário um explícito, mas era a única possibilidade no MS-DOS). Isso significa que alterações de diretório e variáveis ​​de ambiente também afetam o shell interativo original.

Coloque setlocalno topo do seu script para que ele seja executado em seu próprio contexto – você pode usá-lo com segurança cddentro do script.

Responder3

Como o grawity mencionado anteriormente, pushd \windows && (foobar & popd)funcionaria melhor do que pushd \windows & foobar & popdporque o último pode falhar se não existir tal diretório.

Além disso, usar setlocale endlocalpermite que você tenha vários ambientes locais, por exemplo, você poderia ter:

setlocal

cd dir

command

endlocal

Agora você estaria de volta ao seu diretório original.

Responder4

Aplaudo a sugestão do grawity de colocar setlocalno início do seu script em lote, mas acrescentaria o fato de que você pode ter vários blocos setlocal/ aninhados endlocal, portanto, uma resposta mais relevante para a pergunta pode ser

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

E, claro, se você quiser que o comando seja executado somente se o cdtodir2é bem sucedido, digamoscddir2&&command.

Observe que o bloco setlocal/ endlocalcria um ambiente localizado, portanto, quaisquer variáveis ​​que você definir ou alterar nesse bloco serão revertidas para seu valor anterior após o endlocal.

informação relacionada