powershell Foreach-Object

3

我希望你能翻译以下数组(简化版):

$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".".

编辑2:

splatteredbits:

我正在使用你的代码,一切都运行良好,但是我无法通过这个比较:

$rowsGreaterThanThree.Count -eq $v.Count
$rowsGreaterThanThree的值为:

ProcessorTime

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

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"下方多出了一行空白(这里不可见)。$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"}

1
这个不起作用的原因是你需要用大括号 {} 而不是圆括号 () 包裹 foreach 语句。 - Chris N
哈哈,有人因为误导性的博客到那里了吗,就像2020年1月23日这个博客一样? - xpt
2个回答

5

简单 :)

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
@latkin 谢谢。我没有仔细阅读。我已经更新了我的答案。 - Aaron Jensen
谢谢,splattered bits。正如我上面提到的,我想要检查一个时间段内的处理器时间,并且当负载超过95%时,我想执行一些操作。因此,我认为我需要从数据库中获取所有数据(例如最后20行),并识别每个值是否超过95%的负载。我还不知道如何获取最后20行,但这是另一个问题;) - culter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接