在DOS批处理中调用更改目录后如何返回原始目录?

时间:2011-08-09 00:31:45

标签: batch-file dos

我想创建一个批处理文件batch.bat,它接受​​2个必需参数:

  • %1表示相对于当前目录的路径。
  • %2代表一个flaname。

假设当前目录为father\me\

用户可以按如下方式使用此批次:

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

batch.bat的职位描述如下。

  1. 移至%1目录,
  2. 迭代*.tex目录中的所有%1文件。
  3. 在移动之前将结果保存在目录中。
  4. 以下是不完整的代码:

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

    如何在DOS批处理中调用更改目录后返回原始目录?

4 个答案:

答案 0 :(得分:46)

如果要返回原始目录,请先使用PUSHD进行更改,然后使用POPD返回。也就是说,必须使用

来移动到%1目录
PUSHD %1

而不是CD%1,并使用

实现返回
POPD

而不是CD在哪里?

如果您想在更改后访问原始目录,请将其以这种方式存储在变量中:

SET ORIGINAL=%CD%

并稍后使用%ORIGINAL%,例如:

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

答案 1 :(得分:12)

绝对是PUSHD / POPD是这样做的首选方式。但是SETLOCAL / ENDLOCAL的(未记录的?)功能可以完成同样的事情(除了SETLOCAL所做的其他事情)。

如果您在SETLOCAL之后更改目录,那么您将在ENDLOCAL时返回原始目录。

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

SETLOCAL的另一件事是 记录 - 在退出批处理或例程时,被调用的批处理或:标签例程中的任何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

我不建议使用SETLOCAL / ENDLOCAL而不是PUSHD / POPD。但这是你应该注意的行为。

对约翰尼评论的回应

当PUSHD / POPD和SETLOCAL / ENDLOCAL合并时,可能会让人感到困惑。 ENDLOCAL 清除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

答案 2 :(得分:4)

set ORIGINAL_DIR=%CD% 

REM #YOUR BATCH LOGIC HERE

chdir /d %ORIGINAL_DIR% 

答案 3 :(得分: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。