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

Windows Batch: problem running command after IF-ELSE clause

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

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

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

P.S。我尝试在 IF-ELSE 子句中使用 IF-GOTOGOTO - 没有。看起来脚本以右括号结束,仅此而已。看起来问题出在 venv\Scripts\activate.bat。 如何解决这个问题?

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

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

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

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

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

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

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

venv\Scripts\activate.bat

这一行的意思是执行另一个批处理文件。如果您希望在执行其他批处理文件后,控制流 returns 到下面的行,那么您必须通过 call 命令将其作为 "subroutine" 执行:

call venv\Scripts\activate.bat

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