调用批处理文件并使用其自己的路径/目录运行

调用批处理文件并使用其自己的路径/目录运行

我有一个批处理文件,它调用其他批处理文件,如下所示:

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

相关内容