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

[玩转系统] 回归基础:了解 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 开头,要测试的值包含在括号 () 中。然后,大括号 {} 内是条件或案例以及操作列表。

conditioncase 可以是值或表达式。 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 语句接受 stringnumbervariableexpression 作为测试价值观。然后,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% 有效的电子邮件地址正则表达式

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

取消回复欢迎 发表评论:

关灯