【问题标题】:Delete the content of a txt file except the first line删除一个txt文件除了第一行的内容
【发布时间】:2019-06-17 22:09:51
【问题描述】:

我有两个 PowerShell 脚本:

  • 制作每日平均备份的虚拟机数量并将其保存到 .txt 文件中:

    $file = "E:\PS\Malik\valeurs.txt" 
    $success_rate = 100 - ($nbckp_vms * 100 / $total_vms)
    $success_rate_round = [Math]::Round($success_rate,2)
    
    #Exported into the $file path
    Add-Content -Path $file -Value "$success_rate_round,$total_vms,$nbckp_vms" 
    #        $text = Get-Content -path $file
    
    # Backup rate for production KPI
    
    $body = $body + "`r`n" + "*** Backup success rate for production KPIs ***" + "`r`n"
    
    $body = $body + "`r`n" + "Daily success rate = $success_rate_round%"
    $body = $body + "`r`n" + "Total VMs = $total_vms"
    $body = $body + "`r`n" + "Daily unbacked up VMs = $nbckp_vms" + "`r`n"
    
  • 用这个 .txt 文件的值做一个月平均数。

这就是问题所在。问题出在这部分。

我想对这两个脚本进行升级,包括平均虚拟机数量和非备份虚拟机的平均数量。所以我这样做了:

$csv1 = Import-Csv -Path $path -Delimiter ','

$moy = $csv1.moy | measure -Average | select -expand average
$nb_total_vms = $csv1.nb_total_vms | measure -Average | select -expand average
$nbackedup_vms = $csv1.nbackedup_vms | measure -Average | select -expand average

Write-Host "moy = $moy / $nb_total_vms / $nbackedup_vms"

但是由于这个脚本每个月都会启动,所以我不能让我的第一行像“moy,nb_total_vms,nbackedup_vms”,而是我有值,然后是这一行。如果我把它放在我的其他脚本上,我将有这样的每一行:

价值 moy,nb_total_vms,nbackedup_vms 价值 moy,nb_total_vms,nbackedup_vms

等等。

我想将这一行 (moy,nb_total_vms,nbackedup_vms) 始终写在 .txt 文件的第一行。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    首先不要使用*-Content cmdlet 来编写输出文件。创建自定义对象并使用Export-Csv。这将自动生成您想要的标题行。

    $prop = @{
        moy           = $csv1.moy |
                        Measure-Object -Average |
                        Select-Object -Expand Average
        nb_total_vms  = $csv1.nb_total_vms |
                        Measure-Object -Average |
                        Select-Object -Expand Average
        nbackedup_vms = $csv1.nbackedup_vms |
                        Measure-Object -Average |
                        Select-Object -Expand Average
    }
    
    New-Object -Type PSObject -Property $prop |
        Select-Object moy, nb_total_vms, nbackedup_vms |
        Export-Csv $file -NoType
    

    上述代码中的Select-Object(适用于所有 PowerShell 版本)仅用于确保输出 CSV 中列的顺序。如果您有 PowerShell v3 或更新版本,您可以使用 [PSCustomObject] 类型加速器来简化它,它会自动使用有序哈希表。

    [PSCustomObject]@{
        moy           = $csv1.moy |
                        Measure-Object -Average |
                        Select-Object -Expand Average
        nb_total_vms  = $csv1.nb_total_vms |
                        Measure-Object -Average |
                        Select-Object -Expand Average
        nbackedup_vms = $csv1.nbackedup_vms |
                        Measure-Object -Average |
                        Select-Object -Expand Average
    } | Export-Csv $file -NoType
    

    【讨论】:

      【解决方案2】:

      看,你的标题的答案:

      (Get-Content "your.txt" -TotalCount 1) | Set-Content "your.txt"
      

      【讨论】:

      • 更有效的是(Get-Content "your.txt" -TotalCount 1)|Set-Content "your.txt",它不会先将整个文件读入内存(作为数组),然后不必要地拆分,只选择第一个。 AnsgarWiechers 的方法也很出色。
      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多