powershell 如何正确使用IF函数?

uyhoqukh  于 2023-06-23  发布在  Shell
关注(0)|答案(1)|浏览(146)

下面的函数返回一个结果,但是当我在IF语句中指定值时,它只返回“Yes”,无论我在-eq值中输入什么。

function GetRemoteLogonStatus ($computer = 'localhost') { 
if (Test-Connection $computer -Count 2 -Quiet) { 
    try { 
        $user = $null 
        $user = gwmi -Class win32_computersystem -ComputerName $computer | select -ExpandProperty username -ErrorAction Stop 
        } 
    catch { "Not logged on"; return } 
    try { 
        if ((Get-Process logonui -ComputerName $computer -ErrorAction Stop) -and ($user)) { 
            "Workstation locked by $user" 
            } 
        } 
    catch { if ($user) { "$user logged on" } } 
    } 
else { "$computer Offline" } 
}
if (getremotelogonstatus -eq "blah blah blah")
{
write-host "Yes"
}
Else
{
Write-Host "no"
}

谢谢

bkhjykvo

bkhjykvo1#

**对于来自 command(例如GetRemoteLogonStatus)的输出以参与 expression,命令调用(包括其参数,如果有的话)必须包含在(...)**中,分组运算符:

if ((GetRemoteLogonStatus) -eq "blah blah blah") {
  "Yes"
}
Else {
  "No"
}

注意事项:

  • 如果该命令输出 * 多个 * 对象,则-eq运算符将充当 * 过滤器 *,并且将返回 * 匹配元素的子数组 *,而不是返回$true$false-请参阅概念性about_Comparison_Operators帮助主题。
  • 要了解有关PowerShell的两种基本 * 解析模式 * 的更多信息,请参阅 * 参数 (命令)模式与 expression mode -参见this answer
    (...)中的封装也是需要的,因为使用命令的输出作为另一个命令的 * 参数
    (该示例有些人为,因为很少需要显式使用Write-Output):
# Pass the output from GetRemoteLogonStatus as an argument to Write-Output
Write-Output -InputObject (GetRemoteLogonStatus)

至于你尝试了什么
getremotelogonstatus -eq "blah blah blah"

  • 由于此代码段是以 argument 模式解析的,因此它调用命令getremotelogonstatus并 * 将-eqblah blah blah作为参数传递给它 *。
  • 由于您的命令既没有正式声明参数(使用param(...)块),也没有处理包含未绑定位置参数的自动$args变量,因此这些参数实际上被 * 忽略 *。

相关问题