[玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑
作者:精品下载站 日期:2024-12-14 13:13:48 浏览:13 分类:玩电脑
回归基础:使用 PowerShell If 语句的条件逻辑
本文已更新至 2023 年!
脚本可以做出决定。如何?通过使用称为条件逻辑的概念。 PowerShell if 语句和 if/else 结构是定义条件的常用方法。
当您编写 PowerShell 脚本时,您会考虑到特定的任务或任务。但是,一项操作可以根据一个或多个条件有多种可能的操作。这种情况就是 PowerShell If 语句构造的用武之地。
在本文中,您将学习 PowerShell If-Else 构造并了解其语法及其工作原理。您还将从示例中了解一些使用 PowerShell If 语句在脚本中添加条件逻辑处理的方法。
了解 PowerShell If 语句语法
PowerShell if-else 构造计算一个或多个条件表达式。下面您将看到 If 语句语法。这种风格通常称为流量控制。
if (<test1>)
{<statement list 1>}
[elseif (<test2>)
{<statement list 2>}]
[else
{<statement list 3>}]
从上面的语法中可以看出,每个测试都包含在括号()
中。测试可以使用不同的运算符,例如比较运算符和逻辑运算符,
语句列表包含测试结果为 true 时要运行的代码。
那么,If 语句组中存在三个可能的语句。这些是 IF、ELSEIF 和 ELSE 语句。
if
语句包含要评估的第一个测试,后面是大括号{}
内包含的第一个语句列表。PowerShell if 语句是唯一需要在场的声明。elseif
语句是添加条件的位置。当您有多个条件时,您可以添加多个 ElseIf 语句。 PowerShell 将按顺序评估每个条件。else
语句不接受任何条件。该语句中的语句列表包含在所有测试的先验条件均为 false 时要运行的代码。
了解 PowerShell If 语句逻辑流程
要进一步了解 PowerShell If-Else 的工作原理,请熟悉其逻辑流程。下图说明了 PowerShell If-Else 的基本流程。
当 if 语句运行时,PowerShell 会运行每个条件,评估代码返回 true 还是 false。该行为的摘要如下:
- PowerShell 评估测试 1 中的条件。
- 如果测试1的结果返回true,则If语句列表中的代码将运行,然后PowerShell退出If语句。
- 如果测试 1 的结果返回假,PowerShell 会继续评估下一个ElseIf中的条件(测试n) > 声明。
- 如果Test n的结果返回false,PowerShell将继续评估下一个ElseIf中的条件(Test n) > 语句,如果存在另一个 ElseIf 语句 -OR-
- 如果 Test n 的结果返回 false,则 Else 语句中的代码运行,并且 PowerShell 将退出 If 语句 -OR-
- 如果 Test n 的结果返回 true,则 ElseIf 语句中的代码将运行,并且 PowerShell 将退出 If 语句。
使用 PowerShell If-Else 语句
接下来的部分是编写脚本时如何使用 PowerShell If 语句的几个示例。如果您遇到需要使用 If 语句的实际情况,您将学到的技术可以指导您使用 If 语句。
单个 If-Else 条件
从最基本的 PowerShell If 语句开始。当只有一个条件需要测试时,您应该使用单个 if 语句。
下面的示例测试 $num
变量的值是否大于 10。如果结果为 true,则结果为 "$num is greater than 10"
显示在屏幕上。如果结果为 false,PowerShell 将不执行任何操作,因为只有一个条件需要测试。
$num = 11
if ($num -gt 10) {
"$num is greater than 10"
}
如果您仅检查特定值,例如 if ($Value) { }
,则 PowerShell 将测试 $Value
是否不 $Null
、0
、$False
、空字符串或空数组。
将上面的代码粘贴到 PowerShell 中将得到如下所示的结果。
现在,如果您想添加默认的“后备”操作,而不是在测试结果为 false 时让 PowerShell 不执行任何操作,则可以添加 Else 语句。
在下面的示例中,如果 $num
变量的值不大于 10,则 Else 语句中的代码将运行。
$num = 9
if ($num -gt 10)
{
"$num is greater than 10"
}
else
{
"$num is NOT greater than 10"
}
在 PowerShell 中运行修改后的代码会得到如下所示的输出。
从 PowerShell 7.0 开始,引入了使用三元运算符的 If 语句的新语法。单个 If 语句可以很好地利用这种新语法。
使用上面的相同示例,这就是使用三元运算符的代码的外观。
$num = 11
$num -gt 10 ? "$num is greater than 10" : "$num is NOT greater than 10"
在 PowerShell If 语句中测试 $Null
您可能认为测试 $Null
条件很简单。但是,放置 $Null
值的一侧很重要,因为它可能不会在每种情况下都产生相同的结果。最佳实践是始终将 $Null
条件放在左侧,如下所示。
$Null -NE $Value
如果将 $Null
测试放在右侧,并且左侧值是一个列表,例如数组,则 $Null
将充当筛选。从下面的示例中可以看出,如果将 $Null
放置在左侧,您将获得一致的布尔结果。
$List = @(1,2,2,3,4)
$List -NE $Null
$List -EQ $Null
$Null -NE $Null
$Null -EQ $Null
使用 ElseIf 的多个 If-Else 条件
当评估多个条件时,需要添加一个或多个ElseIf语句。每个 ElseIf 语句都包含测试表达式及其要运行的代码。
下面的脚本在执行时将继续提示输入水果名称,直到按下 CTRL+C
按键,或者用户输入字母“X
”。
然后,If 语句将按顺序遍历每个条件,直到找到匹配项。如果输入与任何条件都不匹配,则将执行Else语句内的代码。
While ($fruit -ne "X") {
$fruit = Read-Host "Name that fruit"
if ($fruit -eq 'Apple') {
'I have an Apple'
}
elseif ($fruit -eq 'Banana') {
'I have a Banana'
}
elseif ($fruit -eq 'Orange') {
'I have an Orange'
}
else {
'Sorry, that fruit is not in the list'
}
}
下面演示了上述脚本在 PowerShell 中运行时的行为方式。
报告可用磁盘空间状态
可用磁盘空间报告是系统管理员的一项常见任务。在 Windows 机器上报告固定磁盘空间信息的常用方法围绕以下代码。
Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$_.DriveType -eq 3}
上面的代码将返回的信息类似于下一个屏幕截图中显示的信息。
如您所见,上面的输出显示了驱动器号、可用空间值和其他属性。虽然上面的输出很好,但并不直观。信息的呈现方式并不表明磁盘空间是处于严重或警告状态还是正常。
使用 PowerShell If 语句改进代码
通过使用 PowerShell If-Else 语句添加条件来检查可用空间是否超过或低于特定阈值,可以实现更直观的输出。这些阈值将定义可用磁盘空间的状态。
下面的示例脚本执行以下操作:
- 使用变量的值
$Critical
,定义将可用空间百分比标记为关键的阈值。 - 使用变量
$Warning
的值,定义将可用空间百分比标记为警告的阈值。 - 从本地机器获取所有固定磁盘信息
循环所有磁盘信息以确定可用空间并标记其状态。
- 如果可用空间百分比高于
$Warning
变量的值,磁盘空间状态将标记为正常。
- 如果可用空间百分比高于
- 如果可用空间百分比高于
$Critical
变量的值,则磁盘空间状态将标记为警告。 - 如果可用空间百分比小于或等于
$Critical
变量的值,则磁盘空间状态将标记为严重。
'Drive Letter'
、'Drive Name'
、'Total Space (GB)'
、'Free Space ( GB)'
、'可用空间 (%)'
和 '状态'
。复制下面的代码并使用文件名 Get-DiskSpace.ps1
保存脚本。不要忘记更改 $Critical
和 $Warning
变量的值以使用不同的阈值进行测试。
# Define thresholds in percentage
$Critical = 20
$Warning = 70
# Get all Fixed Disk information
$diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object { $_.DriveType -eq 3 }
# Initialize an empty array that will hold the final results
$finalReport = @()
# Iterate each disk information
$diskObj.foreach(
{
# Calculate the free space percentage
$percentFree = [int](($_.FreeSpace / $_.Size) * 100)
# Determine the "Status"
if ($percentFree -gt $Warning) {
$Status = 'Normal'
}
elseif ($percentFree -gt $Critical) {
$Status = 'Warning'
}
elseif ($percentFree -le $Critical) {
$Status = 'Critical'
}
# Compose the properties of the object to add to the report
$tempObj = [ordered]@{
'Drive Letter' = $_.DeviceID
'Drive Name' = $_.VolumeName
'Total Space (GB)' = [int]($_.Size / 1gb)
'Free Space (GB)' = [int]($_.FreeSpace / 1gb)
'Free Space (%)' = "{0}{1}" -f [int]$percentFree, '%'
'Status' = $Status
}
# Add the object to the final report
$finalReport += New-Object psobject -property $tempObj
}
)
return $finalReport
您还可以将 if/else 条件的结果分配给变量,即 $Status=if ($percentFree -gt $Warning) { 'Normal' }
来可能创建更短的条件.
保存脚本后,通过在 PowerShell 中调用其名称来测试它。下面是该脚本如何工作的示例演示。
从输出中可以看出,每个磁盘的状态由可用磁盘空间百分比确定,这是通过 PowerShell If-Else 使用多个条件的结果。
多重和嵌套的 If-Else
假设您有一个 if-else 语句,其条件在 else
块中定义。当 if-else 语句运行时,如果 if
块内的代码返回 false,则调用 else
块。
在 else
块内部,您需要执行另一个条件测试。因此,您需要另一个 If-Else 语句。这种情况称为嵌套的 If-Else。如果内部 If-Else 依赖于外部 If-Else 中的运算结果,则通常使用嵌套的 If-Else 语句。
使用多个嵌套的 If-Else 语句可能会非常混乱。关键点是记住脚手架的位置并确保缩进代码。缩进代码将帮助您轻松识别和分隔 If-Else 语句。
多个/嵌套 If-Else 语句的示例
下面的示例脚本显示了多个和嵌套的 If-Else 如何相互依赖的结果。下面代码的逻辑如下。
- 如果
$SendEmail
为$false
,脚本将不执行任何操作并退出。 - 如果
$SendEmail
为$true
,则$From
和$To
变量不得为空或 null 。否则,$abortFlag
将设置为 1。 - 如果
$SendEmail
为$true
并且$CCEnabled
为$true
,则$CC
变量不能为空或 null。否则,$abortFlag
将设置为 1。 - 如果
$SendEmail
为$true
并且$BCCEnabled
为$true
,则$BCC
变量不能为空或 null。否则,$abortFlag
将设置为 1。 - 如果
$abortFlag
值为1,脚本将在此时退出并且不会继续。 - 如果
$abortFlag
值为 0,则脚本将继续执行直至结束。
复制下面的代码并将其另存为 Send-MyMail.ps1
。暂时不要更改任何值。
$SendEmail = $true
$From = ""
$To = ""
$CCEnabled = $true
$CC = ""
$BCCEnabled = $true
$BCC = ""
$abortFlag = 0
if ($SendEmail) {
if (!$From) {
Write-Host "[From] is missing" -ForegroundColor Red
$abortFlag = 1
}
if (!$To) {
Write-Host "[To] is missing" -ForegroundColor Red
$abortFlag = 1
}
if ($CCEnabled) {
if (!$CC) {
Write-Host "[CC] is missing" -ForegroundColor Red
$abortFlag = 1
}
}
if ($BCCEnabled) {
if (!$BCC) {
Write-Host "[BCC] is missing" -ForegroundColor Red
$abortFlag = 1
}
}
if ($abortFlag -eq 1) {
Write-Host "The abort flag has been tripped. Exit script." -ForegroundColor Red
break
}
else {
Write-Host "Your email will be sent from this address $From" -ForegroundColor Green
Write-Host "And will be sent to the following people:" -ForegroundColor Green
Write-Host "To: $To" -ForegroundColor Green
if ($CCEnabled -and $CC) {
Write-Host "CC: $CC" -ForegroundColor Green
}
if ($BCCEnabled -and $BCC) {
Write-Host "BCC: $BCC" -ForegroundColor Green
}
}
}
保存文件后,在 PowerShell 中运行它,如下所示。下面的演示显示了当变量值保持不变时脚本的结果。
接下来,编辑脚本并正确更新所有变量,如下面的代码片段。
$SendEmail = $true
$From = "[email "
$To = "[email "
$CCEnabled = $true
$CC = "[email "
$BCCEnabled = $true
$BCC = "[email "
---SNIP---
编辑变量后,保存脚本并再次运行。它应该显示相同的结果,如下所示。
现在,修改变量并尝试组合来测试嵌套的 If-Else 将如何受到影响。自行修改和测试将有助于您进一步理解逻辑。
概括
在本文中,您了解了条件逻辑构造 - PowerShell If 语句构造。 If-Else 语句允许脚本编写者制定条件逻辑并根据测试结果指导脚本的操作。
通过本文中的示例,您应该已经了解了在创建决策驱动代码时使用 If-Else 语句的方法和技术。如果使用单个条件,If-Else 可能很简单,但当您深入研究嵌套的 If-Else 语句时,它会变得更加复杂。
您如何看待 If-Else 语句?您认为阅读本文后您会越来越多地使用它吗?您还可以考虑哪些其他目的可以应用您在这里获得的知识?
进一步阅读
- 关于 If
- 回归基础:PowerShell foreach 循环
猜你还喜欢
- 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