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

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

作者:精品下载站 日期:2024-12-14 04:52:33 浏览:14 分类:玩电脑

PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南


[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

PowerShell 中的巫术案例简介

PowerShell中的Switch函数用于处理多个If语句,或者换句话说,它是多个条件If/Else If/Else的替换。要检查脚本或函数中的单个条件,您可以使用 If/else 语句,但如果您想评估更多 IF 语句,请使用 Switch。

Switch 比多个 If 语句更好,并且易于实现且易于编码。每个语句下都有多个条件,当满足其中一个条件时,就会执行操作。

语法:

Switch (<Value>)
{
<Condition1> {Action1}
<Condition2> {Action2}
}

完整语法:

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 Case 的参数

  • 正则表达式:也称为正则表达式。针对条件值执行正则表达式检查。如果您使用正则表达式,则通配符和精确值将被忽略。另外,如果匹配子句不是字符串,则忽略此参数。
  • 通配符:表示条件是通配符字符串。如果您使用通配符,则正则表达式和精确表达式将被忽略。另外,如果匹配子句不是字符串,则忽略此参数。
  • 精确:对精确字符串进行匹配。如果使用 Exact,则忽略通配符和正则表达式,并且如果匹配子句不是字符串,则忽略此参数。
  • 区分大小写:此参数将检查与传递的值完全匹配的条件(区分大小写),如果不匹配,则忽略此参数。它还需要一个字符串值。
  • 文件:将文件路径作为输入值而不是字符串值。如果传递多个文件参数,则只取最后一个。读取文件的每一行并根据条件进行评估,如果条件匹配,则执行该值或显示写入的消息。

流程图

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

Switch 在 PowerShell 中如何工作?

如上图所示,每当传递任何值(字符串、整数、浮点或其他数据类型)、数组、通配符、文件等时,它就会开始一一匹配条件,当条件匹配时,脚本执行该块。对于多个匹配值,将执行多个 scrips 块,如果没有找到匹配值并且指定了默认条件,则执行该块,否则有空输出。

PowerShell 中的 Switch Case 示例

让我们看看给出的例子:

示例#1

1. 简单的 switch 函数,传递字符串、整数值。

代码:

switch (3) {
1 {"One"}
2 {"Two"}
3 {"Three"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

代码:

switch("data"){
"abc"{"Abc executed"}
"xyz"{"Xyz Executed"}
"data"{"Data Executed"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

现在,如果参数与表达式不匹配怎么办?如下所示,5 与任何 Switch 案例均不匹配。在这种情况下,输出将为空。

代码:

switch (5) {
1 {"One"}
2 {"Two"}
3 {"Three"}
}

为了克服上述问题,需要指定default,并且当没有参数匹配时执行default块。

代码:

switch (5) {
1 {"One"}
2 {"Two"}
3 {"Three"}
default{"No Match Found"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

示例#2

让我们看看给出的例子:

if/else if /else 和 Switch 之间的区别。从下面的例子中,您可以了解到使用 Switch 函数编写脚本是多么容易。

代码:

$time = 3
if($time -eq 1){"It's 1 O'Clock"}
elseif ($time -eq 2) {"It's 2 O'Clock"}
elseif ($time -eq 3) {"It's 3 O'Clock"}
else {"No Match Found"}
$time = 3
switch ($time) {
1 {"It's 1 O'Clock"}
2 {"It's 2 O'Clock"}
3 {"It's 3 O'Clock"}
default{"No Match found"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

两种方法的执行时间。

代码:

$time = 3
Measure-Command {
if($time -eq 1){"It's 1 O'Clock"}
elseif ($time -eq 2) {"It's 2 O'Clock"}
elseif ($time -eq 3) {"It's 3 O'Clock"}
else {"No Match Found"}
}

总毫秒数:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

代码:

$time = 3
Measure-Command {
switch ($time) {
1 {"It's 1 O'Clock"}
2 {"It's 2 O'Clock"}
3 {"It's 3 O'Clock"}
default{"No Match found"}
}
}

总毫秒数:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

差异:31.3154 毫秒

当您在交换机内编写大量脚本或函数时,这种差异会变得巨大。

1.使用正则表达式参数进行切换

如果 switch 中提到正则表达式,它会使用传递的值计算表达式,如果部分条件匹配,则执行该操作。

考虑下面的例子。

代码:

Switch ("Donkey"){
"Dog" {"Dog is Mentioned"}
"Cat" {"Cat is Mentioned"}
"Don" {"Donkey is Mentioned"}
"key" {"Donkey is mentioned again"}
default {"Nothing is mentioned"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

添加正则表达式后。

代码:

Switch -Regex ("Donkey"){
"Dog" {"Dog is Mentioned"}
"Cat" {"Cat is Mentioned"}
"Don" {"Donkey is Mentioned"}
"key" {"Donkey is mentioned again"}
default {"Nothing is mentioned"}
}

输出

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

2.使用通配符参数进行切换

通配符的工作方式与 Like 参数类似。

代码:

$msg = "Error, WMI connection failed"
Switch -Wildcard ($msg) {
"Error*" {"WMI Error"}
"Warning*" {"WMI Warning"}
"Successful*" {"WMI Connection Successful"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

3.精确参数切换

Switch 中默认具有精确功能。你用不用它并不重要。但是,当您同时使用两个参数时,最后一个参数优先。

代码:

Switch -Regex -Exact ("Hello"){
"He" {"Hello World"}
"Hi" {"Hi World"}
Default {"No World"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

代码:

Switch -Exact -Regex ("Hello"){
"He" {"Hello World"}
"Hi" {"Hi World"}
Default {"No World"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

4.使用文件参数进行切换

您可以直接向 Switch 提供文件路径作为参数。您可以将 File 与文件路径一起使用,而不是为其提供变量表达式。

代码:

Switch -Wildcard -File C:\temp\switchtest.txt {
"*Warning*"{Write-Warning $PSItem}
"*Error*"{Write-Error $PSItem}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

您可以使用 $PSItem 或 $_ 来处理当前项目。

5.使用 CaseSensitive 参数进行切换

当您在开关中使用区分大小写的参数时,条件必须与每个字符完全匹配。

代码:

switch -CaseSensitive ("Hello") {
"HeLlo" {"This is different HeLlo"}
Default {"This is not Matching"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

6.将数组值传递给 switch 函数

简单数组:

switch (10,12) {
9 { "Nine" }
10 { "Ten" }
11 {"Eleven"}
12 {"Twelve"}
Default {"None"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

传递数组对象

代码:

$VMOps = @(
"VM_Delete"
"VM_Create"
)
switch ($VMops) {
"VM_Delete" {"VM Delete Operation"}
"VM_Create" {"VM Create Operation"}
"VM_Shutdown" {"VM Shutdown Operation"}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

7.中断条件

当您指定中断条件时,操作将在该循环中中断,并且无法继续进一步执行。当您不想在条件满足并且执行时间变得更快时检查进一步的步骤时,这非常有用。

代码:

$VMOps = @(
"VM_Delete"
"VM_Create"
)
switch ($VMops) {
"VM_Delete" {
"VM Delete Operation"
break }
"VM_Create" {
"VM Create Operation"
break}
"VM_Shutdown" {
"VM Shutdown Operation"
break
}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

如果您注意到,只执行了一个块,然后它就从 switch 函数中退出。

8.继续条件

continue 参数用于跳过特定迭代。例如,如果有 3 个项目需要匹配,那么它将首先执行,当条件匹配时,它将跳过其他步骤并进入下一步。

代码:

switch ('Hello') {
"hello" {'First Block Executes'
continue}
'HELLO' {'Second Block Executes'
continue }
'HeLLo'  {'Third Block Exectues'
continue }
Default {'Nothing executed'}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

正如你所看到的,只传递了一个参数(‘Hello’),它只执行第一个块,因为表达式匹配并且没有其他参数要执行,脚本将结束。

  • 另一种使用 Switch 进行中断和继续的混合示例。

代码:

switch ('Alpha','Beta','Delta') {
"Alpha" {'First Block Executes'
continue}
'Beta' {'Second Block Executes'
break }
'Delta'  {'This will not Execute'}
}

输出:

[玩转系统] PowerShell 中的 Switch Case | PowerShell 中 Switch Case 的完整指南

结论

总而言之,Switch 比实现多个 If 条件要好得多,并且提供了更多功能并减少了执行时间。

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

取消回复欢迎 发表评论:

关灯