避免或替换多个Where-Object语句

时间:2016-02-13 21:33:01

标签: powershell filtering

我有一个包含函数Create-RebootData的脚本,其中包含子函数,例如FullFull,其子函数名为Generate-RebootData,其中输出变量$Global:result已创建。

Full内,有多个Where-Object两个语句可按日期和时间过滤$Global:result。示例如下。

是否有更简单的方法来完成此操作而不是多个Where-Object语句?

期望的结果是

Set-StrictMode -Version 1.0
Function Create-RebootData{

[CmdletBinding(SupportsShouldProcess=$true,DefaultParameterSetName="ViewOnly")]
    Param(

[Parameter(ParameterSetName="ViewOnly")]
    [Switch]$ViewOnly,

[Parameter(ParameterSetName="Full")]
    [Switch]$Full,
    )

    Switch ($PSCmdlet.ParameterSetName){
"ViewOnly"
{
    ViewOnly
}
"Full"
{
    Full
}
    }#end switch

Function Full{
Generate-RebootData

  $Global:result | Where-Object {$_ -like '*fri?2:00*' -and $_.MaintenanceWindow `
  -notmatch 'all.da.servers' -and $_.Server -match "^ITD"} | % {"{0}" -f $_.Server} | `
  Out-File D:\Scripts\Full-Servers.txt -Append

  $Global:result | Where-Object {$_ -like '*fri?2:00*' -and $_.MaintenanceWindow `
  -notmatch 'all.da.servers' -and $_.Server -match "^ITD"} | `
  % {"{0}" -f $_.MaintenanceWindow -replace `
  "^NA.+", "$((get-date).AddDays(1).ToString('MM-dd-yy')) 01:50"} | `
  Out-File D:\Scripts\Full-Times.txt -Append

}

  Function Generate-RebootData{
    IF(Get-Command Get-SCOMAlert -ErrorAction SilentlyContinue){}ELSE{Import-Module OperationsManager}

    "Get Pend reboot servers from prod"
New-SCOMManagementGroupConnection -ComputerName Server01

$AlertData = Get-SCOMAlert -Criteria "MyString" | Select NetbiosComputerName

New-SCOMManagementGroupConnection -ComputerName Server02

$AlertData += Get-SCOMAlert -Criteria "MyString" | Select NetbiosComputerName

    "Remove duplicates"
$AlertDataNoDupe = $AlertData | Sort NetbiosComputerName -Unique

    "Create hash table"
$table = @{}
    "Populate hash table"

$MaintenanceWindow = Import-Csv D:\Scripts\MaintenanceWindow2.csv

$MaintenanceWindow | ForEach-Object {$table[$_.Computername] = $_.'Collection Name'}

    "Create final object"

$Global:result = @{}

    "Begin Loop"
$Global:result = $AlertDataNoDupe | ForEach-Object { [PSCustomObject] @{ 

    Server=$_.NetbiosComputerName

    MaintenanceWindow= if($table.ContainsKey($_.NetbiosComputerName)){
                $table[$_.NetbiosComputerName]
                }Else { "Not Found!"}

    PingCheck=IF(Test-Connection -Count 1 $_.NetbiosComputerName -Quiet -ErrorAction SilentlyContinue){"Alive"}
        ELSE{"Dead"}

    LastReboot=Try{$operatingSystem = Get-WmiObject Win32_OperatingSystem -ComputerName $_.NetbiosComputerName -ErrorAction Stop
        [Management.ManagementDateTimeConverter]::ToDateTime($operatingSystem.LastBootUpTime)}
        Catch{"Access Denied!"}
    } }
}

1 个答案:

答案 0 :(得分:0)

你可以这样做:

$Global:result | Where-Object {
    $_ -like '*fri?2:00*' -and
    $_.MaintenanceWindow -notmatch 'all.da.servers' -and
    $_.Server -match '^ITD'
} | ForEach-Object {
    '{0}' -f $_.Server | Out-File D:\Scripts\Full-Servers.txt -Append

    '{0}' -f $_.MaintenanceWindow -replace '^NA.+',
    '{0} 01:50' -f (Get-Date).AddDays(1).ToString('MM-dd-yy') | Out-File D:\Scripts\Full-Times.txt -Append
}

但我同意Mathias'comment,这个函数可能应该重构。