2016-03-19 3 views
-1

Я использую this amazing answer и получил RunSpacePools для вывода CSV-файла, но мой CSV-файл имеет пустые строки, и я просто не могу понять, откуда берутся пустые строки.Выходной файл RunSpacePool CSV содержит пустые строки

пустые строки показаны в Блокноте ,,,

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

если цикл по каждому элементу в нижней части вашего кода является то, что для записи в файл, я бы отладить это. реорганизовать код, чтобы не использовать конвейер. перебирать задания и записывать информацию о каждом задании. собрать то, что, по вашему мнению, вы будете писать в другую структуру данных. когда вы удовлетворены этим, экспортируйте в csv. –

+0

Спасибо за комментарий, я боюсь, что это над моей головой. Я ищу дополнительные примеры кода, чтобы получить что-то, но все просто не работает должным образом. – user4317867

+0

Я работаю с [этим методом пулов пространства пробега] (http://learn-powershell.net/2012/05/10/speedy-network-information-query-using-powershell/) и получает выходной файл, который отформатирован по желанию, но данные неверны. – user4317867

ответ

0

После проб и ошибок, я закончил работать with this method of run space pools подобраться. Подойдя ближе, я обнаружил, что выход был загрязнен дополнительными пробелами WMI.

Чтобы решить эту проблему, в итоге я использовал следующее в инструкции Try ScriptBlock.

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

Теперь данные возвращаются, если требуется одна линия.

-Отменить прокомментировать дополнительные пробелы WMI на выходе. See this question for more details.

Рассмотрим следующий способ возврата последней отметки времени перезагрузки компьютера. Обратите внимание, что вы можете форматировать строку по мере необходимости, see this library page for more info.

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

Whitespaces in WMI output in PowerShell

Обратите внимание на пробелы, которые могут быть удалены путем преобразования выходного сигнала в строку затем с помощью Trim(), чтобы удалить пробельные.

WMI output without extra WhiteSpaces

Смежные вопросы