[玩转系统] 回归基础:了解 PowerShell Switch 语句
作者:精品下载站 日期:2024-12-14 13:00:59 浏览:14 分类:玩电脑
回归基础:了解 PowerShell Switch 语句
编程中条件逻辑的概念并不是什么新鲜事。条件逻辑是一个奇特的术语,它首先检查条件(如果发生了某些事情),然后根据该条件执行某些操作。
例如,在创建所有磁盘空间使用情况报告的脚本中,条件逻辑对于评估可用空间状态非常有用。根据定义的阈值,在使用条件逻辑进行评估时,可用磁盘空间状态可能会被标记为正常、警告或严重。
大多数(如果不是全部)语言都使用自己版本的条件逻辑构造。想想 if/then 语句。 PowerShell 中可用的条件逻辑结构之一是 switch 语句。
在本文中,您将了解什么是 PowerShell switch 语句、了解其语法及其工作原理。您还将从 PowerShell 开关示例中了解在脚本中使用条件逻辑处理的一些不同方法。
了解基本 PowerShell Switch 语句
PowerShell switch 语句是一种条件逻辑语句,用于评估一个或多个条件。它与 PowerShell If 语句相当。它们都用于相同的目的 - 在运行操作之前测试条件。为什么使用 switch 语句而不是 if 语句?当您必须检查多个条件时。
对多个条件使用 if 语句可能会很乏味且冗长。使用 switch 语句来评估多个条件会更容易。请参考下面的 switch 语句语法。
Switch (<test-value>)
{
<condition> {<action>}
<condition> {<action>}
}
从上面的语法中可以看出,switch 语句以 Switch
开头,要测试的值包含在括号 ()
中。然后,大括号 {}
内是条件或案例以及操作列表。
condition
或 case
可以是值或表达式。 action
也可以是要返回的值,或者是运行指定操作的表达式。
下面的代码提示用户输入一个数字。该数字存储在 $num
变量中。然后,根据条件评估 $num
的值,然后在测试值与条件匹配时运行关联的操作。
$num = Read-Host "Enter a number"
Switch ($num)
{
1 {'Run Action 1'}
2 {'Run Action 2'}
3 {'Run Action 3'}
}
当您在 PowerShell 中运行上面的代码时,预期输出如下所示。
所以发生了什么事? $num
变量的值与条件列表 ( 3
) 中的 PowerShell switch case 匹配,其操作是输出 Run Action 3
在屏幕上。
定义默认匹配子句
下面的 switch 语句只有三个条件。这三个条件评估 $num
变量的值是 1、2 还是 3。
$num = Read-Host "Enter a number"
Switch ($num)
{
1 {'Run Action 1'}
2 {'Run Action 2'}
3 {'Run Action 3'}
}
如果$num
的值不符合任何条件怎么办?在这种情况下,当测试值不符合任何条件时,代码将不执行任何操作。
请参阅下面的示例,当代码在 PowerShell 中运行时,用户输入数字 4。 switch 语句结束且不返回任何内容。这是因为没有条件评估输入值 4。
如果 switch 语句在没有条件匹配时运行默认操作,而不是返回任何内容,那就太好了。这就是 default
匹配子句发挥作用的地方。
请参阅下面修改后的示例代码。在末尾添加一个 default
匹配子句,以便在输入测试值与任何条件都不匹配时显示默认消息。 Default
相当于 If
语句中的 Else
子句。
$num = Read-Host "Enter a number"
Switch ($num)
{
1 {'Run Action 1'}
2 {'Run Action 2'}
3 {'Run Action 3'}
default {'No Action'}
}
当修改后的代码在 PowerShell 中运行时,预期输出如下所示。
评估多个测试值
到目前为止,您已经了解了如何使用 PowerShell switch 语句来评估单个测试值。但是,switch 语句还可以根据条件列表测试多个测试值。
在下一个示例中,代码提示用户输入两个数字。然后 switch 语句测试这两个值,根据它们的顺序位置一次测试一个。
$num1 = Read-Host "Enter first number"
$num2 = Read-Host "Enter second number"
switch ($num1, $num2)
{
1 {"It is one." }
2 {"It is two." }
3 {"It is three." }
4 {"It is four." }
default {"Not found"}
}
您还可以传递一个数组作为 switch 语句的测试值,如下面的示例所示。
$arrayNum = @(1,3)
switch ($arrayNum)
{
1 {"It is one." }
2 {"It is two." }
3 {"It is three." }
4 {"It is four." }
default {"Not found"}
}
匹配多个条件
与 If 语句不同,当找到第一个匹配项时该语句就退出,而 switch 语句即使在找到第一个匹配项后也会测试所有条件。这使得 switch 语句可以将测试值与多个条件进行匹配。
在下面的示例中,测试值 banana
与 switch 语句内的多个条件匹配。
switch ("banana") {
"apple" { "I have an apple" }
"orange" { "I have an orange" }
"banana" { "I have a banana" }
"mango" { "I have a mango" }
"banana" { "I have a banana, again!" }
default { "I don't have that fruit" }
}
下面的输出显示测试值 banana
匹配触发相应操作的两个条件。
使用 Break 语句终止 Powershell 开关
在上一节中,您已经了解了测试值如何匹配 switch 语句中的多个条件。根据脚本的用途,这种匹配多个条件的行为可能没问题。
但是,如果您可以指示 switch 语句在测试值已找到第一个匹配项时中断其流程,则可以更好地控制脚本。这就是 break 语句有用的地方。
在此示例中,使用了上一节中的相同代码,但经过修改以包含break语句。正如您所看到的,每个条件后面都跟有 break
语句,这会导致 switch 语句在测试值与条件匹配时终止。
switch ("banana") {
"apple" { "I have an apple"; break }
"orange" { "I have an orange"; break }
"banana" { "I have a banana"; break }
"mango" { "I have a mango"; break }
"banana" { "I have a banana, again!"; break }
default { "I don't have that fruit" }
}
当您将上面的代码付诸实践时,下面的输出就是它的样子。尽管有两个条件评估测试值“banana”,但仅返回第一个匹配条件的结果。
探索更多 Powershell Switch 语句
前面的部分向您展示了 switch 语句的基本要点。但 switch 语句不仅仅是基础知识。有时,您可能需要用它做更多的事情,而不仅仅是匹配简单的字符串和数值。在接下来的部分中,您将了解 switch 语句可用的不同参数或选项。
不同的 Switch 语句参数
switch 语句有五个参数。这些参数是:
- 精确 - 这仅适用于字符串测试值。如果使用此参数,则表示仅当语句与测试值完全匹配时才应用该条件。另一方面,如果不使用此参数,则 switch 语句的行为就像使用了
exact
参数一样。 - 区分大小写 - 此参数用于字符串测试值。使用此参数表示 switch 语句将执行区分大小写的匹配。
- regex - 使用此参数表示交换机将执行正则表达式匹配。此语句仅适用于字符串测试值。
- 通配符 - 此参数也仅适用于字符串测试值。使用此参数表明 switch 语句将适应通配符字符串的测试。要执行的比较不区分大小写。
- file - 如果您计划使用文件内容作为输入而不是直接指定测试值,则使用此参数。文件的内容将逐行评估。
每个参数都会使 switch 语句表现不同。有些参数可以一起使用,有些参数会覆盖其他参数。通配符和正则表达式参数相互冲突。当使用两个参数时,仅使用最后一个参数。
完整的 Switch 语句语法
基于上一节讨论 switch 语句参数的基础上,下面的代码行现在您可能看起来很熟悉。
switch [-regex|-wildcard|-exact][-casesensitive] (<value>)
{
"string"|number|variable|{ expression } { statementlist }
default { statementlist }
}
switch [-regex|-wildcard|-exact][-casesensitive] -file <filename>
{
"string"|number|variable|{ expression } { statementlist }
default { statementlist }
}
您会从上面的语法块中注意到字符串数字变量表达式语句列表
。这组特别排列的单词意味着 Powershell switch 语句接受 string
、number
、variable
和 expression
作为测试价值观。然后,statementlist
列出了条件匹配时要执行的操作。
使用 -File
参数
在此示例中,switch 语句使用 file
参数来使用文件作为测试值的输入。
下面是名为 random.txt 的文本文件示例,其中包含二十个随机句子的列表。
She can live her life; however, she wants as long as she listens to what I have to say.
Carol drank the blood as if she were a vampire.
Had he known what was going to happen, he would have never stepped into the shower.
The father died during childbirth.
My dentist tells me that chewing bricks is very bad for your teeth.
When motorists sped in and out of traffic, all she could think of was those in need of a transplant.
He would only survive if he kept the fire going and he could hear thunder in the distance.
The view from the lighthouse excited even the most seasoned traveller.
It was the best sandcastle he had ever seen.
As the years pass by, we all know owners look more and more like their dogs.
Buried deep in the snow, he hoped his batteries were fresh in his avalanche beacon.
You can't compare apples and oranges, but what about bananas and plantains?
She saw no irony asking me to change but wanting me to accept her for who she is.
I don’t respect anybody who can’t tell the difference between Pepsi and Coke.
Dan took the deep dive down the rabbit hole.
On a scale from one to ten, what's your favourite flavour of random grammar?
He hated that he loved what she hated about hate.
I covered my friend in baby oil.
He figured a few sticks of dynamite were easier than a fishing pole to catch fish.
The Japanese yen for commerce is still well-known.
接下来,下面的代码将测试 random.txt 文件的每一行,并仅显示包含单词“she”的句子。
switch -file .\random.txt {
{$_ -match 'she'} { $_ }
}
运行上面的代码时,将显示以下输出。正如您所看到的,在 random.txt 文件中的 20 个句子中,仅返回带有“she”一词的句子。
使用 -Wildcard
参数
使用上一个示例中名为 random.txt 的相同文件,下一个示例将使用 -wildcard
参数来评估 random.txt 中的句子em> 文件包含单词 She
。为了确保只返回大写 S 的单词,还使用了 -casesensitive
参数。
switch -casesensitive -wildcard -file .\random.txt {
"*She*" { $_ }
}
运行上面的代码后,预期输出如下所示。正如您所看到的,仅返回与 She
(带有大写 S)通配符搜索匹配的句子。
使用 -CaseSensitive
参数
此示例使用 CaseSensitive
参数对测试值 Banana
执行区分大小写的搜索。仔细观察下面的代码,单词 banana 有两个条件,但其中之一以大写 B 开头。
switch -casesensitive ("Banana") {
"apple" { "I have $_"; break }
"orange" { "I have $_"; break }
"banana" { "I have $_"; break }
"mango" { "I have $_"; break }
"Banana" { "I have $_"; break }
default { "I don't have that fruit" }
}
运行上面的代码,预期输出如下所示。
使用 -RegEx
参数
此示例演示如何使用 -RegEx
参数执行正则表达式匹配以确定测试值是否为电子邮件地址。
下面的文本是将用于评估测试值的正则表达式。该正则表达式保存在名为 RegExp.txt 的文件中。
(?:[a-z0-9!#$%&'+/=?^_{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_
{|}~-]+)|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\[\x01-\x09\x0b\x0c\x0e-\x7f])")@(?:(?:a-z0-9?.)+a-z0-9?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-][a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\[\x01-\x09\x0b\x0c\x0e-\x7f])+)])
以下是要验证的假定电子邮件地址列表。该列表保存在名为email.txt的文件中。
[email
j[email
www.google.com
[email
smtp.office365.com
引用下面的代码,第一行将导入 RegExp.txt 的内容并将其存储在 $RegExp
变量中。然后,Powershell switch 语句使用 email.txt 文件作为测试值的输入,如 -file
参数所示。
$RegExp = Get-Content .\RegExp.txt
switch -regex -file .\email.txt {
$RegExp {"[$_] is an email address"}
Default {"[$_] is NOT an email address"}
}
在 PowerShell 中运行上述代码后,只有与 $RegExp
中存储的正则表达式匹配的测试值才会被验证。如果测试值与正则表达式不匹配,则将触发 Default
子句。请参阅下面的示例输出。
结论
在本文中,您了解了 switch
语句的基础知识以及如何在运行任何相应代码之前使用它来评估条件。 switch 语句还能够执行更复杂的测试,例如评估正则表达式和通配符。
这些参数还可以一起使用以组合它们的功能以获得更受控制的结果。我希望在本文中,当您需要编写涉及条件逻辑和决策的脚本时,您可以在 PowerShell 工具箱中获得一个新项目。
也许您的下一个项目是创建一个脚本,在使用 switch 语句时报告不健康的系统或监视事件日志。 PowerShell switch 语句有很多可能的用途,请继续练习。
快乐的脚本编写!
进一步阅读
- About_Switch
- 关于自动变量
- 回归基础:使用 PowerShell If-Else 的条件逻辑
- 99.99% 有效的电子邮件地址正则表达式
猜你还喜欢
- 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