我想创建一个批处理文件batch.bat,它接受2个必需参数:
%1 表示相对于当前目录的路径.%2 代表一个flaname.假设当前目录是father\me\.
用户可以按如下方式使用此批次:
batch child/grandchild logbatch ../brother log职位描述batch.bat如下.
%1目录,*.tex目录中的所有文件%1.以下是不完整的代码:
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)
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)
set ORIGINAL_DIR=%CD%
REM #YOUR BATCH LOGIC HERE
chdir /d %ORIGINAL_DIR%
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22345 次 |
| 最近记录: |