2016-03-19 10 views
-1

Ich verwende this amazing answer und bekam RunSpacePools, um eine CSV-Datei auszugeben, aber meine CSV-Datei hat leere Zeilen und ich kann einfach nicht herausfinden, wo die leeren Zeilen herkommen. in NotepadRunSpacePool Ausgabe CSV enthält leere Zeilen

Die Leerzeilen als ,,,

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

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

$AlertData = get-SCOMAlert -Criteria "Severity = 1 AND ResolutionState < 254 AND Name = 'Pending Reboot'" | Select NetbiosComputerName 

    "Get Pend reboot servers from test" 
#For test information 
New-SCOMManagementGroupConnection -ComputerName TestServer1 

$AlertData += Get-SCOMAlert -Criteria "Severity = 1 AND ResolutionState < 254 AND Name = 'Pending Reboot'" | Select NetbiosComputerName 

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

$scriptblock = { 
Param([string]$server) 

$csv = Import-Csv D:\Scripts\MaintenanceWindow2.csv 
$window = $csv | where {$_.Computername -eq "$server"} | % CollectionName 
$SCCMWindow = IF ($window){$window}ELSE{"NoDeadline"} 

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

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

#create custom object as output for CSV. 
[PSCustomObject]@{  
Server=$server 
MaintenanceWindow=$SCCMWindow 
Ping=$PingResults 
LastReboot=$LastReboot 
}#end custom object 
}#script block end 

$RunspacePool = [RunspaceFactory]::CreateRunspacePool(100,100) 
$RunspacePool.Open() 
$Jobs = 
foreach ($item in $AlertDataNoDupe) 
{ 
$Job = [powershell]::Create(). 
     AddScript($ScriptBlock). 
     AddArgument($item.NetbiosComputerName) 
$Job.RunspacePool = $RunspacePool 

[PSCustomObject]@{ 
    Pipe = $Job 
    Result = $Job.BeginInvoke() 
} 
} 

Write-Host 'Working..' -NoNewline 

Do { 
    Write-Host '.' -NoNewline 
    Start-Sleep -Milliseconds 500 
} While ($Jobs.Result.IsCompleted -contains $false) 

Write-Host ' Done! Writing output file.' 
Write-host "Output file is d:\scripts\runspacetest4.csv" 

$(ForEach ($Job in $Jobs) 
{ $Job.Pipe.EndInvoke($Job.Result) }) | 
Export-Csv d:\scripts\runspacetest4.csv -NoTypeInformation 

$RunspacePool.Close() 
$RunspacePool.Dispose() 
+0

wenn die foreach-Schleife am unteren Rand des Codes ist es, was die Datei schreibt, ich würde das debuggen. Refactor den Code, um die Pipeline nicht zu verwenden. Schleife über die Jobs und protokolliere Informationen über jeden Job. Sammeln Sie, was Sie denken, dass Sie in eine andere Datenstruktur schreiben werden. Wenn Sie damit zufrieden sind, exportieren Sie nach CSV. –

+0

Vielen Dank für den Kommentar, ich fürchte, das ist über meinen Kopf. Ich suche nach mehr Code-Beispielen, damit etwas funktioniert, aber die Dinge funktionieren einfach nicht wie erwartet. – user4317867

+0

Ich arbeite mit [dieser Methode von Run-Space-Pools] (http://learn-powershell.net/2012/05/10/speedy-network-information-query-using-powershell/) und Ausgabe erhalten, die formatiert ist wie gewünscht, aber die Daten sind falsch. – user4317867

Antwort

0

Nach Versuch und Irrtum, gezeigt werden beendet I with this method of run space pools Aufarbeiten nahe zu kommen. Als ich genauer hinschaute, stellte ich fest, dass die Ausgabe durch zusätzliche Whitespaces von WMI verschmutzt war.

Um dies zu lösen, habe ich das folgende in der Try-Anweisung von ScriptBlock verwendet.

$LastReboot = [Management.ManagementDateTimeConverter]::ToDateTime ` 
($operatingSystem.LastBootUpTime).ToString().Trim() 

Jetzt sind die zurückgegebenen Daten alle einzelne Zeile wie gewünscht.

-Bearbeiten, um die zusätzlichen Leerzeichen von WMI in der Ausgabe zu kommentieren. See this question for more details.

Betrachten Sie die folgende Methode, um den letzten Neu-Start-Zeitstempel eines Computers zurückzugeben. Beachten Sie, dass Sie die Zeichenfolge nach Bedarf formatieren können, see this library page for more info.

$os = (gwmi -Class win32_operatingsystem).LastBootUpTime 
[Management.ManagementDateTimeConverter]::ToDateTime($os) 

Whitespaces in WMI output in PowerShell

Beachten Sie die Leerzeichen, die dann unter Verwendung von Trim() durch Umwandeln der Ausgabe in einen String entfernt werden kann, um die Leerzeichen zu entfernen.

WMI output without extra WhiteSpaces