Powershell Where-Object с массивом перечислений
Я хочу предметы из Get-NlbClusterNode
который содержит состояние "Converged"
(Перечисление [Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeStatusCode]
)
Я попробовал что-то подобное:
Get-NlbClusterNode | %{ $_.State | ?{$_.ToString() -eq "Converged"} }
Но это дает мне только соответствующее состояние.
Я попробовал contains
оператор
Get-NlbClusterNode | ?{ $_.State -ccontains "Converged"}
# or
Get-NlbClusterNode | ?{ $_.State -ccontains [Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeStatusCode]::Converged}
Но это не работает эфир.
Это PowerShell-объект
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0">
<TN RefId="0">
<T>System.Collections.Generic.List`1[[Microsoft.NetworkLoadBalancingClusters.PowerShell.Node, Microsoft.NetworkLoadBalancingClusters.PowerShell, Version=6.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]</T>
<T>System.Object</T>
</TN>
<LST>
<Obj RefId="1">
<TN RefId="1">
<T>Microsoft.NetworkLoadBalancingClusters.PowerShell.Node</T>
<T>System.Object</T>
</TN>
<ToString>Server02</ToString>
<Props>
<Obj N="Cluster" RefId="2">
<TN RefId="2">
<T>Microsoft.NetworkLoadBalancingClusters.PowerShell.Cluster</T>
<T>System.Object</T>
</TN>
<ToString />
<Props>
<S N="Name"></S>
<S N="ClusterIPAddress">192.168.0.20</S>
<S N="ClusterNetworkMask">255.255.255.0</S>
<S N="ClusterMacAddress">03-12-c0-a8-56-ac</S>
<S N="OperationMode">MULTICAST</S>
<B N="BdaReverseHash">false</B>
<B N="BdaTeamActive">false</B>
<Nil N="BdaTeamId" />
<B N="BdaTeamMaster">false</B>
</Props>
<MS>
<S N="ClusterName"></S>
<S N="IPAddress">192.168.0.20</S>
</MS>
</Obj>
<S N="Name">Server02</S>
<S N="InterfaceName">NLB</S>
<S N="Host">Server02</S>
<Obj N="State" RefId="3">
<TN RefId="3">
<T>Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeStatus</T>
<T>System.Object</T>
</TN>
<ToString>Converged</ToString>
<Props>
<S N="NodeStatusCode">Converged</S>
</Props>
</Obj>
<I32 N="HostPriority">4</I32>
<S N="AdapterGuid">{8FEAE540-F32E-42D0-940B-6E34E5977E77}</S>
<Obj N="InitialHostState" RefId="4">
<TN RefId="4">
<T>Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeInitialHostState</T>
<T>System.Enum</T>
<T>System.ValueType</T>
<T>System.Object</T>
</TN>
<ToString>Started</ToString>
<I32>1</I32>
</Obj>
<B N="PersistSuspendOnReboot">false</B>
<B N="MaskSourceMac">true</B>
<I32 N="FilterIcmp">0</I32>
<I32 N="GreDescriptorTimeout">10</I32>
</Props>
</Obj>
<Obj RefId="5">
<TNRef RefId="1" />
<ToString>Server01</ToString>
<Props>
<Ref N="Cluster" RefId="2" />
<S N="Name">Server01</S>
<S N="InterfaceName">NLB</S>
<S N="Host">Server01</S>
<Obj N="State" RefId="6">
<TNRef RefId="3" />
<ToString>Converged(default)</ToString>
<Props>
<S N="NodeStatusCode">Default</S>
</Props>
</Obj>
<I32 N="HostPriority">3</I32>
<S N="AdapterGuid">{B47F1065-2E61-49A9-BFBB-E172EA9444E6}</S>
<Obj N="InitialHostState" RefId="7">
<TNRef RefId="4" />
<ToString>Started</ToString>
<I32>1</I32>
</Obj>
<B N="PersistSuspendOnReboot">false</B>
<B N="MaskSourceMac">true</B>
<I32 N="FilterIcmp">0</I32>
<I32 N="GreDescriptorTimeout">10</I32>
</Props>
</Obj>
</LST>
</Obj>
</Objs>
Вот тип Microsoft.NetworkLoadBalancingClusters.PowerShell.Node
TypeName: Microsoft.NetworkLoadBalancingClusters.PowerShell.Node
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
AdapterGuid Property string AdapterGuid {get;set;}
Cluster Property Microsoft.NetworkLoadBalancingClusters.PowerShell.Cluster Cluster {get;set;}
FilterIcmp Property int FilterIcmp {get;set;}
GreDescriptorTimeout Property int GreDescriptorTimeout {get;set;}
Host Property string Host {get;set;}
HostPriority Property int HostPriority {get;set;}
InitialHostState Property Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeInitialHostState InitialHost
InterfaceName Property string InterfaceName {get;set;}
MaskSourceMac Property bool MaskSourceMac {get;set;}
Name Property string Name {get;set;}
PersistSuspendOnReboot Property bool PersistSuspendOnReboot {get;set;}
State Property Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeStatus State {get;set;}
2 ответа
Я использую следующее:
$objClusterNode = Get-NlbClusterNode $env:COMPUTERNAME
[string]$strStatus = $objClusterNode | select -expand state
if ($strStatus -ne "Converged") {Do stuff}
Работает как шарм!
Так что я тоже исследовал это и придумал следующее. Обратите внимание, что у меня есть 2 сервера в моем узле, поэтому [0] возвращается с кодом 1009 "Конвергент (по умолчанию)" [1] возвращается с кодом 1008 Конвергенция.
if ((Get-NlbClusterNode -HostName <Name>).state[0].NodeStatusCode.value__ -ne "1008") {write-host "not 1008"} else {Write-Host "it is 1009"}
Это также дает информацию довольно быстро, если вы просто выводите текст. Я спорю о том, как обрабатывать различные коды # прямо сейчас.
(Get-NlbClusterNode -HostName BN1WUSSQL6LA331).state
Get-NlbClusterNode | ?{$_.State.NodeStatusCode -eq [Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeStatusCode]::Converged}
или
Get-NlbClusterNode | ?{$_.State.NodeStatusCode -eq "Converged"}
Поскольку State
у собственности есть другая собственность NodeStatusCode
PS C:\Windows\system32> Get-NlbClusterNode | %{$_.State | Get-Member}
TypeName: Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeStatus
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
NodeStatusCode Property Microsoft.NetworkLoadBalancingClusters.PowerShell.NodeStatusCode NodeStatusCode {get;set;}