2016-11-15 43 views
0

提前致谢。我试图导入多个.csv档案来,添加一列给他们,然后写该列基于其他列的值在Powershell中导入和修改多个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文件?

+0

''进口-CSV $ _ FullName''? – 4c74356b41

+0

看起来你需要移动| export-csv到你的管道的末端,而不是把它放在循环中。 –

+0

Import-Csv $ _。FullName解决了它。感谢大家! –

回答

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" 
+0

这是什么语言? –

+0

上半部分是相同的PowerShell,下面是简单的控制台屏幕副本。 – LotPings