2017-05-02 50 views
1

當我在.BAT文件IF語句中使用:子句延遲擴展環境變量時,該行無法解析/執行。使用%符號而不是!爲擴展工程。相同的延遲擴展在其他地方起作用,例如ECHO聲明。例如:bat文件enabledelayedexpansion不會在IF語句中擴展

@echo off& setlocal enabledelayedexpansion 
set t=abcd 
echo !t:~0,2! 
if %t:~0,2% == ab echo equal 
if !t:~0,2! == ab echo equal 

回聲T:!〜0,2!正確生產:AB

如果%T:〜0.2%== AB回聲等於正確生產:等於

如果T:〜0,2! == ab回聲等於發出錯誤:2!在這個時候出乎意料的是

我不明白爲什麼我不能在IF語句中使用延遲擴展和:子句。沒有冒號子句,IF語句內的延遲擴展就可以正常工作。

回答

2

問題不在於延遲擴展本身,而在於內部的逗號。
這是因爲批解析器擴展延遲擴展表達式比擴展百分比晚。
因此,IF解析器看到!t:~0,2!並將逗號作爲分隔符。

你可以通過使用引號來避免這種情況。
或者轉義逗號。

if "!t:~0,2!" == "ab" echo equal 
if !t:~0^,2! == ab echo equal 

您可以在SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+0

瞭解不同批次分析器階段的順序欣賞它 - 這解決了我的問題,因爲我是用在這種情況下,字符串處理。仍然可以在數字中頻比較中遇到麻煩,例如設置n = 123&if!n:〜1,2! gtr 5 - 不能將引號括在引號中,因爲這會強制字符串比較。事先使用一個集合並從if語句中刪除延遲擴展修復了這個問題。 –

+1

@PaulH你也可以用逗號移開逗號 – jeb