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

17

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 Greg 29.07.2011 / 02:12

6 respostas

20

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.

    
por 29.07.2011 / 05:26
13

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.

    
por 29.07.2011 / 08:35
3

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
    
por 29.07.2011 / 02:24
3

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.

    
por 05.11.2013 / 00:03
1
Aplaudo a sugestão de Grawity de colocar 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
cddir1
  ...
setlocal
cddir2
command
endlocal
:: 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 .

    
por 04.11.2013 / 23:24
0

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.

    
por 29.07.2011 / 02:21