我從 知道call /?
,~
in 變數(例如%~d1
)用於解析文件路徑的一部分(此處為驅動程式),但波浪號在此處的另一個上下文中使用:https://www.tutorialspoint.com/batch_script/batch_script_string_length.htm:
@echo off
set str = Hello World
call :strLen str strlen
echo String is %strlen% characters long
exit /b
:strLen
setlocal enabledelayedexpansion
:strLen_Loop
if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof
這裡,這個變數擴展的意義是什麼:"!%1:~%len%!"
?它如何透過與空字串比較來計算字串的長度?這裡波浪號的目的是什麼?此外,這個例子將使我進入無限循環,其中輸出是if not "!str:~136!" == "" set /A len+=1 & goto :strLen_Loop
(數字!str:~n
增長的地方)。
答案1
波形符 (~) 符號在批次檔中以不同的方式使用:
參數引用刪除。命令列參數前的波形符號(例如“%~1”)表示從參數中刪除周圍的引號。例如,如果 %1 的值為“Hi”,則 %~1 將擴展為僅 Hi。
子字串處理。有一種方法可以從批次檔中的字串變數中提取子字串。語法是:
%variable:~num_chars_skip,num_chars_keep%
.跳過字元數意味著字串中的起始點,或排除字串變數之前的字元數。 num chars to keep 表示起始點之後的字元數。要保留的字元數是可選的,但首先是強制性的。如果未指定 num chars to keep ,則僅解析 num chars to keep 的字元。
您應該在命令提示字元中閱讀這些內容以獲得更多幫助:
call /?
for /?
set /?
希望有幫助
答案2
嘗試set /?
:
...
環境變數替換已增強如下:%PATH:str1=str2%
將擴展 PATH 環境變量,將擴展結果中每次出現的“str1”替換為“str2”。 「str2」可以是空字串,以有效地從擴充輸出中刪除所有出現的「str1」。 「str1」可以以星號開頭,在這種情況下,它將匹配從擴展輸出的開頭到 str1 剩餘部分第一次出現的所有內容。
也可以指定擴充的子字串。
%PATH:~10,5%
將擴展 PATH 環境變量,然後僅使用從擴展結果的第 11 個(偏移量 10)字元開始的 5 個字元。如果未指定長度,則預設為變數值的其餘部分。如果任一數字(偏移量或長度)為負數,則使用的數字是環境變數值的長度加上指定的偏移量或長度。
%PATH:~-10%
將提取 PATH 變數的最後 10 個字元。
%PATH:~0,-2%
將擷取 PATH 變數除最後 2 個字元之外的所有字元。
…
這行為非常有用,但是描述關於負數既令人困惑又不準確。第一個數字(偏移量)是正確的:%VAR:~N%
從末尾減號N
字元開始。當使用負數時第二數字,它不再是子串長度,但解釋為在結束之前停止多少個字符價值,無論其長度如何。因此%VAR:~1,-1%
給出除第一個和最後一個字元之外的值,並%VAR:~-2,-1%
給出%VAR:~-2,1%
倒數第二個字元。
答案3
- 為了「修復」本教學程式碼並防止無限循環,請在評論中引用:
我明白了,但是在我的機器中我需要 ^C 來終止它。看看我得到了多大的數字 - 136 - 即使沒有包含 136 個字元的長度或單字- @牧人
@echo off && setlocal enabledelayedexpansion
set "_str=Hello World" & call :strLen_Loop str
:strLen_Loop
if "%~1" == "" (
endlocal & goto :EOF
) else if not "!_%~1:~%_len%!" == "" (
set /A "_len+=1" & goto=:strLen_Loop
) else echo\String is !_len! characters long & exit /b