【问题标题】:How can I create a CSV file and append content to it, in powershell?如何在 powershell 中创建 CSV 文件并将内容附加到其中?
【发布时间】:2021-10-11 09:58:50
【问题描述】:

我需要将有关服务器的一些信息保存到 csv 文件中。将保存到此文件的信息将像循环一样添加,因此,在某种程度上,我需要将信息附加到文件中。

我尝试了两种方法,但似乎都不起作用(变量 ip、id、name 和 stauts 在脚本的最终版本中不会是静态的):

  1. 添加内容

    for($i=0; $i -lt 5; $i++){
     $OutFile = "C:\information.csv"
    
     $test = Test-Path -Path $Outfile
    
     $id=$i
     $ip="1234$i"
     $name="Server$i"
     $status="up"
    
     if(!$test)
    {
    
        Add-Content -Path $Outfile -Value '"ID","IP","Name","Status"'
    
    }
    

    Add-Content -Path $OutFile -Value $id,$ip,$name,$status

    }

当我运行此脚本时,所有信息都放在同一列/标题中。

  1. 创建空的 CSV 文件并向其中添加内容:

    for($i=0; $i -lt 5; $i++){
    $OutFile = "C:\information.csv"
    
    $test = Test-Path -Path $Outfile
    
    $id=$i
    $ip="1234$i"
    $name="Server$i"
    $status="up"
    
    if(!$test)
     {
        $newcsv = {} | Select "ID", "NAME","IP","STATUS" | Export-Csv $OutFile
     }
    
    
    $csvfile = Import-Csv $OutFile
    
    $csvfile.ID = $id
    $csvfile.NAME = $ip    
    $csvfile.IP = $name
    $csvfile.STATUS = $status
    
    
    $csvfile | Export-CSV $outfile –Append
    
    
    }
    

当我运行这个脚本时,我会收到每个标题的错误消息:

在此对象上找不到属性“ID”。验证 属性存在,可以设置。

但是文件创建了,信息放在了正确的头中,但是每个头的内容是错误的,并且ID头和我创建的变量的值不同

我最适合将值附加到 csv 文件,我做错了什么让输出显示在图片中?

我可以回答有关此问题的任何问题。感谢您的宝贵时间。

【问题讨论】:

  • 您无需测试 (Test-Path)、创建和/或加载您的 Csv 文件 (Import-Csv)。只需 Export-CSV $outfile –Append 就足以在 powershell 中创建一个 CSV 文件并将内容附加到其中
  • 我需要测试路径来检查路径是否存在。如果它存在,它只会附加信息而不是从头开始创建文件
  • Export-CSV $outfile –Append创建文件(并立即添加内容)如果存在并且追加内容,如果它确实存在。

标签: powershell csv


【解决方案1】:

为了输出有效的 CSV,收集对象并使用Export-Csv

试试这样的:

$OutFile = "C:\information.csv"

# output 5 dummy servers
0..4 | ForEach-Object {
    [PsCustomObject]@{
        Id     = $_
        IP     = "192.168.1.$_"
        Name   = "Server$_"
        Status = 'Up'
    }
} | Export-Csv -Path $Outfile -NoTypeInformation 

在屏幕上显示时的输出:

Id IP          Name    Status
-- --          ----    ------
 0 192.168.1.0 Server0 Up    
 1 192.168.1.1 Server1 Up    
 2 192.168.1.2 Server2 Up    
 3 192.168.1.3 Server3 Up    
 4 192.168.1.4 Server4 Up

【讨论】:

  • 感谢您的回答。有没有办法在不指定循环数的情况下做到这一点。我刚刚添加了 for 循环,以便人们了解该脚本将执行多次,并且每次都会附加信息。但是,脚本的最终版本不会有 for 循环
  • @Sam 您是否尝试过只是删除循环? [pscustomobject]@{ Id = 1; IP = "192.168.1.1"; Name='Server1'; Status='Up'} |Export-Csv -Path C:\path\to\information.csv -NoTypeInformation
  • 谢谢,成功了!正是我想要的。事实证明这是一个非常简单的脚本。再次感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多