当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

作者:精品下载站 日期:2024-12-14 13:01:05 浏览:11 分类:玩电脑

连接、展开、格式化以及所有 PowerShell 字符串


PowerShell 中的字符串可能是 PowerShell 中最常用的数据类型。从显示消息、提示输入或将数据发送到文件,几乎不可能编写不涉及字符串的脚本。

在本文中,您将了解到字符串不仅仅用于读取和显示。还可以对它们进行操作以适应您可能为其编写脚本的任何任务的目的。例如,替换字符或整个单词、连接字符串以形成新字符串,甚至将一个字符串拆分为多个字符串。

理解字符串

根据 .NET 对字符串的定义 - “字符串是用于表示文本的字符的顺序集合”。总而言之,只要存在形成文本的字符序列,就有一个细绳。

在 PowerShell 中定义系统字符串

字符串是通过将一系列字符括在单引号或双引号中来定义的。下面是字符串的示例。

PS> 'Hello PowerShell - Today is $(Get-Date)'PS> "Hello PowerShell - Today is $(Get-Date)"

字符串实际上是.NET 中的System.String。

从上面的示例中可以看到,第一个字符串用单引号括起来,第二个字符串用双引号括起来。如果您想知道,两者之间的唯一区别是双引号中的字符串支持字符串扩展,而单引号仅表示文字字符串。

要确认单引号与双引号的概念,请在 PowerShell 中粘贴上面示例中的两个字符串。

下面的屏幕截图显示单引号字符串返回定义的确切文字字符串。双引号字符串返回带有 Get-Date cmdlet 的表达式结果的字符串。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

上面显示的结果展示了定义字符串时何时适合使用单引号或双引号的区别。

字符串对象

如上一节所述,形成文本的字符集合是字符串。字符串的结果值是 String 对象。 String 对象是 [System.String] 类型的 .NET 对象。

由于 System.String 是一个对象,因此它具有可以使用 Get-Member cmdlet 访问的属性。下面我们在带有双引号的字符串中插入一个变量。

PS> "Hello PowerShell - Today is $(Get-Date)" | Get-Member=

下面的屏幕截图显示了 String 对象的 TypeName 和部分属性列表。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

连接 PowerShell 字符串

字符串连接被描述为将两个或多个字符串连接在一起,本质上是从多个单独的字符串对象创建一个字符串对象。 PowerShell 中有多种连接字符串的方法。每种方法都是不同的,使用哪一种方法取决于您计划如何实现字符串连接。

在现实世界中使用字符串连接的一个典型示例是 Active Directory 用户创建。也许您正在创建一个用户创建脚本,该脚本从列表中获取名字姓氏部门值。

使用字符串连接,您可以制定名称、显示名称、用户名和电子邮件地址的标准命名约定。在此示例中,您将使用如下所示的字符串。复制下面的代码并将其粘贴到您的 PowerShell 会话中。

$domain = 'contoso.com'
$firstname = 'Jack'
$lastname = 'Ripper'
$department = 'Health'

使用上面的示例变量值,目标是通过将字符串连接在一起来导出下面列出的以下值。

  • 姓名=名字姓氏
  • DisplayName=名字姓氏(部门)
  • SamAccountName=名字.姓氏
  • EmailAddress=[电子邮件受保护]

在接下来的部分中,将使用 PowerShell 中提供的不同字符串连接方法创建上面列出的值。

让我们开始!

使用 PowerShell 字符串连接运算符

编程语言有自己的字符串连接运算符,用于连接字符串。例如,在 Visual Basic 中,串联方法是与符号 (&)。 PowerShell 也有自己的串联方法,即加号 (+)。

使用字符串连接运算符,您可以使用以下代码连接字符串。

## Name
$firstname + ' ' + $lastname
## DisplayName
$firstname + ' ' + $lastname + ' (' + $department + ')'
## SamAccountName
$firstname + '.' + $lastname
## Email Address
$firstname + '.' + $lastname + '@' + $domain

使用 PowerShell 字符串扩展

使用字符串扩展可能是连接字符串时代码最短的方法。您将从下面的代码中看到,所需要做的就是按应出现的方式排列字符串并将它们括在双引号内。

# Using String Expansion
## Name
"$firstname $lastname"
## DisplayName
"$firstname $lastname ($department)"
## SamAccountName
"$firstname.$lastname"
## Email Address
"$firstname.$lastname@$domain"

然后,PowerShell 解释并处理双引号字符串内的字符串扩展,以输出连接的字符串作为结果。您可以参考下面的示例输出。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

使用 PowerShell 格式运算符

格式运算符 (-f) 主要用于复合格式。重要的是要记住,在这种方法中,使用 -f 分为三个部分。

参考下面代码的第三行。 “{0} {1}” 表示格式和占位符。大括号中的数字表示集合中要在其位置显示的字符串的索引。引号可以是单引号或双引号。

本例中输入的字符串集合由$firstname,$lastname 表示。这意味着 $firstname 变量的索引为 0,而 $lastname 为 1。

最后,-f 是占位符和由 (-f) 表示的字符串集合之间的位置。

## Name
"{0} {1}" -f $firstname,$lastname
## DisplayName
"{0} {1} ({2})" -f $firstname,$lastname,$department
## SamAccountName
"{0}.{1}" -f $firstname,$lastname
## Email Address
"{0}.{1}@{2}" -f $firstname,$lastname,$domain

上面的代码将产生如下所示的结果。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

使用 PowerShell -Join 运算符

-Join 运算符可用于通过两种方式将字符串连接成单个字符串。

使用 -Join 的第一种方法是在其后面添加要连接的字符串数组。 -Join 运算符不提供添加分隔符的选项。数组中的所有字符串都将粘合在一起,中间没有任何内容。

-Join <String[]>

使用 -Join 运算符的第二种方法是指定要使用的分隔符。字符串数组将连接在一起,但指定的分隔符将插入每个字符串之间。

<String[]> -Join <Delimiter>

回到连接字符串的目标,下面的代码演示了如何使用 -Join 运算符将字符串组合在一起。

## Name
$firstname, $lastname -join ' '
## DisplayName
$firstname,$lastname,"($department)" -join ' '
## SamAccountName
-join ($firstname,'.',$lastname)
## Email Address
-join ($firstname,'.',$lastname,'@',$domain)

当您在 PowerShell 中运行上面的示例代码时,您可能会看到与下图类似的输出。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

.NET String.Format() 方法

.NET String.Format 方法PowerShell Format Operator 的 .NET 对应项。它的操作与格式运算符相同,需要指定格式和占位符。

## Name
[string]::Format("{0} {1}",$firstname,$lastname)
## DisplayName
[string]::Format("{0} {1} ({2})",$firstname,$lastname,$department)
## SamAccountName
[string]::Format("{0}.{1}",$firstname,$lastname)
## Email Address
[string]::Format("{0}.{1}@{2}",$firstname,$lastname,$domain)

下面的屏幕截图显示了正在运行的String.Format 方法

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

.NET String.Concat() 方法

连接字符串的另一种方法是使用.Net String.Concat Method。 .NET String.Concat 方法是 PowerShell 字符串连接运算符 (+) 的 .NET 对应方法。但是,您可以在方法中添加所有字符串,而不是使用 + 号来连接字符串,如下所示 - [string]::Concat(string1,string2...)

## Name
[string]::Concat($firstname,' ',$lastname)
## DisplayName
[string]::Concat($firstname,' ',$lastname,' (',$department,')')
## SamAccountName
[string]::Concat($firstname,'.',$lastname)
## Email Address
[string]::Concat($firstname,'.',$lastname,'@',$domain)

下面的屏幕截图演示了调用 .NET String.Concat 方法的结果。可以看到PowerShell已经合并了string1、string2。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

.NET String.Join() 方法

.NET String.Join 方法是 PowerShell Join Operator (-join) 的 .NET 方法对应项。此方法的格式为 [string]::Join(,,,...)

-Join 方法中的第一项始终是分隔符。然后,后续的项值就是您要连接的字符串。请参阅下面的示例代码。请记住,第一项始终是分隔符。如果不想添加分隔符,可以指定 —> ''

## Name
[string]::Join(' ',$firstname,$lastname)
## DisplayName
[string]::Join(' ',$firstname,$lastname,"($department)")
## SamAccountName
[string]::Join('',$firstname,'.',$lastname)
## Email Address
[string]::Join('',$firstname,'.',$lastname,'@',$domain)

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

拆分 PowerShell 字符串

您在上一节中已经看到了连接字符串的几种不同方法。在本节中,您将了解使用 PowerShell 拆分字符串的不同方法。分割字符串是连接的逆操作。

您可以通过两种不同的方式在 PowerShell 中拆分字符串 - split() 函数/方法或 split 运算符。

使用 Split() 方法拆分字符串

如果您正在寻找一种简单的方法来分割字符串以创建数组,那么 split() 方法就是最好的选择。 split() 方法适用于每个字符串对象,并且能够根据非正则表达式字符将字符串拆分为数组。

例如,如果您有一个像 green|eggs|and|ham 这样的字符串,并且您想要创建一个像 @('green','eggs','and', 'ham'),您可以在管道符号 (|) 上拆分此字符串,如以下代码片段所示。

$string = 'green|eggs|and|ham'
$string.split('|')

然后,您将看到 PowerShell 使用管道符号分割所需数组中的字符串。

split() 方法是一种分割字符串的简单方法,但有其局限性。 split() 方法不允许通过正则表达式拆分字符串。如果您需要更高级的功能来拆分字符串,则需要了解 split 运算符。

-split 运算符

可用于在 PowerShell 中拆分字符串的主要运算符是 -Split 运算符。使用 -Split 运算符,默认情况下,字符串会在空格之间或使用特定的分隔字符进行分割。

以下是 -Split 运算符语法供您参考。请记住注意一元分割和二进制分割之间的区别。

# Unary Split
-Split <String>
-Split (<String[]>)

# Binary Split
<String> -Split <Delimiter>[,<Max-substrings>[,"<Options>"]]
<String> -Split {<ScriptBlock>} [,<Max-substrings>]

在此示例中,$string 变量保存单行字符串的值。然后,使用 -Split 运算符,单行字符串将被拆分为 PowerShell 字符串数组。生成的分割字符串将保存到 $split 变量中。

## Splitting Strings into Substrings
# Assign a string value to the $string variable
$string = 'This sentence will be split between whitespaces'
# Split the value of the $string and store the result to the $split variable
$split = -split $string
# Get the count of the resulting substrings
$split.Count
# Show the resulting substrings
$split

从上面的结果可以看出,原本是单个字符串被分割成了7个子字符串。它演示了 PowerShell 如何将字符串拆分为数组。

字符分隔符

在前面的示例中,即使不指定分隔符,-Split 运算符也会将单个字符串对象拆分为多个子字符串;这是因为 -Split 运算符的默认分隔符是空格。但是,分隔符也可以是字符、字符串、模式或脚本块。

在此示例中,使用的分隔符是分号 ;

## Splitting Strings into Substrings with Delimiter
# Assign a string value to the $string variable
$string = 'This;sentence;will;be;split;between;semicolons'
# Split the value of the $string and store the result to the $split variable
$split = $string -split ";"
# Get the count of the resulting substrings
$split.Count
# Show the resulting substrings
$split

当您在 PowerShell 中测试上述代码时,您将得到以下结果。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

您从上面的输出中注意到,结果子字符串中完全省略了分隔符。

如果由于某种原因需要保留分隔符,则可以通过将字符括在括号中来保留分隔符。

$split = $string -split "(;)"
$split.Count
$split

修改分割分隔符后,如上所示,运行它会产生如下所示的输出。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

上面的结果表明分隔符没有被省略,并且被计入结果子字符串中。

字符串分隔符

字符串也可以被另一个字符串作为分隔符分割。在此示例中,字符串“day”用作分隔符。

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split "day"

脚本块分隔符

作为分隔符的 scriptBlock 使 -Split 运算符能够执行自定义或复杂的字符串分割。

在前面的示例中,分隔符或字符串用于分割字符串。通过使用脚本块,您可以创建一个有效使用多个分隔符的表达式。

下面的示例使用表达式 {$PSItem -eq 'e' -or $PSItem -eq 'y'} 这意味着如果传入字符为 'e',则字符串将被分割'a'

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split {$PSItem -eq 'e' -or $PSItem -eq 'y'}

当您运行上面的命令时,输出将是用脚本块表达式中指定的分隔符分隔的子字符串。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

下一个示例使用脚本块做了更多的事情。这次,表达式评估是否:

  • 传入的字符作为整数传递;和
  • 其值大于1

如果评估结果为 true,则 -Split 运算符将使用该字符作为分隔符。此外,还添加了错误处理以确保错误被过滤掉。

$daysOfTheWeek= 'monday1tuesday2wednesday3thursday1friday4saturday8sunday'
$daysOfTheWeek -split {
    try {
        [int]$PSItem -gt 1
    }
    catch {
        #DO NOTHING
    }
}

运行上面所示的代码后,预期字符串将在字符值可以转换为大于 1 的整数的位置进行分割。下面显示了预期的输出。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

正则表达式分隔符

默认情况下,-Split 运算符使用与指定分隔符匹配的 RegEx。这意味着您还可以使用 RegEx 作为分割字符串的分隔符。

在下一个示例中,字符串包含单词字符和非单词字符。目标是将字符串与任何非单词字符分开。在正则表达式中,非单词字符由 \W 表示,而与这些字符匹配的单词字符 - [a-zA-Z0-9_] 表示\w

$daysOfTheWeek= 'monday=tuesday*wednesday^thursday#friday!saturday(sunday'
$daysOfTheWeek -split "\W"

限制子串

还可以阻止 -Split 运算符将字符串拆分为多个子字符串。可用于限制子字符串结果的选项是 参数。

当您回顾 -Split 语法时, 参数是直接跟在 参数后面的参数。下面再次显示语法以供参考。

<String> -Split <Delimiter>[,<Max-substrings>[,"<Options>"]]

按照上面的语法,修改下面的示例代码以将拆分/子字符串的数量限制为 3。

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split ",",3

并且,运行上面的代码会得到下面的输出。从下面的输出中可以看到,该字符串仅被拆分为三个子字符串。其余的分隔符被跳过。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

现在,如果您想限制子字符串,但相反,您可以将 参数值更改为负值。在下一个示例中, 更改为 -3

$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split ",",-3

由于上面修改的代码,字符串从最后三个匹配的分隔符开始被分割。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

查找和替换字符串

在本部分中,您将了解可用于搜索和执行 PowerShell 字符串替换的两种方法。 Replace() 方法和 -Replace 运算符。

Replace() 方法

字符串对象还有一个内置方法可以帮助执行搜索和替换操作 - replace() 方法。 replace() 方法最多需要四次重载。

下面列出了 replace() 方法可接受的一组重载。

<String>.Replace(<original>, <substitute>[, <ignoreCase>][, <culture>])

唯一需要的重载是 <original><substitute><culture> 是可选的。

在下面的示例中,代码将搜索逗号 (,) 字符和分号 (;) 的所有实例。

$daysOfTheWeek = 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek.Replace(',',';')

除了替换单个字符之外,您还可以使用 replace() 方法来搜索和替换字符串。下面的示例代码将单词“day”替换为“night”。

$daysOfTheWeek = 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek.Replace('day','NIGHT')

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

-Replace 运算符

替换运算符的语法如下所示。

<string> -replace <original>, <substitute>

使用上面的语法,下面的示例代码使用 -replace 运算符将单词“day”替换为“Night”。

$daysOfTheWeek = 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -replace 'day','NIGHT'

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

下一个示例使用 RegEx 匹配来用 -replace 运算符替换字符串。下面的代码在 here-string 中搜索匹配的字符串 (#.) 并将其替换为 nothing

$daysOfTheWeek = @'
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
'@
$daysOfTheWeek -replace "\d.\s",""

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

从字符串中提取字符串

字符串对象有一个名为 SubString() 的方法。 SubString() 方法用于提取字符串中特定位置的字符串。 SubString() 方法的语法如下所示。

<String>.SubString(<startIndex>[,<length>])

SubString() 方法将开始搜索的位置索引中的 startIndexlength 参数指示从 startIndex 开始返回的字符数。 length 参数是可选的,如果不使用该参数,SubString() 方法将返回所有字符。

从起始位置和固定长度提取子字符串

下面的示例代码检索从索引 9 开始的 $guid 字符串值部分,并准确返回后面的 5 个字符。

$guid = 'e957d74d-fa16-44bc-9d72-4bea54952d8a'
$guid.SubString(9,5)

从动态起始位置提取子字符串

下一个示例演示如何使用 PowerShell 字符串长度属性动态定义起始索引。

下面的代码执行以下操作:

  • 获取字符串对象的长度。
  • 通过将长度除以 2 获取中间索引的索引。
  • 使用中间索引作为子字符串的起始索引。
$guid = 'e957d74d-fa16-44bc-9d72-4bea54952d8a'
$guid.SubString([int]($guid.Length/2))

由于未指定 length 值,因此 Substring() 方法返回起始索引中的所有字符。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

比较 PowerShell 字符串

您也可以使用 PowerShell 来比较字符串,使用字符串对象的内置方法,例如 CompareTo()Equals()Contains() 方法。或者,使用 PowerShell 比较运算符。

使用CompareTo()方法

如果两个字符串的值相同,则 CompareTo() 方法返回值 0。例如,下面的代码比较两个字符串对象。

$string1 = "This is a string"
$string2 = "This is a string"
$string1.CompareTo($string2)

由于值相同,因此结果应为 0,如下所示。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

使用 Equals() 方法和 -eq

Equals() 方法和 -eq 运算符可用于检查两个字符串的值是否相等。

下面的示例使用 Equals() 方法来比较 $string1$string2 的值。

$string1 = "This is a string"
$string2 = "This is not the same string"
$string1.Equals($string2)

上面的代码应返回 False,因为 $string1$string2 的值不相等。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

下面的下一个示例代码使用 -eq 来比较 $string1$string2 的值。

$string1 = "This is a string"
$string2 = "This is not the same string"
$string1 -eq $string2

从下面的输出中可以看出,使用 -eqEqual() 方法的结果是相同的。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

使用 Contains() 方法

在此示例中,通过检查 PowerShell 字符串是否包含另一个字符串的子字符串来比较两个字符串。

下面的代码显示 $string1$string2 值不相等。但是,$string2 的值是$string1 的子字符串。

$string1 = "This is a string 1"
$string2 = "This is a string"
$string1.Contains($string2)

上面代码的结果应该是True,如下所示。

[玩转系统] 连接、展开、格式化以及所有 PowerShell 字符串

进一步阅读

  • 了解 PowerShell 字符串格式和扩展字符串
  • 回归基础:了解 PowerShell 对象
  • 了解 PowerShell 和基本字符串格式
  • 关于引用规则
  • 字符串类
  • About_Join
  • 关于正则表达式

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯