【问题标题】:powershell Foreach-Objectpowershell Foreach-对象
【发布时间】:2012-09-11 13:15:56
【问题描述】:

我有这个数组(简化):

$v = 3,5,3,6,8,3,5,7

我需要检查所有值是否都高于 3。我认为 Foreach 或 Foreach-Object 将适合此任务,但我无法弄清楚它的工作方式。

我尝试过类似的方法,但它不起作用。

$v | Foreach-Object (if($_ -lt 10){Write-Host "$_ lt 10"})

编辑:

谢谢你们! 我将语句更改为:

$v | Foreach-Object {if($_ -lt 10){$check_value = "True"}}

它现在可以工作了,但我刚刚意识到,简单化的数组不是一个好主意。我正在使用的数组中的数据是从 MS SQL 数据库中获取的。如果我在屏幕上显示数组,我会得到数字,但数据类型是 System.Data.DataRow,我无法与数字进行比较。我收到错误消息:

Bad argument to operator '-lt': Could not compare "System.Data.DataRow" to "95". Error: "Cannot convert the "95" value of type "System.Int32" to type "System.Data.DataRow".".

EDIT2:

飞溅的比特:

我正在使用你的代码,一切正常,但我无法通过这个比较:

$rowsGreaterThanThree.Count -eq $v.Count

$rowsGreaterThanThree 的值是:

处理器时间

0.00127998361620918
1.53972183002211
0.00127998361620918
0.00127998361620918
0.00127998361620918
1.53972183002211
0.00127998361620918
0.00127998361620918
0.00127998361620918
3.1262399841282
0
0
0
0
0

并且 $v 包含:

处理器时间

0.00127998361620918
1.53972183002211
0.00127998361620918
0.00127998361620918
0.00127998361620918
1.53972183002211
0.00127998361620918
0.00127998361620918
0.00127998361620918
3.1262399841282
0
0
0
0
0

值相同,但 $v 中的“ProcessorTime”下方还有一个空白行(此处不可见)。 Count 在 $rowsGreaterThanThree.Count 中给出 16 而不是 15。

我的代码:(我将 -gt 修改为 -ge,因为有零。在工作版本中,我想检查处理器是否在一段时间内加载到 95% 以上。)

$warning_values = @( $check | Where-Object { $_.ProcessorTime -ge 0 } )
if($warning_values.Count -eq $check.Count )
    {
        Write-Host -ForegroundColor "Warning!"
        }
        else { Write-Host "nothing"}

【问题讨论】:

  • 这不起作用的原因是您需要将 foreach 语句包装在方括号 {} 而不是括号中。
  • 哈哈,有人到那里是因为截至 2020 年 1 月 23 日的误导性博客,例如 this one

标签: powershell powershell-2.0 powershell-remoting


【解决方案1】:

简单:)

PS> $v -gt 3
5
6
8
5
7

或者

$v | Where-Object { $_ -gt 3 }

【讨论】:

    【解决方案2】:

    Shay 的例子很完美:使用Where-Object 过滤数组中的项目。

    因为您的对象是DataRow 对象,所以您需要对列进行过滤:

    $rowsGreaterThanThree = @( $v | Where-Object { $_.ColumnName -gt 3 } )
    if( $rowsGreaterThanThree.Count -eq $v.Count )
    {
      Write-Host "All the rows are greater than 3!"
    }
    

    ColumnName 替换为包含您要过滤的实际值的列的名称。

    您也可以在 SQL 中使用WHERE 子句执行此操作:

    SELECT * FROM Table WHERE Column > 3
    

    然后,您可以从 SQL Server 中获得所需的值。当然,您的脚本中也可能需要未过滤的值。

    【讨论】:

    • 这得到> 3个值,但你应该添加如何检查他的实际问题-如何确定如果所有都是> 3。需要将查询包装在@() 中并检查.Count,对于powershell 新手来说可能并不明显:)
    • @latkin 谢谢。我没有仔细阅读。我已经更新了我的答案。
    • 谢谢你,飞溅的位。正如我上面提到的,我想检查一段时间的处理器时间,当它的负载超过 95% 时,我想做一些动作。因此,我认为我需要数据库中的所有数据(例如最后 20 行)并识别每个值中的负载是否高于 95%。我还不知道如何获得最后 20 行,但这是另一个问题;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多