我想创建一个批处理文件batch.bat
,它接受2个必需参数:
%1
表示相对于当前目录的路径。%2
代表一个flaname。假设当前目录为father\me\
。
用户可以按如下方式使用此批次:
batch child/grandchild log
batch ../brother log
batch.bat
的职位描述如下。
%1
目录,*.tex
目录中的所有%1
文件。以下是不完整的代码:
rem batch.bat takes 2 arguments.
cd %1
dir /b *.tex > <original directory>\%2.txt
如何在DOS批处理中调用更改目录后返回原始目录?
答案 0 :(得分:46)
如果要返回原始目录,请先使用PUSHD
进行更改,然后使用POPD
返回。也就是说,必须使用
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。