シェル スクリプトでは、ディレクトリからコマンドを実行する必要がある場合、サブシェルを使用して元のコンテキストに戻ることができます。
(cd temporary/new/directory ; command)
# now I am still in original directory
これはWindowsのバッチファイル(またはcmdファイル)で実行できますか?
バッチファイルで同じことを実行すると、新しいディレクトリに残ります。
できます:
pushd temporary\new\directory && command && popd
しかし、popd は の成功に依存しますcommand
。
何か案は?
答え1
もし、するなら:
pushd \windows && foobar && popd
(あなたが述べているように) \windows フォルダに残ります。次を試してください:
pushd \windows & foobar & popd
そして、出発点に戻るはずです。
答え2
デフォルトでは、Windows バッチ ファイルは親シェルのコンテキストで実行されます (これは明示的な指定source
が必要な Unix ユーザーにとっては珍しいことですが、MS-DOS ではこれが唯一の可能性でした)。つまり、ディレクトリの変更と環境変数は元の対話型シェルにも影響します。
setlocal
スクリプトの先頭に配置すると、スクリプトが独自のコンテキストで実行されるようになり、cd
スクリプト内で安全に使用できるようになります。
答え3
grawity が前述したように、後者はそのようなディレクトリが存在しない場合は失敗する可能性があるため、pushd \windows && (foobar & popd)
よりも適切に機能します。pushd \windows & foobar & popd
また、 とsetlocal
を使用するとendlocal
、複数のローカル環境を持つことができるため、たとえば次のようになります。
setlocal
cd dir
command
endlocal
これで元のディレクトリに戻ります。
答え4
setlocal
grawityさんのバッチスクリプトの先頭に/ブロックを置くという提案には賛成ですが、複数のネストされたsetlocal
/endlocal
ブロックを持つことができるという事実を追加したいと思います。そのため、質問に対するより適切な回答は次のようになるかもしれません。
@echo off
setlocal
cd
dir1
...
setlocal
cd
dir2
command
endlocal
:: Now I am back in
dir1
...
そしてもちろん、コマンドをcd
toの場合にのみ実行したい場合は、dir2
成功したとしましょうcd
dir2
&&
command
。
setlocal
/endlocal
ブロックはローカライズされた環境を作成するので、そのようなブロックで設定または変更した変数は、 の後に以前の値に戻ることに注意してくださいendlocal
。