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 setlocal
no topo do seu script para que ele seja executado em seu próprio contexto – você pode usá-lo com segurança cd
dentro do script.
Responder3
Como o grawity mencionado anteriormente, pushd \windows && (foobar & popd)
funcionaria melhor do que pushd \windows & foobar & popd
porque o último pode falhar se não existir tal diretório.
Além disso, usar setlocal
e endlocal
permite 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 setlocal
no 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
cd
dir1
...
setlocal
cd
dir2
command
endlocal
:: Now I am back in
dir1
...
E, claro, se você quiser que o comando seja executado somente se o cd
todir2
é bem sucedido, digamoscd
dir2
&&
command
.
Observe que o bloco setlocal
/ endlocal
cria 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
.