我试图通过 $servername 变量对每日服务器报告的输出进行排序,但是,我无法对输出进行排序。我认为它需要某种数组或选择对象字符串。有人可以指出我正确的方向吗?
此外,如果有一种方法可以用空行分隔每个新的 $servername,那就太棒了!
添加了完整脚本以便更好地理解
Import-Module ActiveDirectory
$server = (Get-ADComputer -SearchBase "搜索库" -filter *).name
$脚本块={
# Set the server name
$serverName = $env:COMPUTERNAME
# Get the up/down status of the server
$pingResult = Test-Connection -ComputerName $server.Name -Count 1 -ErrorAction SilentlyContinue
$status = if ($pingResult.StatusCode -eq 1) {
'Up'
}
else {
'Down'
}
# Get the server build date
$buildDate = (Get-CimInstance -Class Win32_OperatingSystem).InstallDate
# Certificate name information
$certname = get-childitem -path Cert:\LocalMachine\My\ |
Select friendlyname
# Get the server certificate validity
[array] $certs = Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { -Not $_.PSIsContainer } |
Sort-Object -Property NotBefore
#Number of Certs on Machine
$certcount = (get-childitem -path Cert:\LocalMachine\my).count
# Check Trellix update
$TrellixDate = [datetime](Get-ItemProperty 'C:\Program Files\Common Files\McAfee\Engine\AMCoreUpdater\amupdate.dat').LastWriteTime.DateTime
# Operating system collection
$os = Get-CimInstance Win32_OperatingSystem | Select-Object Caption
# Disk information
[array] $diskInfo = Get-CimInstance -Class Win32_LogicalDisk -Filter 'DriveType = 3'
for ($i = 0; $i -lt [System.Math]::Max($cert.Count, $diskInfo.Count); $i++) {
$disk = $diskInfo[$i]
$freeSpace = $diskSize = $percent = $label = $null
$cert = $certs[$i]
if ($disk) {
$label = $disk.DeviceID
$freeSpace = $disk.FreeSpace / 1GB
$diskSize = $disk.Size / 1GB
$percent = '{0:P0}' -f ($freeSpace / $diskSize)
}
$validTo = $validFrom = $null
if ($cert) {
$validTo = $cert.NotAfter
$validFrom = $cert.NotBefore
}
#SQL Version
if (test-path 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' -ErrorAction SilentlyContinue){
$sql = (get-itemproperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances
foreach ($i in $sql)
{
$sqlver = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i
(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup").Version
}
}
else {$sqlver = "n/a"}
#IIS 版本(如果有) if (Get-Service -Name W3SVC -ErrorAction SilentlyContinue){ $IIS = (Get-ItemProperty -PATH 'HKLM:\SOFTWARE\Microsoft\InetStp').VERSIONSTRING } 否则 {$iis = "n/a"}
#描述输出列 [PS自定义对象]@{ 服务器名称 = $服务器名称 状态 = $状态 操作系统=$os 构建日期 = '{0:u}' -f $buildDate 证书名称 = $证书名称 证书创建 = $validFrom 证书过期 = $validTo 证书计数 = $证书计数 TrellixLastUpdate = $TrellixDate SQL版本 = $sqlver IIS 版本 = $IIS 磁盘标签 = $标签 可用空间 = '{0:N2} Gb' -f $freespace 磁盘大小 = '{0:N2} Gb' -f $disksize 免费百分比 = $百分比
}
foreach ($serverName in 'PSCustomObject') { $obj | where-object {$_.Servername -eq $servername} | Sort-Object $servername }
#foreach ($serverName in 'PSCustomObject') { $obj | where-object {$_.Servername -eq $servername} | Sort-Object $servername }
}
}
#在服务器上运行脚本的命令
Invoke-Command -ComputerName $server -ScriptBlock $scriptblock -HideComputerName -ErrorAction SilentlyContinue| 选择对象 * -ExcludeProperty RunspaceId、PSComputerName、PSShowComputerName | #Export-CSV e: ctivetasks\server_checks\DailyServerReport.csv -NoTypeInformation -force 导出-CSV c:\Nec\DailyServerReport1.csv -NoTypeInformation -force
我想说一个简单的
$ArrayList | Sort-Object -Property ServerName | Format-Table
,其中 $ArrayList
是一个 [System.Collections.ArrayList]
(大多数时候比常规数组更好)包含各种 [PSCustomObject]
的变量应该可以解决问题。
您甚至可能不需要行与行之间的空格。