我写了一个获取一些集群信息的PowerShell脚本。我需要的一个栏目来自管道中的第一个参数,我无法找到一种方法来返回它的价值。
function Get-SQL-Clusters {
Param([string]$server)
$servers = Get-Content -LiteralPath "C:\temp\sql_clusters.txt"
if ($server -ne 1) {
$files = foreach ($box in $servers) {
Invoke-Command -ComputerName $box {
Get-ClusterResource | Get-ClusterParameter
} | Where-Object {
$_.Name -eq "Address"
} | Format-Table PSComputerName, ClusterObject, State, Name, Value -AutoSize
}
} else {
Write-Warning "'$server' is not a valid path."
}
return $files
}
当我运行它时,我得到了我需要的数据,但State是空白的。它位于Get-ClusterResource
,但我正在寻找的IP就在Get-ClusterParameter
。
理想情况下,我想返回群集的名称,每个永久名称,它的IP以及它的当前状态,以便我可以看到活动IP是在主站点上还是在DR网站。
答案 0 :(得分:1)
您对Invoke-Command
的调用将Get-ClusterResource | Get-ClusterParameter
次调用放入其自己的脚本块{...}
,然后将评估这些表达式的结果通过管道传输到Where-Object
cmd。这可能不是预期的操作顺序。
使用管道中间位置的Select-Object
cmdlet投影结果,以便在以后阶段访问所需的属性(未检查特定语法; YMMV):
Invoke-Command -ComputerName $box { Get-ClusterResource | Select-Object -Property State, @{Name="ClusterParameter";Expression = {(Get-ClusterParameter -InputObject $_) }}| Where-Object { $_.ClusterParameter.Name -eq ...
会产生如下对象:
State | ClusterParameter
------------------------
foo ClusterParameter.ToString()
答案 1 :(得分:0)
几乎是最终的代码。它不是100%完成,但我现在得到状态和IP值,稍后将修复其余部分。我做的另一个改变是停止使用文本文件并为我的服务器创建一个哈希表,因为我对文本文件有格式化问题。
function Get-SQL-Clusters-scrap
{
param([string]$server)
import-module c:\temp\sql_hashtable2.ps1
$servers = $sql_servers.hadr
if ($server -ne 1)
{
$files = ForEach ($box in $servers) {invoke-command -ComputerName $box {Get-ClusterResource |
foreach-object {($state) = ($_.State); $_ |
get-clusterparameter |Where-Object {$_.Name -eq "Address"} |
Format-Table ClusterObject,@{Name=”State”;Expression={$state}}, Name, Value, PSComputerName -AutoSize}}}
}
else
{Write-Warning "'$server' is not a valid path."}
return $files
}