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

[玩转系统] 回归基础:使用 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 的基本流程。

[玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

当 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 中将得到如下所示的结果。

[玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

现在,如果您想添加默认的“后备”操作,而不是在测试结果为 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 If 语句的条件逻辑

从 PowerShell 7.0 开始,引入了使用三元运算符的 If 语句的新语法。单个 If 语句可以很好地利用这种新语法。

使用上面的相同示例,这就是使用三元运算符的代码的外观。

$num = 11
$num -gt 10 ? "$num is greater than 10" : "$num is NOT greater than 10"

[玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

在 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

[玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

使用 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 中运行时的行为方式。

[玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

报告可用磁盘空间状态

可用磁盘空间报告是系统管理员的一项常见任务。在 Windows 机器上报告固定磁盘空间信息的常用方法围绕以下代码。

Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$_.DriveType -eq 3}

上面的代码将返回的信息类似于下一个屏幕截图中显示的信息。

[玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

如您所见,上面的输出显示了驱动器号、可用空间值和其他属性。虽然上面的输出很好,但并不直观。信息的呈现方式并不表明磁盘空间是处于严重或警告状态还是正常。

使用 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 语句的条件逻辑

    从输出中可以看出,每个磁盘的状态由可用磁盘空间百分比确定,这是通过 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 中运行它,如下所示。下面的演示显示了当变量值保持不变时脚本的结果。

    [玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

    接下来,编辑脚本并正确更新所有变量,如下面的代码片段。

    $SendEmail = $true
    
    $From = "[email "
    $To = "[email "
    
    $CCEnabled = $true
    $CC = "[email "
    
    $BCCEnabled = $true
    $BCC = "[email "
    
    ---SNIP---

    编辑变量后,保存脚本并再次运行。它应该显示相同的结果,如下所示。

    [玩转系统] 回归基础:使用 PowerShell If 语句的条件逻辑

    现在,修改变量并尝试组合来测试嵌套的 If-Else 将如何受到影响。自行修改和测试将有助于您进一步理解逻辑。

    概括

    在本文中,您了解了条件逻辑构造 - PowerShell If 语句构造。 If-Else 语句允许脚本编写者制定条件逻辑并根据测试结果指导脚本的操作。

    通过本文中的示例,您应该已经了解了在创建决策驱动代码时使用 If-Else 语句的方法和技术。如果使用单个条件,If-Else 可能很简单,但当您深入研究嵌套的 If-Else 语句时,它会变得更加复杂。

    您如何看待 If-Else 语句?您认为阅读本文后您会越来越多地使用它吗?您还可以考虑哪些其他目的可以应用您在这里获得的知识?

    进一步阅读

    • 关于 If
    • 回归基础:PowerShell foreach 循环

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

    取消回复欢迎 发表评论:

    关灯