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