首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell。尝试使用Import-csv循环

Powershell。尝试使用Import-csv循环
EN

Stack Overflow用户
提问于 2014-09-05 05:34:19
回答 2查看 201关注 0票数 0

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

代码语言:javascript
复制
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。我想我可以这样做:

代码语言:javascript
复制
$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“。

任何指导和学习机会都是值得感谢的。

EN

回答 2

Stack Overflow用户

发布于 2014-09-05 06:45:52

我的好兄弟,你需要被介绍给Switch cmdlet。这将一次为您的所有公司排序。

代码语言:javascript
复制
$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参数...好吧,这样做的目的是如果你想要一个简单的正则表达式匹配,比如:

代码语言:javascript
复制
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参数进行切换。

票数 2
EN

Stack Overflow用户

发布于 2014-09-05 06:27:38

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

有几种方法可以解决这个问题-首先想到的是将Where-Object替换为'if‘语句。例如

代码语言:javascript
复制
if ($line."IP Address" -Match "^172.31.52.*") { write-output $line }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25675315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档