Em scripts de shell, se eu precisar executar um comando a partir de um diretório, podemos 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 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 de command
.
Alguma ideia?
Respostas:
Se você fizer:
você será deixado (como você declara) na pasta \ windows. Experimentar:
e você deve voltar aonde começou.
fonte
cd
/pushd
às vezes falha (se o diretório não existir, por exemplo).pushd \windows && (foobar & popd)
pode ser mais confiávelPor padrão, os arquivos em lotes do Windows são executados no contexto do shell pai (o que é incomum para usuários do Unix, onde
source
é necessário um explícito , mas era a única possibilidade no MS-DOS). Isso significa que mudanças de diretório e variáveis de ambiente também afetam o shell interativo original.Coloque
setlocal
na parte superior do seu script para executá-lo em seu próprio contexto - você pode usá-lo com segurançacd
dentro do script.fonte
(
)
apenas agrupa comandos juntos, mas ainda os executa no contexto pai.(setlocal & cd foo & bar)
não funciona; em vez dissopushd foo && (bar & popd)
seria necessário.Como o grawity mencionado anteriormente,
pushd \windows && (foobar & popd)
funcionaria melhor do quepushd \windows & foobar & popd
porque o último pode falhar se não houver esse diretório.Além disso, usar
setlocal
eendlocal
permitir que você tenha vários ambientes locais; por exemplo, você pode ter:setlocal
cd dir
command
endlocal
Agora você estaria de volta ao seu diretório original.
fonte
Você pode usar
cd -
para voltar ao diretório de trabalho anterior. E use em;
vez de&&
, então os comandos subseqüentes não dependerão do sucesso dos comandos anteriores.fonte
Aplaudo a sugestão de grawity de colocar
setlocal
no início do script em lote, mas acrescentaria o fato de que você pode ter vários blocos aninhadossetlocal
/endlocal
, para que uma resposta mais relevante à pergunta possa serE, é claro, se você deseja que o comando seja executado apenas se o
cd
todir2
for bem-sucedido, digamos .cd
dir2
&&
command
Observe que o bloco
setlocal
/endlocal
cria um ambiente localizado; portanto, qualquer variável que você definir ou alterar nesse bloco voltará ao seu valor anterior após oendlocal
.fonte
Você pode salvar o diretório atual em uma variável. Mude e mude de volta, dependendo do valor de retorno do comando. BTW,% CD% retorna seu DIR atual.
fonte