2015-04-24 3 views
0

Я создаю скрипт, чтобы получить время простоя/последней перезагрузки группы ПК, считанных из текстового файла.Форматирование выходного файла

Я могу выводить результаты в файл, но он продолжает повторять заголовок столбца, который я не хочу. В основном я хотел бы вывести первую строку для заголовков, а затем каждую строку после данных для данных внизу. Код ниже повторяет заголовок столбца в выходной файл, и между строками существует много пробелов. Будет ли проще работать с CSV-продуктом?

Вот мой код. Первая команда Out-File состоит в том, чтобы перезаписать файл, если он существует, существенно очистив файл.

$computers = Get-Content "c:\temp\ps\pc.txt" 

out-file -FilePath "C:\temp\ps\output.txt" 
foreach ($computer in $computers) 
{ 
    $Computerobj = "" | select ComputerName, Uptime, LastReboot 
    $wmi = Get-WmiObject -ComputerName $computer -Query "SELECT LastBootUpTime  FROM Win32_OperatingSystem" 
    $now = Get-Date 
    $boottime = $wmi.ConvertToDateTime($wmi.LastBootUpTime) 
    $uptime = $now - $boottime 
    $d =$uptime.days 
    $h =$uptime.hours 
    $m =$uptime.Minutes 
    $s = $uptime.Seconds 
    $Computerobj.ComputerName = $computer 
    $Computerobj.Uptime = "$d Days $h Hours $m Min $s Sec" 
    $Computerobj.LastReboot = $boottime 
    $Computerobj 
    out-file -FilePath "C:\temp\ps\output.txt" -in $computerobj -append 
} 

ответ

0

Попробуйте это:

$computers = Get-Content "c:\temp\ps\pc.txt" 

#Create a report variable as an array to hold all our data 
$report = @(); 

#No longer necessary 
#out-file -FilePath "C:\temp\ps\output.txt" 

foreach ($computer in $computers) 
{ 
    $Computerobj = "" | select ComputerName, Uptime, LastReboot 
    $wmi = Get-WmiObject -ComputerName $computer -Query "SELECT LastBootUpTime  FROM Win32_OperatingSystem" 
    $now = Get-Date 
    $boottime = $wmi.ConvertToDateTime($wmi.LastBootUpTime) 
    $uptime = $now - $boottime 
    $d =$uptime.days 
    $h =$uptime.hours 
    $m =$uptime.Minutes 
    $s = $uptime.Seconds 
    $Computerobj.ComputerName = $computer 
    $Computerobj.Uptime = "$d Days $h Hours $m Min $s Sec" 
    $Computerobj.LastReboot = $boottime 

    #Add the computer to the report array 
    $report += $Computerobj 
} 

#Uncomment this if you need to see the report as well as write it to a file 
#Write-Output $report 

out-file -FilePath "C:\temp\ps\output.txt" -in $report 

Теперь вы можете манипулировать отчет в целом, так что вы даже можете добавить вещи в конце, как $report = $report | Sort-Object -Property ComputerName сортировать отчет по имени компьютера или фильтровать его Where-Object.

+0

Это тоже хорошо. Любите свои бекон бит! – user3364233

3

трубопровод с ForEach-Object и Export-Csv будет лучше подход:

$now = Get-Date 

Get-Content -Path 'C:\temp\ps\pc.txt' | ForEach-Object { 
    $wmi = Get-WmiObject -ComputerName $_ -Class Win32_OperatingSystem 
    $boottime = $wmi.ConvertToDateTime($wmi.LastBootUpTime) 
    $uptime = $now - $boottime 
    New-Object -Type PSObject -Property @{ 
    'ComputerName' = $_ 
    'Uptime'  = '{0} Days {1} Hours {2} Min {3} Sec' -f $uptime.Days, 
        $uptime.Hours, $uptime.Minutes, $uptime.Seconds 
    'LastReboot' = $boottime 
    } 
} | Export-Csv -Path 'C:\temp\ps\output.txt' -NoType 

Если вам нужны данные как в файле и на консоли, вы можете использовать ConvertTo-Csv и Tee-Object:

Get-Content 'c:\temp\ps\pc.txt' | ForEach-Object { 
    ... 
} | ConvertTo-Csv -NoType | Tee-Object -FilePath 'C:\temp\ps\output.txt' 
+0

Ансгар большое спасибо за это. Выход прекрасен в csv – user3364233

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