[玩转系统] 连接、展开、格式化以及所有 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 的表达式结果的字符串。
上面显示的结果展示了定义字符串时何时适合使用单引号或双引号的区别。
字符串对象
如上一节所述,形成文本的字符集合是字符串。字符串的结果值是 String 对象。 String 对象是 [System.String] 类型的 .NET 对象。
由于 System.String 是一个对象,因此它具有可以使用 Get-Member
cmdlet 访问的属性。下面我们在带有双引号的字符串中插入一个变量。
PS> "Hello PowerShell - Today is $(Get-Date)" | Get-Member=
下面的屏幕截图显示了 String 对象的 TypeName 和部分属性列表。
连接 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 格式运算符
格式运算符 (-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 -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 中运行上面的示例代码时,您可能会看到与下图类似的输出。
.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 方法。
.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。
.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 中拆分字符串 - 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 中测试上述代码时,您将得到以下结果。
您从上面的输出中注意到,结果子字符串中完全省略了分隔符。
如果由于某种原因需要保留分隔符,则可以通过将字符括在括号中来保留分隔符。
$split = $string -split "(;)"
$split.Count
$split
修改分割分隔符后,如上所示,运行它会产生如下所示的输出。
上面的结果表明分隔符没有被省略,并且被计入结果子字符串中。
字符串分隔符
字符串也可以被另一个字符串作为分隔符分割。在此示例中,字符串“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'}
当您运行上面的命令时,输出将是用脚本块表达式中指定的分隔符分隔的子字符串。
下一个示例使用脚本块做了更多的事情。这次,表达式评估是否:
- 传入的字符作为整数传递;和
- 其值大于1
如果评估结果为 true,则 -Split
运算符将使用该字符作为分隔符。此外,还添加了错误处理以确保错误被过滤掉。
$daysOfTheWeek= 'monday1tuesday2wednesday3thursday1friday4saturday8sunday'
$daysOfTheWeek -split {
try {
[int]$PSItem -gt 1
}
catch {
#DO NOTHING
}
}
运行上面所示的代码后,预期字符串将在字符值可以转换为大于 1 的整数的位置进行分割。下面显示了预期的输出。
正则表达式分隔符
默认情况下,-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
并且,运行上面的代码会得到下面的输出。从下面的输出中可以看到,该字符串仅被拆分为三个子字符串。其余的分隔符被跳过。
现在,如果您想限制子字符串,但相反,您可以将 参数值更改为负值。在下一个示例中,
更改为
-3
。
$daysOfTheWeek= 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -split ",",-3
由于上面修改的代码,字符串从最后三个匹配的分隔符开始被分割。
查找和替换字符串
在本部分中,您将了解可用于搜索和执行 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')
-Replace
运算符
替换运算符的语法如下所示。
<string> -replace <original>, <substitute>
使用上面的语法,下面的示例代码使用 -replace
运算符将单词“day”替换为“Night”。
$daysOfTheWeek = 'monday,tuesday,wednesday,thursday,friday,saturday,sunday'
$daysOfTheWeek -replace 'day','NIGHT'
下一个示例使用 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",""
从字符串中提取字符串
字符串对象有一个名为 SubString()
的方法。 SubString()
方法用于提取字符串中特定位置的字符串。 SubString()
方法的语法如下所示。
<String>.SubString(<startIndex>[,<length>])
SubString()
方法将开始搜索的位置索引中的 startIndex
。 length
参数指示从 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 来比较字符串,使用字符串对象的内置方法,例如 CompareTo()
、Equals()
和 Contains()
方法。或者,使用 PowerShell 比较运算符。
使用CompareTo()方法
如果两个字符串的值相同,则 CompareTo()
方法返回值 0。例如,下面的代码比较两个字符串对象。
$string1 = "This is a string"
$string2 = "This is a string"
$string1.CompareTo($string2)
由于值相同,因此结果应为 0,如下所示。
使用 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
的值不相等。
下面的下一个示例代码使用 -eq
来比较 $string1
和 $string2
的值。
$string1 = "This is a string"
$string2 = "This is not the same string"
$string1 -eq $string2
从下面的输出中可以看出,使用 -eq
和 Equal()
方法的结果是相同的。
使用 Contains()
方法
在此示例中,通过检查 PowerShell 字符串是否包含另一个字符串的子字符串来比较两个字符串。
下面的代码显示 $string1
和 $string2
值不相等。但是,$string2
的值是$string1
的子字符串。
$string1 = "This is a string 1"
$string2 = "This is a string"
$string1.Contains($string2)
上面代码的结果应该是True
,如下所示。
进一步阅读
- 了解 PowerShell 字符串格式和扩展字符串
- 回归基础:了解 PowerShell 对象
- 了解 PowerShell 和基本字符串格式
- 关于引用规则
- 字符串类
- About_Join
- 关于正则表达式
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag