Se você fizer isso:
pushd \windows && foobar && popd
você será deixado (como você diz) na pasta \ windows. Experimente:
pushd \windows & foobar & popd
e você deve se encontrar onde você começou.
Em scripts de shell, se eu precisar executar um comando a partir de um diretório, posso usar um subshell para garantir que eu retorne ao contexto original:
(cd temporary/new/directory ; command)
# now I am still in original directory
Isso pode ser feito em arquivos em lotes do Windows (ou cmd-files)
Fazer o mesmo em arquivos batch deixa-me no novo diretório.
Eu posso fazer:
pushd temporary\new\directory && command && popd
Mas o popd depende do sucesso de command
.
Alguma idéia?
Por padrão, os arquivos em lote do Windows são executados no contexto do shell pai (o que é incomum para usuários do Unix, em que um source
explícito é necessário, mas era a única possibilidade no MS-DOS). Isso significa que as alterações no diretório e as variáveis de ambiente também afetam o shell interativo original.
Coloque setlocal
no topo do seu script para executá-lo em seu próprio contexto - você pode usar com segurança o cd
dentro do script.
Você pode usar cd -
para voltar ao diretório de trabalho anterior. E use ;
em vez de &&
, então os comandos subsequentes não dependerão do sucesso dos comandos anteriores.
$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc
Como grawity mencionado anteriormente, pushd \windows && (foobar & popd)
funcionaria melhor que pushd \windows & foobar & popd
, porque o último pode falhar se não houver esse 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.
setlocal
no início do seu script em lote, mas adicionaria o fato de que você pode ter vários blocos setlocal
/ endlocal
aninhados, portanto, uma resposta mais relevante ao 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
for dir2
for bem-sucedido, diga cd
dir2
&&
command
.
Observe que o bloco setlocal
/ endlocal
cria um ambiente localizado, portanto, qualquer variável que você definir ou alterar nesse bloco será revertida para seu valor anterior depois de endlocal
.
Você pode salvar o diretório atual em uma variável. Altere e mude de volta dependendo do valor de retorno do comando. BTW,% CD% retorna seu DIR atual.