我正在尝试创建一个包含3列的哈希表。
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
我想构建一个报告,告诉管理员哪个服务器正在运行,以及我们有兴趣监控的列表中正在运行哪个进程。
我可以检查进程是否正在运行 我可以检查服务器是否在线
我的问题是我需要做些什么才能获得上面发布的内容
答案 0 :(得分:4)
虽然哈希表在这个答案中扮演了一个角色,但你并不是真的想要哈希表。看about_hash_tables
哈希表,也称为字典或关联数组,是一种 紧凑的数据结构,存储一个或多个键/值对。
虽然你可以将任何你想要的东西嵌入到值中,但你真的不想要哈希表。我认为你想要的是一个自定义的PowerShell对象,它包含每个查询的结果。
Get-Process
确实为-Computer
和-Name
采用了数组,但是如果计算机不存在或进程没有,则会忽略结果。由于您需要该信息,因此需要为每个计算机/进程对运行一个cmdlet。
我只使用哈希表来创建每个单独的“行”,该行被转换为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
等。