在Powershell中导入和修改多个CSV文件

时间:2016-11-15 17:31:13

标签: powershell csv

提前谢谢。我尝试导入多个.csv文件,向其中添加一列,然后根据另一列的值写入该列

我想要做的就是遵循这个逻辑:

  • 循环使用CSV
  • 对于每个CSV:
  • 添加新列
  • 寻找一些话。
  • 如果您看到这些字词,请在新列中写下不同的字词
  • 结束循环
  • 结束循环

我的代码在这里:

Function getTag ([string]$vuln){
   if($vuln -like "adobe-apsb-")
   {return "Adobe Flash"}
   if($vuln -like "jre-")
   {return "Java"}
   else
   {return "No vulnerability code available"}
}

$in = "D:\Splunk\Inbound"
$out = 'D:\Splunk\Outbound'
Get-ChildItem $in -Filter *.csv |
ForEach-Object{
    Import-Csv $_ | Select-Object *,@{Name='Tag';Expression={getTag $_.'Vulnerability ID'}} | Export-Csv $_.Name

}

现在,$ _以字符串形式出现,而不是CSV,我相信这是我的问题。有没有人有一个很好的方法从嵌套循环中访问该csv文件?

1 个答案:

答案 0 :(得分:1)

  • 使用-like的问题是缺少通配符。
  • 我想Outbound文件夹应包含修改过的csv?
  • 这些无尽的命令行不是必需的,也不是 脚本也不在shell中。

对我而言,这是更好的可读性(并且有效):

Function getTag ([string]$vuln){
    if ($vuln -like "adobe-apsb-*")
        {return "Adobe Flash"}
    if ($vuln -like "jre-*")
        {return "Java"}
    else
        {return "No vulnerability code available"}
}

$in  = "D:\Splunk\Inbound"
$out = "D:\Splunk\Outbound\"

Get-ChildItem $in -Filter *.csv |
    ForEach-Object{
        Import-Csv $_.FullName | 
            Select-Object *,@{
                Name='Tag';
                Expression={getTag $_.'Vulnerability ID'}
            } | Export-Csv -path $($out+$_.Name) -notype
    } 
> tree . /f
│
├───Inbound
│       test.csv
│
└───Outbound
        test.csv

> gc .\Inbound\test.csv
"A","Vulnerability ID","C"
0,"adobe-apsb-blah",2
5,"jre-trash",9

> gc .\Outbound\test.csv
"A","Vulnerability ID","C","Tag"
"0","adobe-apsb-blah","2","Adobe Flash"
"5","jre-trash","9","Java"