
批處理字符串替換與截取中的通配符與未定義首先為了避免可能會有的麻煩,我要表示我搜索過了。①字符串替換中的通配符問題,我在發帖前搜到了同樣結論http://www.bathome.net/viewthrea ... =%CD%A8%C5%E4%B7%FB不過還是提一下:【字符串替換中,星號只有出現在冒號右方第一位時才充當通配符。】并給出一些經驗補充。
②字符串替換與截取中的未定義問題這個我沒搜到。第一次發現這個問題是在自己寫的加法函數里的“set c1=%c1:~0,9%&set c2=%c2:~0,9%”先提下解決辦法,開變量延遲用!!請測試以下代碼(理解的話推薦直接看注釋):nclick="copycode($('code0'));">復制代碼
- rem 有個指令會導致閃退,最好Win+R 輸入cmd 將Bat拖入運行。 或者就看注釋好啦。
- @echo off&setlocal enabledelayedexpansion
- set a=123*4?56
- echo %a:*4=%
- rem 結果為?56
- echo %a:3*=%
- rem 結果為124?56
- echo %a:?2=%
- echo 沒有改變,依舊是123*4?56。即?不會充當通配符。
- echo %a:**=%
- echo 顯示的是4?56。第一個*是通配符,第二個是普通字符。這是我用來檢測星號的辦法。
- echo %a:*=%
- echo 閃退了,用cmd打開則顯示“此時不應有 =%”。這個似乎與一會要談的“未定義吞噬”有些原理相似。即想只去掉*是不能這樣寫的。事實上我也不知道怎樣才能只去掉*。在*前添轉義字符^的話,不會閃退了,但是不會做任何改變。【愿聞解法】
- echo !a:*=!
- rem 結果是a:*=。和用%比好處就是不閃退了。雖然這結果好像沒什么用,但可能可以試著利用。
- pause
如何解決呢?分行寫或用!!。我推薦后者。但因為會把未定義的那個變量各種亂改,所以建議可能遇到這種情況時,最好做手防備,比如if definednclick="copycode($('code1'));">復制代碼
- @echo off&setlocal enabledelayedexpansion
- set b=1234
- echo %a:~9%??%b:~1%
- rem 結果不是??234,也不是~9??234,也不是a:~9??234. 是~9b:~1。 是啊,?沒了,b也沒動。
- rem 另外為了證明不是逗號的鍋,我這里沒有用:~0,9
- echo !a:~9!??%b:~1%
- rem 結果是~9??234。至少在意料之中了。
- echo %a:~9%%結果是~9。意料之中對吧?那我們要是手動把這個變量擴充開呢?%
- echo ~9??%b:~1%
- rem 結果是~9??234。和用%的那句比起來,算正常了。但更讓人摸不著頭腦了。
- rem 看看字符串替換的情況。其實差不多。
- echo %a:9=%??%b:4=%
- rem 結果是9=b:4=。很熟悉啊,?沒了b也陪葬了……后面的結果類似,就不再多舉例了。
- pause

