【问题标题】:outputting only TRUE results to users仅向用户输出 TRUE 结果
【发布时间】:2013-01-14 15:30:21
【问题描述】:

Christian 在下面帮助了我,我也对其进行了一些更改以检查键的值。无论如何,我现在遇到的问题仍然是基于我提供给用户的输出。我不想显示键名,而是显示键的值。

键的值基于已发现为 TRUE 的键(在下面的代码中)。

所以,如果下面的结果对键 1(键的值为 ONE)、2(键的值为 2)和 3(键的值为 3)为 TRUE,那么我如何将 WRITE-HOST 放入用户仅根据特定键找到?

即,当特定情况下的所有参数都为 TRUE 时,我希望提供的结果具有以下输出之一。

Write-Host "The value of the keys are $keyvalue1"

Write-Host "The value of the keys are $keyvalue1 and $keyvalue2"

Write-Host "The value of the keys are $keyvalue1 and $keyvalue2 and $keyvalue3"

Write-Host "The value of the keys are $keyvalue1 and $keyvalue2 and $keyvalue3 and $keyvalue4"

代码如下:

$keyvalue1 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 1).'1'
$keyvalue2 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 2).'2'
$keyvalue3 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 3).'3'
$keyvalue4 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 4).'4'

$testpath1 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 1).'1' -ne $null 2>$null
$testpath2 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 2).'2' -ne $null 2>$null
$testpath3 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 3).'3' -ne $null 2>$null
$testpath4 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 4).'4' -ne $null 2>$null

 $a = $testpath1, $testpath2 , $testpath3 , $testpath4 # convert your true/false results in an array
$s = "" # empty string
$i = 1 # a simple variable as index
foreach ($b in $a)
 {
   if ($b -ne $true ) 
   { 
     break
   } 

   $s += "$i " # if true add index in string
   $i++
}

"$($s)is/are true" #output the result

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    为什么要重复 Get-ItemProperty 调用?您已经拥有存储在 $keyvalue 中的值(或缺少值)。您应该可以将其简化为:

    $keyVals = @()
    $keyVals += (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 1).1
    $keyVals += (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 2).2
    $keyVals += (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 3).3
    $keyVals += (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 4).4
    
    Write-Host "The value of keys are " -NoNewLine
    $first = $true
    foreach ($keyVal in $keyVals) {
        if ($keyVal -ne $null) {
            if (!$first) { 
                Write-Host " and " -NoNewLine 
            }
            $first = $false
            Write-Host $keyVal -NoNewLine
        }
    }
    Write-Host 
    

    【讨论】:

    • 我为什么要复制它......因为我不如你:-) 非常感谢 - 你的代码有效,我得到了预期的结果。一个问题 - @() 做什么?
    • 只需确保 $keyVals 是一个数组 - 开始时为空。 PowerShell 真的很容易上手,不需要那个声明。但是,如果您返回的第一个值是一个字符串,那么 $keyVals 就是一个字符串,随后使用 += 只是将这些值连接到字符串。
    【解决方案2】:

    试试这个(未测试):

    $keyvalue1 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 1).'1'
    $keyvalue2 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 2).'2'
    $keyvalue3 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 3).'3'
    $keyvalue4 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 4).'4'
    $testpath1 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 1).'1' -ne $null 2>$null
    $testpath2 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 2).'2' -ne $null 2>$null
    $testpath3 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 3).'3' -ne $null 2>$null
    $testpath4 = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\$CommunityName -Name 4).'4' -ne $null 2>$null
    
     $a = $testpath1, $testpath2 , $testpath3 , $testpath4 # convert your true/false results in an array
    
    $v = $keyvalue1,$keyvalue2,$keyvalue2,$keyvalue4 
    $s = "The value of the keys are " # empty string
    $i = 1 # a simple variable as index
    foreach ($b in $a)
     {
       if ($b -ne $true ) 
       { 
         break
       } 
    
       $s += "$($v[$i]) " # if true add value of $v[index] in string
       $i++
    }
    
    "$s" #output the result
    

    【讨论】:

    • 谢谢 - 我没有得到任何输出 - 我得到的只是:“键的值是” - 不太清楚为什么,因为它看起来与以前相似。另外,我注意到我在 $keyname(1-4) 下定义变量 - 但是,如果密钥不存在,我会在 powershell 中收到一个错误,说它找不到密钥的路径。如何抑制添加变量时的错误?
    • 我可以在顶部添加一个 $ErrorActionPreference = "silentlycontinue" 来停止错误。但是,我仍然没有从输出中得到任何回报。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多