更改批处理文件中的当前工作目录是最佳实践吗?

Sri*_*rik 1 command batch-file working-directory

我有一个批处理文件,我在其中通过传递某些参数来调用一个应用程序。

这是我的sample.batch 文件的内容

cd C:\Program Files\MyApplication
"C:\Program Files\MyApplication\Application.exe" -e -p "Application Projects/Testing/General/Notepad" -rm "Close Notepad"
Run Code Online (Sandbox Code Playgroud)

在这里,我需要将当前工作目录更改为 Application.exe 所在的文件夹,以便它找到位于该文件夹中的某些所需的 JAR。这样做是最佳做法吗?在执行批处理文件之前更改当前工作目录。

Mag*_*goo 6

尝试

pushd C:\Program Files\MyApplication
...
popd
Run Code Online (Sandbox Code Playgroud)

作为另一种选择。

最佳实践取决于观点和环境


Mof*_*ofi 6

MagooStephan已经建议了一种方法:

pushd "%ProgramFiles%\MyApplication"

rem Other commands.

popd
Run Code Online (Sandbox Code Playgroud)

该解决方案甚至适用于默认启用命令扩展的 UNC 路径,因为PUSHD会临时将网络共享映射到驱动器号并使该网络驱动器成为当前目录。

另一种解决方案是使用SETLOCALCDENDLOCAL,其优点是环境变量的所有修改、命令扩展和延迟扩展均由命令之间的命令完成setlocal,并且endlocal与命令行之后的命令无关endlocal

setlocal EnableExtensions DisableDelayedExpansion
cd /D "%ProgramFiles%\MyApplication"

rem Other commands running in their own environment, here running with command
rem extensions explicitly enabled and delayed expansion explicitly disabled.

endlocal
Run Code Online (Sandbox Code Playgroud)

命令ENDLOCAL还会将当前目录恢复为执行SETLOCAL时设置的目录。

请参阅更改目录命令 cd ..notworking in batch file after npm install 的答案,其中包含有关PUSHD(推送目录)、POPD(弹出目录)、SETLOCAL(设置本地环境)、CD(更改目录)和ENDLOCAL (结束)的更多详细信息当地环境)。

为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • cd /?
  • endlocal /?
  • rem /?
  • setlocal /?
  • popd /?
  • pushd /?