PowerShell字符串格式化:掌握基础知识

字符串类型可能是PowerShell中最流行的变量类型。我想我从来没有写过一个不包含至少一个字符串的脚本。字符串非常适合定义一组简单的字符,比如计算机名称、文本文件的路径、注册表键路径、URL等等。通过在字符串内展开变量并利用PowerShell的字符串格式化功能,你几乎可以做任何事情。

字符串通过单引号或双引号将一个或多个字符括起来进行定义,如下所示:

$Url = 'http:\\www.bing.com'
$FilePath = 'C:\thisissomefile.txt'

像这样定义字符串很简单,但很快你会发现自己需要在字符串内获取变量的值。

例如,也许你有一个带有ComputerName参数的脚本,在你的脚本中,你需要将一个标准前缀连接到它,就像下面显示的那样:SRV-

$ComputerName = 'URANUS'
$ComputerName = "SRV-$ComputerName"

现在$ComputerName变量的值是SRV-URANUS,但是将$ComputerName用双引号括起来放在字符串中只是在字符串中插入变量的一种方法。有几种不同的方法可以做到这一点。让我们看两个例子。

展开字符串

第一种方法是你可能已经熟悉的方法,称为展开字符串,或者简单地展开现有字符串中的变量。这是将变量的值显示在字符串中的最常见方法。

要做到这一点,需要将变量放在双引号括起来的字符串中。单引号不起作用,因为它们会将所有字符视为字面量。

例如,也许我需要指定文件的路径。我知道基础文件夹路径,但实际文件名还没有确定。我可以创建一个名为 $FullPath 的变量,并静态输入文件夹路径,但将文件名设为变量。

PS> $FileName = 'MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$FileName"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

如果需要在字符串内指定对象属性怎么办?这看起来有点不同。在这种情况下,我需要用括号括起属性,并在前面加上一个美元符号。这被称为子表达式运算符。这告诉 PowerShell 先展开值。

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$($File.Name)"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

展开字符串非常常见,但如果有一个更复杂的字符串怎么办?

使用 PowerShell 字符串格式运算符

确保变量值插入字符串的另一种方式是通过 PowerShell 的格式运算符 (-f)。

使用格式运算符,您不必将变量或属性放入由双引号括起的字符串中。您可以在单引号中创建一个字符串,并在外部指定将进入该字符串的变量,如下所示。

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> 'C:\Folder\subfolder\{0}' -f $File.Name
C:\Folder\subfolder\MyFile.txt

您可以看到它有完全相同的效果。尽管这次您不必使用双引号或担心用括号和另一个美元符号括起对象属性。这看起来有点更清晰,但可能更难理解。使用格式运算符会强迫您在脑海中用 {0} 替换为 $File.Name

要添加其他变量,只需通过递增标签编号并继续添加以逗号分隔的变量到格式运算符中即可。只要格式运算符的索引位置与字符串标签中的位置相匹配,您可以添加任意多个引用。

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $SubFolderName = 'folder1'
PS> 'C:\Folder\subfolder\{0}\{1}' -f $SubFolderName, $File.Name
C:\Folder\subfolder\folder1\MyFile.txt

何时使用格式运算符

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将无法正确解释文件参数。

Utility.exe -file "C:\Program Files\SomeFolder\a subfolder here"

现在假设您想在PowerShell脚本中执行此操作。如果您使用扩展字符串,它看起来可能会有点混乱,因为您必须使用反引号来转义双引号。

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
Start-Process -FilePath 'utility.exe' -Args "`"$FileName`""

现在,让我们用格式运算符来获得相同的结果。

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
$Args = '"{0}"' -f $FileName
Start-Process -FilePath 'utility.exe' -Args $Args

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子字符串:查找字符串中的字符串字符串中的PowerShell变量

Source:
https://adamtheautomator.com/powershell-string-format/