Windows 批处理:在 IF-ELSE 子句之后运行命令时出现问题



我在Win10中遇到了一个非常奇怪的.bat脚本问题:

@ECHO OFF
IF NOT EXIST ".venv" (
ECHO | SET /p msg="Creating virtual environment..."
python -m venv venv
ECHO OK
venvScriptsactivate.bat
python -m pip install --upgrade pip setuptools
pip install -r requirements.txt
) ELSE (
venvScriptsactivate.bat
)
python runner.py

最后一个命令python runner.py永远不会执行。 但是,如果我在IFELSE子句中复制该命令,那么它运行正常。 这可能是什么原因呢?

附言我试着在IF-ELSE句中使用IF-GOTOGOTO——什么都没有。看起来脚本以右括号结束,仅此而已。看起来问题出在venvScriptsactivate.bat. 如何解决此问题?

原因是这些行,你在"then"和"else"部分都有:

venvScriptsactivate.bat

此行表示执行另一个批处理文件。如果您希望在执行其他批处理文件后,控制流返回到下面的行,则必须通过call命令将其作为"子例程"执行:

call venvScriptsactivate.bat

否则,当另一个批处理文件结束时 (activate.bat(,该过程将在该点结束。

默认情况下,控件不会返回到父脚本,因此当您从批处理文件内部运行第二个脚本时,父脚本将有效地终止。

可以使用call命令在子进程中运行第二个脚本。这样,一旦第二个脚本完成,流将返回到父脚本。

@ECHO OFF
IF NOT EXIST ".venv" (
ECHO | SET /p msg="Creating virtual environment..."
python -m venv venv
ECHO OK
call venvScriptsactivate.bat
python -m pip install --upgrade pip setuptools
pip install -r requirements.txt
) ELSE (
venvScriptsactivate.bat
)
python runner.py

可能与virtualenv的激活脚本所做的一些魔术有关,例如创建一个新的shell,这样你的主脚本就不会继续。

不确定这是否有效,但在类似的脚本中,我可以通过执行与 & 连接的下一个命令来使其工作,您可以尝试这样的事情:

@ECHO OFF
IF NOT EXIST ".venv" (
ECHO | SET /p msg="Creating virtual environment..."
python -m venv venv
ECHO OK
venvScriptsactivate.bat & (python -m pip install --upgrade pip setuptools && pip install -r requirements.txt && python runner.py)
) ELSE (
venvScriptsactivate.bat & python runner.py
)

最新更新