首先,对不起我的英语,但我尽力解释情况。我不是关于* .bat文件的专家,但我知道用它运行exe文件的基础知识。
蝙蝠脚本:
setlocal
cd "%~dp0"
start "" "%~dp0\Lang\Language.exe"
我需要在“%~dp0”(root)中启动“Language.exe”,其中保存* .bat。我在stackoverflow上阅读了许多不同的问题/答案,但都没有奏效。 “Language.exe”保存在“%~dp0 \ Lang”中,但需要在“%~dp0”中运行,否则无效。
* .exe只能从root(%~dp0)开始工作,而不是其他地方。并且不能有任何真正的文件夹结构,如C:\ root \ Lang \ Language.exe,因为它也必须适用于其他人。
“Language.exe”使用diff-patch将语言转换为其他语言。我的意思是* .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
答案 0 :(得分:0)
您可能会遇到In Batch file ~dp0 changes on changing directory讨论的问题。
我能想到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
如果具有批处理文件的文件夹不在具有驱动器号的驱动器上,而是在公共网络共享上,则使用 推送和 popd 。通过在命令提示符窗口pushd /?
和popd /?
中运行来阅读 pushd 和 popd 输出的帮助,以获取有关这2个命令的详细信息。
但如果Language.exe
没有在当前工作目录中搜索要修补的文件,而是在其自己的应用程序目录中,则上述所有变体都无济于事。
例如,如果使用Qt编写Language.exe
并在静态函数QCoreApplication::applicationDirPath()内使用而不是在当前工作目录中搜索文件,即使用QDir::currentPath()分别搜索文件路径,而不是先改变工作目录。
或者,如果使用.Net编写Language.exe
,并且应用程序目录与How can I get the application's path in a .NET console application?中解释的方法之一一起使用,而不是使用当前工作目录。
在这种情况下,最好的解决方案是将Language.exe
复制到包含要修补的文件的目录中,并在修补完所有文件后终止自身后删除可执行文件。
setlocal EnableExtensions
pushd "%~dp0"
copy /Y Lang\Language.exe .>nul
echo Starting patch...
Language.exe
del Language.exe
popd
endlocal