使用哈希表的多列输出
Multiple column output using a hashtable
我正在尝试创建一个包含 3 列的哈希 Table。
SERVER_NAME PROCESS_NAME SERVER_STATUS PROCESS_AVAILABLE
SERVER1 app1.exe RUNNING YES
SERVER1 app2.exe RUNNING NO
SERVER2 app1.exe OFFLINE NO
SERVER2 app2.exe OFFLINE NO
SERVER3 app1.exe RUNNING YES
SERVER3 app2.exe RUNNING YES
到目前为止,我已经试过了
$SERVERLIST = Get-Content "$PSScriptRoot\servers\serverManager.bin"
$PROCESSMONITOR = Get-Content "$PSScriptRoot\process\application.bin"
$testList = @{Name=$SERVERLIST;Process=$PROCESSMONITOR}
服务器列表在 "serverManager.bin" 文件中。这是包含服务器列表的 CSV 文件。
我有兴趣监视的进程列表在 "application.bin" 文件中。这是一个包含应用程序列表的 CSV 文件(如 PowerShell 所见)。 [见下面的代码]
Get-Process -ComputerName $server -name $process -ErrorAction SilentlyContinue
我想构建一个报告,告诉管理员哪个服务器是 运行,哪个进程是我们有兴趣监视的列表中的 运行。
我可以检查进程是否 运行
我可以检查服务器是否在线
我的问题是我需要做什么才能像上面发布的那样得到输出
虽然哈希表在这个答案中发挥了作用,但您实际上根本不是在寻找哈希表。看着 about_hash_tables
A hash table, also known as a dictionary or associative array, is a
compact data structure that stores one or more key/value pairs.
虽然您可以将任何您想要的值嵌套到值中,但您实际上并不是在寻找哈希表。我认为您想要的是一个包含每个查询结果的自定义 PowerShell 对象。
Get-Process
确实为 -Computer
和 -Name
采用数组,但它们会忽略计算机不存在或进程不存在的结果。由于您需要该信息,因此您需要 运行 每个 computer/process 对的单个 cmdlet。
我只使用哈希表来创建每个个体 "row",它被转换为 PowerShell 对象并收集为数组。我不想混淆,但我知道这至少适用于 2.0,这就是我这样做的原因。
$SERVERLIST | ForEach-Object{
$computer = $_
$PROCESSMONITOR | ForEach-Object{
$process = $_
$props = @{
Server_Name = $computer
Process_Name = $process
}
# Check if the computer is alive. Better this was if $processes is large
If(Test-Connection $computer -Quiet -Count 1){
$props.Server_Status = "Running"
$result = Get-Process -Name $process -ComputerName $computer -ErrorAction SilentlyContinue
If($result){
$props.Process_Available = "Yes"
} else {
$props.Process_Available = "No"
}
} else {
$props.Server_Status = "Offline"
$props.Process_Available = "No"
}
New-Object -TypeName psobject -Property $props
}
} | Select Server_Name,Process_Name,Server_Status,Process_Available
现在我们有了合适的对象,您现在可以使用其他 cmdlet,如 Where-Object
、Sort-Object
等
我正在尝试创建一个包含 3 列的哈希 Table。
SERVER_NAME PROCESS_NAME SERVER_STATUS PROCESS_AVAILABLE
SERVER1 app1.exe RUNNING YES
SERVER1 app2.exe RUNNING NO
SERVER2 app1.exe OFFLINE NO
SERVER2 app2.exe OFFLINE NO
SERVER3 app1.exe RUNNING YES
SERVER3 app2.exe RUNNING YES
到目前为止,我已经试过了
$SERVERLIST = Get-Content "$PSScriptRoot\servers\serverManager.bin"
$PROCESSMONITOR = Get-Content "$PSScriptRoot\process\application.bin"
$testList = @{Name=$SERVERLIST;Process=$PROCESSMONITOR}
服务器列表在 "serverManager.bin" 文件中。这是包含服务器列表的 CSV 文件。
我有兴趣监视的进程列表在 "application.bin" 文件中。这是一个包含应用程序列表的 CSV 文件(如 PowerShell 所见)。 [见下面的代码]
Get-Process -ComputerName $server -name $process -ErrorAction SilentlyContinue
我想构建一个报告,告诉管理员哪个服务器是 运行,哪个进程是我们有兴趣监视的列表中的 运行。
我可以检查进程是否 运行 我可以检查服务器是否在线
我的问题是我需要做什么才能像上面发布的那样得到输出
虽然哈希表在这个答案中发挥了作用,但您实际上根本不是在寻找哈希表。看着 about_hash_tables
A hash table, also known as a dictionary or associative array, is a compact data structure that stores one or more key/value pairs.
虽然您可以将任何您想要的值嵌套到值中,但您实际上并不是在寻找哈希表。我认为您想要的是一个包含每个查询结果的自定义 PowerShell 对象。
Get-Process
确实为 -Computer
和 -Name
采用数组,但它们会忽略计算机不存在或进程不存在的结果。由于您需要该信息,因此您需要 运行 每个 computer/process 对的单个 cmdlet。
我只使用哈希表来创建每个个体 "row",它被转换为 PowerShell 对象并收集为数组。我不想混淆,但我知道这至少适用于 2.0,这就是我这样做的原因。
$SERVERLIST | ForEach-Object{
$computer = $_
$PROCESSMONITOR | ForEach-Object{
$process = $_
$props = @{
Server_Name = $computer
Process_Name = $process
}
# Check if the computer is alive. Better this was if $processes is large
If(Test-Connection $computer -Quiet -Count 1){
$props.Server_Status = "Running"
$result = Get-Process -Name $process -ComputerName $computer -ErrorAction SilentlyContinue
If($result){
$props.Process_Available = "Yes"
} else {
$props.Process_Available = "No"
}
} else {
$props.Server_Status = "Offline"
$props.Process_Available = "No"
}
New-Object -TypeName psobject -Property $props
}
} | Select Server_Name,Process_Name,Server_Status,Process_Available
现在我们有了合适的对象,您现在可以使用其他 cmdlet,如 Where-Object
、Sort-Object
等