我有这个数组(简称):
$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:
splatteredbits:
我正在使用你的代码,一切正常,但我不能通过这个比较:
$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
值是相同的,但在“ProcessorTime”下面的$ v中还有一行空白(此处不可见)。 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"}
答案 0 :(得分:4)
简单:)
PS> $v -gt 3
5
6
8
5
7
或者
$v | Where-Object { $_ -gt 3 }
答案 1 :(得分: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中获取所需的值。当然,您也可能需要脚本中未过滤的值。