如何比较powershell管道阵列的项目

时间:2018-03-02 13:52:46

标签: powershell

我需要一个PowerShell脚本,它从另一个PowerShell脚本中获取信息。

在我看来,它是我在脚本中获得的数组,所以我尝试将一个项目或整个数组与一个字符串进行比较。

我将在Exchange群集上执行此命令:

Get-ClusterResource |fl State|.\CheckDAG1.ps1

第一个脚本是一个内置的Exchange脚本来获取文件共享见证的状态,第二个脚本是我的,看起来像这样:

Param (
       [parameter(ValueFromPipeline=$True)]
       [string[]]$Status
    )
echo $Input.count
echo $Input
if ($input[2] -contains  "Online") {
    echo "1"}
else {
    echo "0"}

输出是这样的:

5
State : Online
0

所以我可以看到数组有5个项目,第2项是写入的行,但结果是0

我能做什么,结果是1正如我所期待的那样?

2 个答案:

答案 0 :(得分:1)

Get-ClusterResource返回一个对象,PowerShell将在控制台中显示为一个表。对象的属性显示为表头。

示例:

Get-ClusterResource

(我使用名为资源的单个群集作为示例)

要使用这些属性,您可以选择它们:

Get-ClusterResource -Name "Cluster Disk 1" | Select-Object State

这将只返回单个属性:

PS >
State
-----
Online

然后使用ExpandProperty param将只返回属性的值:

Get-ClusterResource -Name "Cluster Disk 1" | Select-Object -ExpandProperty State
PS > Online

将上述内容应用于您的代码:

.\CheckDAG1.ps1 -Status (Get-ClusterResource -Name "Cluster Disk 1" | Select-Object -ExpandProperty State)

CheckDAG1.ps1:

Param (
    [parameter(ValueFromPipeline=$True)]
    [string]$Status
)
if ($Status -eq "Online") { echo "1" }
else { echo "0" }

答案 1 :(得分:0)

我们从哪里开始......

如果您Get-Cluster 'foo' | Get-ClusterResource | fl State,您将获得一个类似

的列表
Status : Online

Status : Online

Status : Offline

尝试使用以下内容......

$(Get-Cluster 'foo' | get-clusterresource).State

这将为您提供整齐的字符串列表,但会返回原始脚本。您是否100%确定您获得了该属性的值,而不是Microsoft.PowerShell.Commands.Internal.Format.FormatEndData类型的限定名称?我仔细检查。

## Returns a single 1 or 0. 1 if there is at least 1 online resource, 0 if not
if ($status -contains 'Online') { 1 } else { 0 }

## Returns a 1 or 0 for each status in the array. 1 if the status is online, otherwise 0
$status | % { if ($_ -eq 'Online') { 1 } else { 0 } } 

希望这有帮助。