PowerShell脚本-区分3个命令结果

时间:2018-07-19 12:47:44

标签: powershell conditional

谁能告诉我为什么我总是得到相同的输出结果?

$syslocal = Get-WmiObject -Class Win32_UserAccount -Filter "localaccount=true" |
            where {$_.Disabled -eq $False}
if ($syslocal -eq "") {
    Write-Host "Syslocal Enabled"
    exit 0
} else {
    Write-Host "No Syslocal"
    exit 0
}

它只需要查看syslocal帐户是否存在以及是否已启用 有3个结果:

  • 写主机:syslocal不存在,退出0
  • 写入主机:syslocal存在,但已被禁用,退出0
  • 写入主机:syslocal存在并已启用,退出1010

但是所有结果都是相同的。

3 个答案:

答案 0 :(得分:5)

如果您的Get-WmiObject | Where-Object语句找到匹配项,则变量$syslocal将包含WMI对象列表。如果该语句找不到匹配项(即不存在本地帐户或所有本地帐户均被禁用),则该变量将为空。空值或对象数组都不等于空字符串,因此您的检查将始终评估为$false

另外,对于3向检查,您实际上需要检查3种方法。

将您的代码更改为类似的代码,它应该可以完成您期望的工作。

$syslocal = Get-WmiObject -Class Win32_UserAccount -Filter 'localaccount=true'

if ($syslocal) {
    if ($syslocal | Where-Object {-not $_.Disabled}) {
        Write-Host 'Enabled local accounts exist.'
        exit 1010
    } else {
        Write-Host 'Local accounts exist, but are disabled.'
    }
} else {
    Write-Host 'No local accounts.'
}
exit 0

答案 1 :(得分:1)

此行是错误的:

if ($syslocal -eq "")

如果存在,它仍然不等于""

这应该是:

if ($syslocal) 

更多细节已经在Ansgar Wiechers答案中进行了解释...

答案 2 :(得分:0)

还有这个。

$syslocal = Get-WmiObject -Class win32_useraccount -filter "localaccount=true"
Foreach($account in $syslocal){
    If ($syslocal) {
        if($account.Disabled -eq $true) {
            Write-Host "$($account.name) is currently Disabled"
        } Else {
            Write-Host "$($account.name) is currently Enabled"
        }
    } Else {
        Write-host "Just no..."
    }
}