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

xpo*_*ort 27 dos batch-file

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

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

假设当前目录是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
Run Code Online (Sandbox Code Playgroud)

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

Aac*_*ini 46

如果要返回原始目录,请先进行更改PUSHD并返回POPD.也就是说,必须使用移动到%1目录

PUSHD %1
Run Code Online (Sandbox Code Playgroud)

而不是CD%1,并且返回是通过

POPD
Run Code Online (Sandbox Code Playgroud)

而不是CD在哪里?

如果要在更改后访问原始目录,请将其存储在变量中:

SET ORIGINAL=%CD%
Run Code Online (Sandbox Code Playgroud)

并在以后使用%ORIGINAL%,例如:

dir /b *.tex > %original%\%2.txt
Run Code Online (Sandbox Code Playgroud)

  • +1:另外PUSHD用于CD到网络连接的驱动器,因为CD不允许你. (7认同)
  • 一年前,当我使用批处理,并且不得不解决网络驱动器时,该评论在哪里?如果可以的话,+ 100 (2认同)

dbe*_*ham 12

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

如果在SETLOCAL之后更改目录,则将在ENDLOCAL时返回到原始目录.

cd OriginalLocation
setlocal
cd NewLocation
endlocal
rem we are back to OriginalLocation
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

回应约翰尼的评论

当PUSHD/POPD和SETLOCAL/ENDLOCAL结合使用时会让人感到困惑.该ENDLOCAL并没有明确PUSHD栈,通过以下证明:

setlocal
cd test
@cd
pushd new
@cd
endlocal
@cd
popd
@cd
Run Code Online (Sandbox Code Playgroud)

--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
Run Code Online (Sandbox Code Playgroud)


use*_*026 5

set ORIGINAL_DIR=%CD% 

REM #YOUR BATCH LOGIC HERE

chdir /d %ORIGINAL_DIR% 
Run Code Online (Sandbox Code Playgroud)