我正在转换当前为每个代理解析一次大型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“。
任何指导和学习机会都是值得感谢的。
发布于 2014-09-05 06:45:52
我的好兄弟,你需要被介绍给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就会停止尝试匹配,并继续到下一条记录。如果它不能匹配它们中的任何一个,它将默认将其添加到未知数组中,并在最后检查其中是否有任何条目,它会警告主机并列出不匹配的条目。
编辑:开关的-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语句。如果您使用scriptblock进行匹配(就像我在上面的示例中所做的那样),则可以使用-match操作符,它默认情况下执行正则表达式匹配,因此您仍然可以使用正则表达式,而不必使用-regex参数进行切换。
发布于 2014-09-05 06:27:38
其中-Object应该有一个传递给它的对象集合。在您的第二个脚本块中,这不会发生,因此在过滤器中,$_变量将为空。
有几种方法可以解决这个问题-首先想到的是将Where-Object替换为'if‘语句。例如
if ($line."IP Address" -Match "^172.31.52.*") { write-output $line }https://stackoverflow.com/questions/25675315
复制相似问题