2011-08-09 14 views
22

私は2つの必須の引数を受け入れ、バッチファイル、batch.batを、作成したい:DOSバッチでディレクトリを変更した後に元のディレクトリに戻るには?

  • %1は、現在のディレクトリへの相対パスを表します。
  • %2は、ファイル名を表します。

現在のディレクトリをfather\me\とします。次のように

ユーザーは、このバッチを使用することができます。

  • batch child/grandchild log
  • batch ../brother log

batch.batのジョブ記述は以下のようです。 %1ディレクトリへ

  1. 移動し、
  2. 反復し%1ディレクトリ内のすべてのファイル*.tex
  3. 移動する前に結果をディレクトリに保存します。

次の不完全なコードです:

rem batch.bat takes 2 arguments. 
cd %1 
dir /b *.tex > <original directory>\%2.txt 

DOSのバッチで変更ディレクトリを呼び出した後、元のディレクトリに戻るには、どのように?

答えて

34

元のディレクトリに戻したい場合は、最初にPUSHDで変更してPOPDに戻してください。それは、%1ディレクトリに移動ではなく、CD%1の

PUSHD %1 

で達成されなければならない、とリターンではなくどこCDの

POPD 

で達成されていますか?

あなたは元のディレクトリにアクセスしたい場合は後に、それを変更し、変数にこのようにそれを格納します。

SET ORIGINAL=%CD% 

例えば、ORIGINAL%後で%を使用します。

dir /b *.tex > %original%\%2.txt 
+7

+1:さらにPUSHDがCDにするために使用されるENDLOCALは、以下によって証明されるようにないクリアPUSHDスタックを行いネットワークに接続されたドライブは、CDには許可されていません。 – Mechaflash

+2

1年前に私がバッチを使用していたときにそのコメントがあったのですが、ネットワークドライブを回避する必要がありましたか? +100もしできれば – WernerCD

1

することができますディレクトリを変更する前に%cd%を常に変数に設定してください。

set current="%cd%" 
cd "C:\Some\Other\Folder" 
cd "%current%" 

ほとんどの場合、ディレクトリは、バッチスクリプトで使用されます。スクリプトが半長である場合は、重要なパス、ファイル、サブ、および/またはロングコマンドを含むスクリプトの先頭に変数を定義します。

@ECHO OFF 
REM Variables 
::Programs 
SET save_attachments=C:\Program Files\APED\Program\save_attachments.vbs 
SET sendemail=C:\Program Files\APED\Program\sendkeys.vbs 
SET tb=C:\Program Files\Mozilla Thunderbird\thunderbird.exe 
SET fox=C:\Program Files\Foxit Software\Foxit Reader\Foxit Reader.exe 
SET spool=C:\WINDOWS\system32\PRNJOBS.vbs 

::Directories 
SET new=C:\Program Files\APED\New 
SET printing=C:\Program Files\APED\Printing 
SET finish=C:\Program Files\APED\Finish 
SET messages=C:\Program Files\APED\Script_Messages 
SET nonpdf=C:\Program Files\APED\NonPDFfiles 
SET errorfiles=C:\Program Files\APED\Error Files 

::Important Files 
SET printlog=C:\Program Files\APED\Script_Messages\PrintLOG.txt 
SET printemail=C:\Program Files\APED\Script_Messages\EmailPrintLOG.txt 
SET errorlog=C:\Program Files\APED\Script_Messages\ErrorLOG.txt 
SET erroremail=C:\Program Files\APED\Script_Messages\EmailErrorLOG.txt 
SET movefiles=C:\Program Files\APED\Script_Messages\MoveFiles.txt 

しかし、PUSHDとPOPDは、短くて甘いimoであれば素晴らしいソリューションです。

11

これを行うには、PUSHD/POPDが望ましい方法です。しかしSETLOCAL/ENDLOCALには(SETLOCAL以外のものに加えて)同じことを実現する(文書化されていない?)機能があります。

SETLOCALの後にディレクトリを変更すると、ENDLOCALの元のディレクトリに戻ります。 であることをSETLOCALと

cd OriginalLocation 
setlocal 
cd NewLocation 
endlocal 
rem we are back to OriginalLocation 

もうひとつは、文書化 - どれというバッチ内のSETLOCALか:ラベルルーチンは、バッチまたはルーチンを出る際に、暗黙的なENDLOCALで終了します。暗黙のENDLOCALは、明示的なENDLOCALとして、元のフォルダーに戻ります。

cd OriginalLocation 
call :ChangeLocation 
rem - We are back to OriginalLocation because :ChangeLocation did CD after a SETLOCAL 
rem - and there is an implicit ENDLOCAL upon return 
exit /b 

:ChangeLocation 
setlocal 
cd NewLocation 
exit /b 

PUSHD/POPDの代わりにSETLOCAL/ENDLOCALを使用することはお勧めしません。しかし、それはあなたが知っておくべき行動です。ジョニーさんのコメント

PUSHD/POPDとSETLOCAL/ENDLOCALが組み合わされたとき、それは混乱得ることができますへ

レスポンス。

setlocal 
cd test 
@cd 
pushd new 
@cd 
endlocal 
@cd 
popd 
@cd 

--OUTPUT--

D:\test>setlocal 

D:\test>cd test 
D:\test\test 

D:\test\test>pushd new 
D:\test\test\new 

D:\test\test\new>endlocal 
D:\test 

D:\test>popd 
D:\test\test 
+0

@johnny - 真実ではありません(少なくとも私がテストしたところではWin 7では当てはまりません)。押されたスタックは保存されます。私の更新された答えを見てください。 – dbenham

+0

私の悪い; (私はそれが奇妙に思えたので)投稿する前にそれを何度もテストしたことを誓っていますが、私はそれらと一緒にやったときに私のテストスクリプトを削除しました。スクリプトやサブルーチン内のpopdはまだ問題になることがあります... – johnny

4
set ORIGINAL_DIR=%CD% 

REM #YOUR BATCH LOGIC HERE 

chdir /d %ORIGINAL_DIR% 
関連する問題