2014-09-04 89 views
0

我正在轉換目前爲每個代理機構解析大型csv文件的代碼。以下是一條線的樣子:Powershell。試圖循環使用導入-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 

我已經試過上述的許多排列,並且它永遠不會是匹配的「位置對象」像它的功能例如上面的腳本。

任何指導和學習機會表示讚賞。

回答

1

Where-Object應該有傳遞給它的對象的集合。在你的第二個腳本塊中,這不會發生,所以在過濾器中$ _變量將是空的。

有幾種方法可以解決這個問題 - 首先想到的是用'if'語句替換Where-Object。例如

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

Tyork,謝謝你的回覆。你們很棒。 – Bruce 2014-09-05 13:39:09

+0

謝謝你的回覆。確實這個例子有效。接下來,要了解爲什麼我的工作原理如正在運行的示例中所示,但不是在我的重寫中。 – Bruce 2014-09-05 14:23:11

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 ,或 - 或語句。如果你使用scriptblock進行匹配(就像我在前面的例子中那樣),你可以使用-match運算符,該運算符默認執行正則表達式匹配,所以你仍然可以使用regex而不必使用Switch的-regex參數。

+0

聖煙! ..和一個瘋狂的技術人員!我正在閱讀關於這個神奇的東西。謝謝。 – Bruce 2014-09-05 13:36:59

+0

閱讀獲取幫助,我看到:PS> switch -Regex(「fourteen」) { 1 {「It is one。」;休息} 2 {「這是兩個。」; Break} – Bruce 2014-09-05 14:11:25

+0

閱讀獲取幫助,我看到:PS> switch -Regex( 「fourteen」) { 1 {「It is one。」;休息} 2 {「這是兩個。」;打破} 我想使用正則表達式,但沒有得到如何插入它。 我想用: $ CompanyA = @() {(($ _。「IP Address」-match「^ 172 \ .2 [1,2] \。\ d {1,3} \。\ d {1,3}「) 我需要在某處添加-RegEx,我已經嘗試過不同的地方,但是PS笑了我的嘗試。 – Bruce 2014-09-05 14:22:04