我在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
永远不会执行。 但是,如果我在IF
和ELSE
子句中复制该命令,那么它运行正常。 这可能是什么原因呢?
附言我试着在IF-ELSE
句中使用IF-GOTO
和GOTO
——什么都没有。看起来脚本以右括号结束,仅此而已。看起来问题出在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
)