批次變數中的波形符號 ~ 的意思是什麼?

批次變數中的波形符號 ~ 的意思是什麼?

我從 知道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

相關內容