web-dev-qa-db-ja.com

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

2つの必須引数を受け入れるバッチファイルbatch.batを作成します。

  • %1は、現在のディレクトリからの相対パスを表します。
  • %2は、フィラネームを表します。

現在のディレクトリがfather\me\であると想定します。

ユーザーはこのバッチを次のように使用できます。

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

batch.batの業務内容は以下の通りです。

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

以下は不完全なコードです:

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

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

28
xport

元のディレクトリに戻る場合は、PUSHDで最初の変更を行い、POPDで戻ります。つまり、%1ディレクトリへの移動は、

PUSHD %1

cD%1の代わりに、リターンは

POPD

cDの代わりに?

変更後に元のディレクトリにアクセスする場合は、次の方法で変数に保存します。

SET ORIGINAL=%CD%

後で%ORIGINAL%を使用します。次に例を示します。

dir /b *.tex > %original%\%2.txt
46
Aacini

間違いなくPUSHD/POPDはこれを行うための好ましい方法です。しかし、SETLOCAL/ENDLOCALの(文書化されていない?)機能があり、(他のSETLOCALが行うことに加えて)同じことを実行します。

SETLOCALの後でディレクトリを変更した場合、ENDLOCALで元のディレクトリに戻ります。

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

isが文書化されているSETLOCALの他の1つ-呼び出されたバッチまたは:labelルーチン内の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を組み合わせると混乱する可能性があります。 ENDLOCALはnotを実行して、次のようにPUSHDスタックをクリアします。

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

- 出力 -

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
12
dbenham
set ORIGINAL_DIR=%CD% 

REM #YOUR BATCH LOGIC HERE

chdir /d %ORIGINAL_DIR% 
4
user648026

ディレクトリを変更する前に、常に%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であれば、優れたソリューションです。

1
Mechaflash