[英]Formatting my output results from a hashtable in powershell
所以這是我的問題,當您使用PowerShell和哈希表格式化輸出時,我確定您已經看過1000遍了。 因此,我編寫了一個腳本,該腳本將從遠程服務器(如HD,MEM,CPU等)收集所有要點。首先,我想說腳本可以正常工作,也就是說,我對輸出到csv的格式存在疑問。 我在尋找的建議是如何幫助我將輸出的每個HD捕獲到自己的列或定界符中,以用於具有多個驅動器以及其他所有功能的系統。
因此,這是我的功能齊全的腳本:
$OutFile = "$psscriptroot\sys_info.csv"
$Status = @()
$HDCAP = @()
$ArrComputers = "."
#Specify the list of PC names in the line above. "." means local system
#Clear-Host
foreach ($Computer in $ArrComputers)
{
$computerSystem = get-wmiobject Win32_ComputerSystem -Computer $Computer
$computerBIOS = get-wmiobject Win32_BIOS -Computer $Computer
$computerOS = get-wmiobject Win32_OperatingSystem -Computer $Computer
$computerCPU = get-wmiobject Win32_Processor -Computer $Computer
$computerHDD = Get-WmiObject Win32_LogicalDisk -ComputerName $Computer -Filter drivetype=3
$exp = @{Expression={$_.Server };Label="Computer_Name"},
@{Expression={$_.Manufacturer };Label="Manufacturer/Model"},
@{Expression={$_.Serial };Label="Serial #"},
@{Expression={$_.Processor };Label="Processor"},
@{Expression={$_.Harddrive};Label="Harddrive"},
@{Expression={$_.TotalMemorySize};Label="TotalMemorySize"},
@{Expression={$_.LastRebootTime};Label="LastRebootTime"}
foreach($sys in $computerSystem)
{
$mf = $sys | select Manufacturer,Model
}
foreach($cs in $computerSystem)
{
$mem = $cs | select -Property @{Name = "MemorySize GB" ; Expression = { $_.TotalPhysicalMemory/1GB –as [int] } }
}
foreach($CB in $computerBIOS)
{
$ser = $cb | select SerialNumber
}
foreach($CPU in $computerCPU)
{
$PRCR = $CPU | select name
}
foreach($HD in $computerHDD)
{
$HDCAP += $HD| select -Property DeviceID,
@{Name = "SizeGB" ; Expression = { $_.Size/1GB –as [int] } },
@{Name= "FreeGB"; Expression={[math]::Round($_.Freespace/1GB,2)}}
}
foreach($OS in $computerOS)
{
$CPOS = $os | select -Property @{Name = "LastBootUpTime " ; Expression = {$OS.ConvertToDateTime($OS.LastBootUpTime)}}
}
$Status += (@{
Server = $Computer
Manufacturer = $Mf
Serial = $ser
Processor = $PRCR
Harddrive = $HDCAP
TotalMemorySize = $mem
LastRebootTime = $CPOS
})
}
$Status | select-object $exp
這是我收到的輸出的副本:
Computer_Name : .
Manufacturer/Model : @{Manufacturer=Micro-Star International Co., Ltd; Model=MS-0000}
Serial # : @{SerialNumber=To be filled by O.E.M.}
Processor : @{name=AMD Ryzen 5 1600 Six-Core Processor }
Harddrive : {@{DeviceID=C:; SizeGB=447; FreeGB=158.99}, @{DeviceID=D:; SizeGB=931; FreeGB=473.66}, @{DeviceID=F:; SizeGB=0; FreeGB=0.11}}
TotalMemorySize : @{MemorySize GB=32}
LastRebootTime : @{LastBootUpTime =4/10/2018 9:54:16 AM}
所需的輸出看起來像這樣:
Computer_Name,Manufacturer/Model,Serial # ,Processor,Harddrive1, Harddrive 2, Harddrive 3 ,TotalMemorySize ,LastRebootTime
加上沒有所有@
符號。
請讓我知道你的想法
嘗試使用Flatten-Object ,它不會為您提供確切的標頭名稱,但是非常接近,您可以隨時考慮對其重命名:
PS C:\> $Status | Flatten | ft
Manufacturer.Manufacturer Manufacturer.Model Server LastRebootTime.LastBootUpTime Harddrive.1.DeviceID Harddrive.1.SizeGB Harddrive.1.FreeGB Serial.SerialNumber Processor.name
------------------------- ------------------ ------ ------------------------------ -------------------- ------------------ ------------------ ------------------- --------------
Hewlett-Packard HP EliteBook Folio 9470m . 2018-04-11 6:11:28 PM C: 221 59.42 PC1234567 Intel(R) Core...
謝謝大家為我提供的支持。 這樣,這就是我決定使用的格式,並且我喜歡收到的輸出:這是使用PScustomObjects的代碼段:
{ $DiskResults += [pscustomobject][ordered] @{
Computer = $Computer
Manufacturer =$mf.Manufacturer
Model = $mf.Model
Serial =$ser.SerialNumber
Memory ="{0:N2}" -f ($mem.TotalPhysicalMemory / 1gb)
Processor =$PRCR.name
LastRebootInDays = (($now -
($CPOS.ConverttoDateTime($CPOS.lastbootuptime))).days )
Drive = $Disk.DeviceID
CapacityGB = "{0:N2}" -f ($Disk.Size / 1gb)
UsedGB = "{0:N2}" -f (($Disk.Size - $Disk.FreeSpace) / 1gb)
UsedPercent = "{0:P0}" -f (($Disk.Size - $Disk.FreeSpace) /
$Disk.Size)
FreeGB = "{0:N2}" -f ($Disk.FreeSpace / 1gb)
FreePercent = "{0:P0}" -f ($Disk.FreeSpace / $Disk.Size)
VolumeName = $Disk.VolumeName
}
這是我的結果的圖片:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.