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 offsetlocalcddir1...setlocalcddir2commandendlocal:: Now I am back indir1...
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.