我在服务器上有一个名为'servername'的目录。在该目录中,我有子目录,其名称是日期。在那些日期目录中,我有大约150个.csv文件审核日志。 我有一个部分工作的脚本,从日期目录内部开始,枚举并循环遍历.csv并在列中搜索字符串。我试图让它为每个匹配导出行,然后继续下一个文件。
$files = Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525'
ForEach ($file in $files) {
$Result = If (import-csv $file.FullName | Where {$_.'path/from' -like "*01May18.xlsx*"})
{
$result | Export-CSV -Path c:\temp\output.csv -Append}
}
我正在做的是在'path \ from'列中搜索字符串 - 比如文件名。该列包含的数据总是某种形式的\ folder \ folder \ folder \ filename.xls。我正在搜索特定文件名以及该文件中该列中该文件名的所有实例。
我的问题是导出该行 - export.csv始终为空。我也喜欢启动目录'up'并浏览每个日期目录,解析,导出,然后继续下一个目录和文件。
如果我将其分解为一个文件并将其从IF中取出它似乎给了我一个结果,所以我认为我在IF或For-each中出现了问题,但显然是在我的薪资之上 - 不能算出来出....
预先感谢您的任何帮助, RichardX
答案 0 :(得分:1)
问题在于您的def gp(s):
gradhash = {
"A+": 4.0 + 0.3
,"A": 4.0
,"A-": 4.0 - 0.3
,"B+": 3.0 + 0.3
,"B": 3.0
,"B-": 3.0 - 0.3
,"C+": 2.0 + 0.3
,"C": 2.0
,"C-": 2.0 - 0.3
,"D+": 1.0 + 0.3
,"D": 1.0
,"D-": 1.0 - 0.3
}
return gradhash[s]
print(gp('A-'))
阻止,当您说If
您说新$Result = If () {$Result | ...}
与if语句返回的内容相同时。由于$Result
尚未定义,因此这是$Result
,这就是您获得空白行的原因。
甚至不需要$Result = If () {$null | ...}
块。您已经使用If
过滤了csv,只需将这些对象沿着管道传递到导出。
因为听起来你只是在父母的所有子文件夹上运行它,听起来好像你可以使用Where-Object
的{{1}}参数
-Recurse
(我使用Get-ChildItem
循环而不是Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\' -Recurse |
ForEach-Object {
Import-csv $_.FullName |
Where-Object {$_.'path/from' -like "*01May18.xlsx*"}
} | Export-CSV -Path c:\temp\output.csv
只是演示以另一种方式传递给管道的对象)
编辑:根据Bill_Stewart的建议删除了附加内容。将写出运行中递归文件夹的所有条目。将在下次运行时覆盖。
答案 1 :(得分:1)
我是否认为需要附加CSV文件?怎么样:
Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525' | ForEach-Object {
Import-Csv $_.FullName | Where-Object { $_.'path/from' -like '*01May18.xlsx*' }
} | Export-Csv 'C:\Temp\Output.csv' -NoTypeInformation
答案 2 :(得分:0)
假设您的CSV格式相同,并且您的搜索文字不太可能出现在任何其他列中,则可以使用Select-String
代替Import-Csv
。因此,您可以将字符串处理为字符串,而不是将字符串转换为对象并再次返回字符串。你需要添加一行来伪造标题行,如下所示:
$files = Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525'
$result = @()
$result += Get-Content $files[0] -TotalCount 1
$result += ($files | Select-String -Pattern '01May18\.xlsx').Line
$result | Out-File 'c:\temp\output.csv'