字串型別可能是PowerShell中最流行的變數類型。我想我從來沒有寫過一個不包含至少一個字串的腳本。字串非常適合定義一組簡單的字符,比如計算機名稱、文本文件的路徑、註冊表鍵路徑、URL等等。通過在字串內擴展變數並使用PowerShell的字串格式能力,你可以做任何事情。
字串是通過將一個或多個字符括在單引號或雙引號內定義的,例如:
這樣定義字串是直截了當的,但是很快你會發現自己需要在字串內獲取變數的值。
例如,也許你有一個帶有ComputerName
參數的腳本,在腳本中,你需要將一個標準前綴連接到它,如下所示:
現在$ComputerName
變數的值是SRV-URANUS,但是將$ComputerName
用雙引號括起來放在字串內只是插入變數到字串的一種方式。有幾種不同的方法可以實現這一點。讓我們看兩個例子。
擴展字串
第一種方法可能是你已經熟悉的方法,稱為擴展字串,或者簡單地在現有字串中擴展變數。這是將變數的值顯示在字串中的最常見方式。
要做到這一點,需要將變數放在雙引號內的字串中。單引號將不起作用,因為它們對待所有字符都是文字字元。
例如,也許我需要指定文件的路徑。我知道基礎文件夾路徑,但還不知道實際的文件名。我可能會創建一個名為$FullPath
的變量,並靜態輸入文件夾路徑,但使文件名成為一個變量。
如果你需要在字符串內指定對象屬性呢?這看起來有點不同。在這種情況下,我需要用括號包圍屬性,並在前面加上一個美元符號。這被稱為子表達式運算符。這告訴 PowerShell 首先展開值。
展開字符串是非常常見的,但如果你有一個更複雜的字符串呢?
使用 PowerShell 字符串格式運算符
確保變量值插入到字符串中的另一種方法是通過 PowerShell 的格式運算符(-f
)。
使用格式運算符,你不必將變量或屬性放在用雙引號括起來的字符串內。你可以在單引號中創建一個字符串,並在外部指定將進入該字符串的變量,如下所示。
你可以看到它具有完全相同的效果。雖然這一次你不必使用雙引號或擔心將對象屬性括在括號內和另一個美元符號。看起來更加清潔,但可能更難理解。使用格式運算符強迫你在腦海中將{0}
替換為$File.Name
。
要添加其他變量,只需將標籤按1增加,並繼續以逗號分隔的形式將變量添加到格式運算符中。只要格式運算符的索引位置與字符串標籤中的位置相匹配,您可以添加任意多的引用。
何時使用格式運算符
I usually prefer to place variables inside of the string and expand them because I don’t have to match an index with a value. However, there are exceptions, as in the case of special characters that must be escaped.
例如,假設您需要執行一個命令行實用程序,該實用程序要求您將文件名傳遞給它。這個文件路徑可能包含空格,所以您需要用雙引號括起該引用。如果沒有這些雙引號,utility.exe 將無法正確解釋文件參數。
現在假設您想在 PowerShell 腳本中執行此操作。如果您使用展開字符串,它看起來會有點混亂,因為您必須使用反引號來轉義雙引號。
現在,讓我們使用格式運算符獲得相同的結果。
I don’t have to use any escape characters. This may seem like a simple example but as soon as you come across large strings that require a lot of escaping you will soon see the real benefit of using the format operator!
摘要
下一次當您發現自己必須在字符串中替換變量時,請考慮哪種方法最易讀。這將為您節省長遠的時間。
有關使用字符串的更多文章,請務必查看PowerShell Substring: 在字符串中查找字符串和字符串中的 PowerShell 變量。
Source:
https://adamtheautomator.com/powershell-string-format/