単一バッチファイルコマンドのディレクトリを一時的に変更する


19

シェルスクリプトで、ディレクトリからコマンドを実行する必要がある場合、サブシェルを使用して元のコンテキストに確実に戻ることができます。

(cd temporary/new/directory ; command)
# now I am still in original directory

これはWindowsバッチファイル(またはcmdファイル)で実行できますか

バッチファイルで同じ操作を行うと、新しいディレクトリに移動します。

できます:

pushd temporary\new\directory && command && popd

しかしpopdはの成功に依存していcommandます。

何か案は?


「バッチファイル」または「cmdファイル」をどのように呼び出しますか?cdコマンドをシェルスクリプトに入れて、そのスクリプトを(ソースではなく)実行した場合、呼び出しシェルの現在の作業ディレクトリは変更されません。
ゲイリージョン

明確にするために、これはWindowsバッチファイルを参照していることです。
グレッグ

ディレクトリツリーのさまざまな部分で一連のコマンドを実行するスクリプト。一部のコマンドは、現在のディレクトリでのみ動作します。元のディレクトリに戻ると、スクリプトを駆動するデータが簡素化されます。呼び出す必要があるディレクトリごとに個別のバッチファイルを作成することを提案していますか?
グレッグ

私が思い出したように、あなたはシェルスクリプトを参照し、元の質問でWindowsに言及しなかったので、Unixのようなシステムを使用していると誤って仮定しました。今分かります。
ゲイリージョン

はい、申し訳ありませんが、私ははっきりしていませんでした(「バッチファイル」はヒントだと思いますが、-p)
グレッグ

回答:


21

もしあなたがそうするなら:

pushd \windows && foobar && popd

\ windowsフォルダーに(指定したとおりに)残されます。試してください:

pushd \windows & foobar & popd

そして、あなたはあなたが始めたところに戻って自分自身を見つけるべきです。


1
ああ、したがって、単一のアンパサンドはshのセミコロンに相当します。それは最高です。(および参照:ss64.com/nt/syntax-conditional.html
グレッグ

6
cd/がpushd時々失敗することを覚えておくのは良いことです(たとえば、ディレクトリが存在しない場合)。pushd \windows && (foobar & popd)信頼性が高い可能性があります
悲しみ

16

デフォルトでは、Windowsバッチファイルは親シェルのコンテキストで実行されます(これは、明示的な設定sourceが必要なUnixユーザーにとっては珍しいことですが、MS-DOSでは唯一の可能性でした)。これは、ディレクトリの変更と環境変数が元の対話型シェルにも影響することを意味します。

入れてsetlocal、安全に使用することができます-それは、独自のコンテキストで実行するために、あなたのスクリプトの先頭にcd、スクリプト内。


おかげで、これは私が必要なもののように聞こえます-Windowsマシンにアクセスしたときにチェックします。括弧を使用したサブコマンドに影響しますか?
グレッグ

1
@Greg:( )コマンドをグループ化するだけで、親コンテキストで実行するようです。(setlocal & cd foo & bar)動作しないでしょう; 代わりpushd foo && (bar & popd)に必要になります。
-grawity

4

前述のgrawity は、そのようなディレクトリがない場合は後者が失敗する可能性があるため、pushd \windows && (foobar & popd)よりうまくpushd \windows & foobar & popd機能します。

また、を使用するsetlocalendlocal、複数のローカル環境を使用できるため、たとえば次のようになります。

setlocal

cd dir

command

endlocal

これで、元のディレクトリに戻ります。


3

を使用cd -して、前の作業ディレクトリに戻ることができます。また、の;代わりに使用すると&&、後続のコマンドは前のコマンドの成功に依存しません。

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

Windowsバッチ/シェルスクリプトについて質問していることを明確にするために、質問を更新しました。shのようなシェルの下でそれを行う方法を知っている:)
グレッグ

BillP3rdが「;」に相当するものを指摘したように バッチファイルでは「&」です。
グレッグ

あ、ごめんなさい。あなたのスラッシュの使用は、それがUNIXだと思いました。
バハマ

1

setlocalバッチスクリプトの先頭にgrawityの提案を称賛しますが、複数のネストされたsetlocal/ endlocalブロックを持つことができるという事実を追加するので、質問に対するより適切な答えは

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

そして、もちろん、cdto dir2が成功した場合にのみコマンドを実行したい場合、と言います。cddir2&&command

注意setlocal/のendlocalいずれかの変数が設定していることや、ブロックの変化は後に以前の値に戻りますので、ブロックは、ローカライズされた環境を作成しますendlocal


0

現在のディレクトリを変数に保存できます。コマンドの戻り値に応じて変更し、元に戻します。ところで、%CD%は現在のディレクトリを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.