首先,抱歉我的英语不好,但我会尽力解释情况。我对 *.bat 文件不是真正的专家,但我知道用它运行 exe 文件的基础知识。
bat 脚本:
setlocal
cd "%~dp0"
start "" "%~dp0\Lang\Language.exe"
我需要在“%~dp0”(root)中启动“Language.exe”,其中保存了*.bat。我在 stackoverflow 上读到了很多不同的问题/答案,但没有一个有效。 “Language.exe”保存在“%~dp0\Lang”中,但需要在“%~dp0”中运行,否则无法运行。
*.exe 只能从 root (%~dp0) 运行,不能在其他地方运行。并且不能有像 C: 这样的真正的文件夹结构。 oot\Lang\Language.exe,因为它也必须对其他人有效。
“Language.exe”使用差异补丁将一种语言转换为其他语言。我的意思是 *.bat 启动 *.exe(还有我尝试过的其他命令变体),但它说它找不到要修补的文件。是的,因为所谓的工作目录不正确(需要是“root”)。但是,在不移动 *.exe 或任何其他内容的情况下,它只能从“root\Lang\Language.exe”在“root”中启动,没有别的。
编辑: 作为解决方法,我现在只需移动“Language.exe”,启动它然后将其移回。
setlocal
cd "%~dp0"
move "Lang\Language.exe" "%~dp0" >nul
ECHO Starting patch...
timeout /t 1 >nul
start "" /wait "Language.exe"
move "%~dp0\Language.exe" "Lang" >nul
您可能会遇到在批处理文件中 ~dp0 在更改目录时发生更改中讨论的问题。
我能想到3个解决方案。
解决方案1:
cd /D "%~dp0"
start "Language Patch" Lang\Language.exe
首先更改工作目录,然后使用相对路径调用 EXE。如果启动时的当前工作目录与批处理文件的位置位于不同的驱动器上,则需要参数
/D
。
解决方案2:
setlocal
set "BatchPath=%~dp0"
cd /D "%BatchPath%"
start "Language Patch" "%BatchPath%Lang\Language.exe"
endlocal
首先将包含批处理文件的文件夹的路径分配给环境变量。该路径以反斜杠结束。因此,可以在
Lang
之前调用 EXE,而无需使用反斜杠。
解决方案3:
setlocal EnableExtensions
pushd "%~dp0"
start "Language Patch" Lang\Language.exe
popd
endlocal
push 和 popd 用于包含批处理文件的文件夹不在具有驱动器号的驱动器上,而是在公共网络共享上的情况。通过在命令提示符窗口中运行来阅读 pushd 和 popd 输出的帮助
pushd /?
和 popd /?
有关这 2 个命令的详细信息。
但是,如果
Language.exe
不在当前工作目录中搜索要修补的文件,而是在其自己的应用程序目录中搜索文件,则上述所有这些变体都没有帮助。
例如,如果
Language.exe
是使用 Qt 编写的,并在静态函数 QCoreApplication::applicationDirPath() 中使用,而不是搜索当前工作目录中的文件,即使用 QDir::currentPath() 分别搜索没有路径且无需先更改工作目录的文件。
或者,如果
Language.exe
是使用 .Net 编写的,并且应用程序目录与如何在 .NET 控制台应用程序中获取应用程序的路径?中解释的方法之一一起使用,而不是使用当前工作目录。
在这种情况下,最好的解决方案是将
Language.exe
复制到包含要修补的文件的目录中,并在修补所有文件后自行终止后删除可执行文件。
setlocal EnableExtensions
pushd "%~dp0"
copy /Y Lang\Language.exe .>nul
echo Starting patch...
Language.exe
del Language.exe
popd
endlocal
我需要在 Windows 11 中创建一个批处理文件来执行以下操作
任何帮助将不胜感激。 谢谢。