Windows Batch:IF-ELSE子句后运行命令时出现问题

时间:2018-10-09 19:06:19

标签: windows batch-file python-venv

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

func hereEncodeNumber(_ value: Double) -> [Character] {

    let ENCODING_CHARS : [Character] = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","-","_"]
    var result : [Character] = []

    // Convert value to fixed point
    let fixedPoint = (value * 100000).rounded(.toNearestOrAwayFromZero)

    // Convert fixed point to binary
    var binaryNum = Int32(exactly: fixedPoint)!

    // Make room on lowest bit
    binaryNum = binaryNum << 1

    // Flip bits of negative numbers and ensure that  last bit is set
    // (should actually always be case, but for readability it is ok to do it explicitly)
    if binaryNum < 0 {
        binaryNum = ~(binaryNum) | 0x01
    }

    // Var-length encode number in chunks of 5 bits starting with least significant
    // to most significant
    while binaryNum > 0x1F {
        result.append(ENCODING_CHARS[Int((binaryNum & 0x1F) | 0x20)])
        binaryNum >>= 5
    }
    result.append(ENCODING_CHARS[Int(binaryNum)])
    return result
}

最后一条命令@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.pyIF子句中复制了该命令,则该命令运行正常。 可能是什么原因?

P.S。我尝试在ELSE子句中使用IF-GOTOGOTO -什么也没有。看起来脚本以括号括起来,仅此而已。看来问题出在IF-ELSE中。 如何解决此问题?

3 个答案:

答案 0 :(得分:2)

原因是您在“然后”和“其他”部分中都有这些行:

venv\Scripts\activate.bat

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

call venv\Scripts\activate.bat

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

答案 1 :(得分:1)

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

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

@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

答案 2 :(得分:0)

可能与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
)