电源外壳。尝试使用Import-csv循环

时间:2014-09-04 21:34:19

标签: powershell csv

我正在转换目前为每个代理商解析一次大型csv文件的代码。下面是一行:

Import-Csv $HostList |  Where-Object {$_."IP Address" -Match "^192.168.532.*"  -or $_Domain -eq     "MYDOMAIN"`
 -and (get-date $_.discovery_timestamp) -gt $PreviousDays} | select-object Hostname","Domain","IP Address","discovery_timestamp","some_version" | `
 Export-Csv -NoTypeInformation -Path $out_data"\OBS_"$Days"_days.txt" 
 write-host "OBS_DONE"

我有大约30个。 我想解析一次csv文件,可能使用foreach和import.csv。 我以为我可以这样做:

$HostFile = Import-csv .\HostList.csv 
foreach ($line in $HostFile)
{
Where-Object {$_."IP Address" -Match "^172.31.52.*"} 
write-host $line
#| Export-Csv -NoTypeInformation -Path H:\Case_Scripts\test.csv

我已尝试过上述的许多排列,并且它永远不会匹配" Where-Object"就像上面的示例功能脚本一样。

感谢任何指导和学习机会。

2 个答案:

答案 0 :(得分:2)

我的好人,您需要被介绍到Switch cmdlet。这将立即为您的所有公司排序。

$CompanyA = @()
$CompanyB = @()
$CompanyD = @()
$Unknown = @()    
Switch(Import-CSV .\HostList.csv){
    {(($_."IP Address" -match "^192.168.532.*") -or ($_Domain -eq "CompanyA.com")) -and ((get-date $_.discovery_timestamp) -gt $PreviousDays)} {$CompanyA += $_; Continue}
    {(($_."IP Address" -match "^192.26.19.*") -or ($_Domain -eq "CompanyB.net")) -and ((get-date $_.discovery_timestamp) -gt $PreviousDays)} {$CompanyB += $_; Continue}
    {(($_."IP Address" -match "^94.8.222.*") -or ($_Domain -eq "CompanyC.org")) -and ((get-date $_.discovery_timestamp) -gt $PreviousDays)} {$CompanyC += $_; Continue}
    default {$Unknown += $_}
}
$CompanyA | Export-Csv $out_data"\CompanyA"$Days"_days.txt" -NoType
$CompanyB | Export-Csv $out_data"\CompanyB"$Days"_days.txt" -NoType
$CompanyC | Export-Csv $out_data"\CompanyC"$Days"_days.txt" -NoType
If($Unknown.count -gt 0){Write-Host $Unknown.count + " Entries Did Not Match Any Company" -Fore Red
$Unknown}

这将导入CSV,并为每个条目尝试将其与三条线中的每条线的条件相匹配。如果它与第一个ScriptBlock中的条件匹配,它将在第二个ScriptBlock中执行操作(将该条目添加到我首先创建的三个数组之一)。然后它会像您在脚本中一样以CSV格式将每个数组输出到它自己的文本文件中。 ;Continue只会使它在找到有效匹配后停止尝试匹配,并且继续到下一条记录。如果它不能与它们中的任何一个匹配,它将默认将它添加到Unknown数组中,最后它会检查是否有任何内容它会警告主机并列出不匹配的条目。

编辑:切换的-RegEx参数...好的,所以这样做的目的是如果你想要一个简单的正则表达式匹配,例如:

Switch -regex ($ArrayOfData){
    ".*@.+?\..{2,5}" {"It's an email address"}
    "\d{3}(?:\)|\.|-)\d{3}(?:\.|-)\d{4}" {"It's a phone number"}
    "\d{3}-\d{2}-\d{4}" {"Probably a social security number"}
}

这不允许使用-and或-or语句。如果您使用脚本块来匹配(就像我在我的顶部示例中所做的那样),您可以使用-match运算符,默认情况下执行正则表达式匹配,因此您仍然可以使用正则表达式而无需使用Switch的-regex参数。

答案 1 :(得分:1)

Where-Object应该有一组传递给它的对象。在你的第二个脚本块中,这不会发生,因此在过滤器中$ _变量将为空。

有几种方法可以解决这个问题 - 第一个想到的方法就是用' if'来替换Where-Object。声明。例如

if ($line."IP Address" -Match "^172.31.52.*") { write-output $line }