簡體   English   中英

Windows 批處理變量不會設置

[英]Windows Batch Variables Won't Set

我想我在 Window 的批處理腳本中遇到了一個錯誤。

我無法設置擴展 if 語句中的變量。

這是我的腳本的一個孤立部分:

@echo off

set success=1
set Version=12345
set Target=Client
set Type=456
set dir=
set zip=

if "%Version%"=="" set success=0
if "%Type%"=="" set success=0

if 1==1 set test=42

if %success%==1 (
    set test2=57005
    if "%Target%"=="Client" (
        set dir=ModName v%Version%
        set zip=ModName v%Version% %Type%.zip
        echo Version: %Version%
        echo    Type: %Type%
        echo.
        echo  Target: %Target%
        echo     dir: %dir%
        echo     zip: %zip%
        echo.
        echo    test: %test%
        echo   test2: %test2%
    )
) else (
    echo Not successful.
)

這是一個全新的 cmd 實例的輸出:

C:\Users\RandomClown\Desktop>test.bat
Version: 12345
   Type: 456

 Target: Client
    dir:
    zip:

   test: 42
  test2:

您應該注意的是單行 if 語句正確設置了內容。 多行 if 將執行任何非集合的操作。 我不認為我錯過了什么。 此外,多行 if 語句正確執行了正確的行,因為else ( echo Not successful. )行沒有執行。

為什么這些行沒有執行?

你錯過了一些東西;-)

cmd解析命令時擴展變量,而不是在運行時擴展變量。 碰巧的是,在這種情況下,帶有塊( ... ) (或實際上任何塊)的iffor語句會被視為單個命令。 因此,當您在塊內設置變量嘗試在同一塊中使用它們時,變量就不再存在了——它們被替換為在塊執行之前變量具有的值。

貼一個

setlocal enabledelayedexpansion

在批處理文件的開頭並使用!zip! 而不是%zip% 有關問題的詳細討論,請參閱help set

提醒一下,ms-dos“set”命令在等號之后獲取每個字符串。 所以如果你寫

if "x"=="x" set a=foo else set a=bar
echo %a%  // output : foo else set a=bar

%a% 實際上設置為“foo else set a=bar”,而不是 foo。 所以如果一行中有多個命令,我總是使用“()”作為設置命令。

if "%1"=="" (set a=20) else (set a=%1)    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM