Удалите пустые строки в Out-File .txt, созданном с помощью powershell - PullRequest
0 голосов
/ 04 марта 2019

Я работаю с .ps1-Powershell-Script и застрял.

У меня есть следующий код:

$a=0
$b=0
$c=0
$freeRam=0
$strComputer = "localhost"
$date = get-date
$a=Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer | fl *freePhysical* | Out-String
$b=Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer | fl *totalvisiblememory* | Out-String
$c=Get-WmiObject win32_processor -ComputerName $strComputer | fl *LoadPercentage* | Out-String
$a = $a -replace '\D+(\d+)','$1'
$b = $b -replace '\D+(\d+)','$1'
$c = $c -replace '\D+(\d+)','$1'
$c = $c.Insert(1,",")
$freeRam=[math]::Round($a/$b*10000)/100 
$seperator="Es ist der " + $date + "; der verfuegbare Arbeitsspeicher betraegt: " + $freeRam + " % " + "und die Auslastung der CPU in % betraegt aktuell " + $c
$seperator | Out-File -append "D:\Logging\FreeRAM.txt"

Этот код генерирует .txt-файл сPowershell запрашивает у WmiObjects свободную физическую память и фактический процент загрузки для процессора.

Работает, как и ожидалось, но генерирует для win32_processor LoadPercentage-Query пустые ссылки.

Я пробовал использовать .Trim() для Out-File вроде $c=Get-WmiObject win32_processor -ComputerName $strComputer | fl *LoadPercentage* | Out-String.Trim(), но это не работает.Я пытался использовать -NoNewLine для Out-File, как это $seperator | Out-File -append "D:\Logging\FreeRAM.txt" -NoNewLine, но он не работает.

Мой вывод выглядит так:

Es ist der 03/04/2019 08:13:31; der verfuegbare Arbeitsspeicher betraegt: 71.86 % und die Auslastung der CPU in % betraegt aktuell 1,2




Es ist der 03/04/2019 08:13:35; der verfuegbare Arbeitsspeicher betraegt: 71.86 % und die Auslastung der CPU in % betraegt aktuell 1,0




Es ist der 03/04/2019 08:13:39; der verfuegbare Arbeitsspeicher betraegt: 71.86 % und die Auslastung der CPU in % betraegt aktuell 1,1




Es ist der 03/04/2019 08:14:00; der verfuegbare Arbeitsspeicher betraegt: 71.84 % und die Auslastung der CPU in % betraegt aktuell 1,0

И я хочу вот так:

Es ist der 03/04/2019 08:13:31; der verfuegbare Arbeitsspeicher betraegt: 71.86 % und die Auslastung der CPU in % betraegt aktuell 1,2
Es ist der 03/04/2019 08:13:35; der verfuegbare Arbeitsspeicher betraegt: 71.86 % und die Auslastung der CPU in % betraegt aktuell 1,0
Es ist der 03/04/2019 08:13:39; der verfuegbare Arbeitsspeicher betraegt: 71.86 % und die Auslastung der CPU in % betraegt aktuell 1,1
Es ist der 03/04/2019 08:14:00; der verfuegbare Arbeitsspeicher betraegt: 71.84 % und die Auslastung der CPU in % betraegt aktuell 1,0

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Кажется, что ваша переменная $ c содержит пустые новые строки.Для быстрого исправления вы можете добавить функцию обрезки следующим образом:

  $c = $c.Insert(1,",").trim()
0 голосов
/ 04 марта 2019

[edit - измененный процент загрузки процессора для учета количества процессоров.]

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

что он делает ...

  • использует командлеты CIM вместо WMI
    CIM немного быстрее, чем устаревший WMIзвонки.
  • вызывает класс *_OperatingSystem только один раз
  • получает .LoadPercentage напрямую
  • получает .NumberOfProcessors из CIM_ComputerSystem
  • вычисляет фактическое значение% загрузки путем суммирования массива [возможных] элементов .LoadPercentage и деления на .NumberOfProcesors
  • позволяет избежать вызовов Format-List, которые вставляли ненужные дополнительные строки
  • использует -f оператор форматирования строки для построения выходной строки

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

$ComputerName = $env:COMPUTERNAME
$TimeStamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'

$CIM_OS = Get-CimInstance -ClassName CIM_OperatingSystem -ComputerName $ComputerName
$CIM_CS_ProcessorCount = (Get-CimInstance -ClassName CIM_ComputerSystem).NumberOfProcessors

$FreeRAM_Pct = [math]::Round($CIM_OS.FreePhysicalMemory / $CIM_OS.TotalVisibleMemorySize * 100, 2)
$ProcLoad_Pct = [math]::Round(((Get-CimInstance -ClassName CIM_Processor -ComputerName $ComputerName).
    LoadPercentage |
    Measure-Object -Sum).Sum / $CIM_CS_ProcessorCount, 2)

'Time stamp = {0}; Free RAM % = {1}; Processor load % = {2}' -f $TimeStamp, $FreeRAM_Pct, $ProcLoad_Pct

вывод ...

Time stamp = 2019-03-06 06:18:04; Free RAM % = 43.61; Processor load % = 5
0 голосов
/ 04 марта 2019

Попробуйте эту конструкцию:

$a=(Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer | fl *freePhysical* | Out-String).Trim()

Или сделайте последнюю строку:

$seperator.Trim() | Out-File -append "D:\Logging\FreeRAM.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...