我有一个批处理文件,它调用其他批处理文件,如下所示:
e:\foo\master.bat
内容如下:
call e:\bar\run1.bat
e:\bar\run1.bat
内容如下
app1.exe
问题是当我运行master.bat
app1.exe
将不会被执行,因为它期望它在e:\foo
目录中而不是在e:\bar
目录中
答案1
您不太清楚 app1.exe 位于何处。
如果它与 run1.bat 共享文件夹,请将 run1.bat
要么
@Echo off
Pushd "%~dp0"
app1.exe
popd
或者
@Echo off
"%~dp0app1.exe"
%0
指的是当前正在运行的批处理,修饰符~dp
返回驱动器和路径(带有尾随反斜杠)。
答案2
您的问题的答案可从 Stack Overflow 上的类似问题中找到。
使用此处提到的变量,您可以更新 run1.bat 以使用以下行调用 app1.exe:%~dp0app1.exe
。(%~dp0 变量包含尾随斜杠。)这将告诉批处理文件从当前批处理文件的位置运行可执行文件。
答案3
您可以使用我的通用脚本在指定的工作目录中执行命令:
CALL :EXEC_IN e:\bar run1.bat
批处理EXEC_IN
功能是:
@ECHO OFF
:: Execute a program inside a specified working directory
:: 1. Working directory
:: 2. Full file name
:: 3+ Arguments
:EXEC_IN
SETLOCAL
:: Scan fixed positional arguments:
SET WD=%1&SHIFT
SET FL=%1&SHIFT
:: Collect all arguments into %ALL%:
:EI_AA_START
IF [%1]==[] GOTO EI_AA_END
SET ALL=%ALL%%SEP%%1
SET SEP=
SHIFT
GOTO :EI_AA_START
:EI_AA_END
:: Execute command %FL% in directory %WD% with args %ALL%:
PUSHD %WD%
CALL %FL% %ALL%
POPD
ENDLOCAL
EXIT /B
如果需要,请随意修改它以从文件路径中获取工作目录,而不是将其作为第一个参数传递:
CALL :EXEC_IN_F e:\bar\run1.bat
修改后的脚本为:
:: Execute a program with its location as working directory:
:: 1. Full path to the executable
:: 2+ Arguments
:EXEC_IN_F
SETLOCAL
:: Scan fixed positional arguments:
SET FL=%1
SET WD=%~p1
SHIFT
:: Collect all arguments into %ALL%:
:EI_AA_START
IF [%1]==[] GOTO EI_AA_END
SET ALL=%ALL%%SEP%%1
SET SEP=
SHIFT
GOTO :EI_AA_START
:EI_AA_END
:: Execute command %FL% in directory %WD% with args %ALL%:
PUSHD %WD%
CALL %FL% %ALL%
POPD
ENDLOCAL
EXIT /B