从特定目录中的特定目录开始* .exe

时间:2014-12-28 20:17:58

标签: batch-file directory exe

首先,对不起我的英语,但我尽力解释情况。我不是关于* .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,因为它也必须适用于其他人。

  • *。蝙蝠位置 - >根
  • 文件从* .bat位置开始 - >根\郎\ 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

1 个答案:

答案 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