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