【问题标题】:Remove blank lines in Out-File .txt generated with powershell删除使用 powershell 生成的 Out-File .txt 中的空白行
【发布时间】:2019-03-06 20:26:53
【问题描述】:

我正在使用 .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 的可用物理内存和 cpu 的实际负载百分比。

它按预期工作,但会为 win32_processor LoadPercentage-Query 生成空白链接。

我尝试过像这样使用 .Trim() 作为 Out-File $c=Get-WmiObject win32_processor -ComputerName $strComputer | fl *LoadPercentage* | Out-String.Trim() 但这不起作用。我试过使用 -NoNewLine for 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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    [编辑 - 修改处理器负载百分比计算以考虑处理器数量。]

    我看到你有你的答案......但你使用的代码比看起来需要的更迂回。所以我写了一个更直接的版本。 [咧嘴一笑]

    它的作用......

    • 使用 CIM cmdlet 而不是 WMI cmdlet
      CIM 比已弃用的 WMI 调用稍快。
    • 只调用一次*_OperatingSystem
    • 直接获取.LoadPercentage
    • CIM_ComputerSystem 获取.NumberOfProcessors
    • 通过对.LoadPercentage 项的[可能] 数组求和并除以.NumberOfProcesors 来计算实际负载百分比
    • 避免Format-List 调用插入不需要的额外行
    • 使用-f字符串格式运算符构建输出字符串

    因为我不确定您的语言中的措辞,所以我使用了英语。我想你可以比我更好地翻译回你的... [grin]

    $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
    

    【讨论】:

    • 感谢您改进脚本以使其焕然一新。我已经测试过了,但它没有给我正确的输出 -> link 你知道为什么我得到 System.Object[] 而不是处理器负载吗?
    • @andrk0 - 您可能拥有多个处理器。这可能会给你一个数组而不是$ProcLoad_Pct 中的单个数字。我无法测试这一点,因为我只有这个单 CPU 系统可以工作。 ///// 你从(Get-CimInstance -ClassName CIM_ComputerSystem).NumberOfProcessors得到什么?
    • 返回值为2。是否可以通过添加索引值如$ProcLoad_Pct[0]和$ProcLoad_Pct[1]从数组中获取信息?
    • @andrk0 - 我已经更改了上面的 c0de 以考虑处理器的数量。请测试一下 - 我只有一个物理 CPU,所以我只求和一个 .LoadPercentage 然后除以一个 .NumberOfProcessors。 [咧嘴]
    • 它工作正常,但处理器负载似乎不是事实。它显示 1.5%,但任务管理器显示 20% 负载。还是这是正常行为?
    【解决方案2】:

    您的变量 $c 似乎包含空的新行。为了快速修复,您可以添加修剪功能如下:

      $c = $c.Insert(1,",").trim()
    

    【讨论】:

      【解决方案3】:

      试试这个结构:

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

      或者做最后一行:

      $seperator.Trim() | Out-File -append "D:\Logging\FreeRAM.txt"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多