Powershell. Пытаться к циклу с использованием Import-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", как это делается на примере скрипта, описанного выше.
Любые рекомендации и возможности обучения приветствуются.
Мой хороший человек, вам нужно познакомиться с командлетом Switch. Это будет сортироваться для всех ваших компаний сразу.
$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, как это было в вашем скрипте. The ;Continue
просто делает это так, что перестает пытаться соответствовать, как только он находит правильное совпадение, и переходите к следующей записи. Если он не может соответствовать ни одному из них, он по умолчанию добавит его в Неизвестный массив, а в конце проверяет, есть ли там там, он предупреждает хост и перечисляет непревзойденные записи.
Изменить: Включить аргумент -RegEx... Итак, для этого вам нужно простое совпадение регулярных выражений, такое как:
Switch -regex ($ArrayOfData){
".*@.+?\..{2,5}" {"It an email address"}
"\d{3}(?:\)|\.|-)\d{3}(?:\.|-)\d{4}" {"It a phone number"}
"\d{3}-\d{2}-\d{4}" {"Probably a social security number"}
}
То, что это не позволяет, - это -and или -or. Если вы используете скриптблока для сопоставления (например, в моем верхнем примере), вы можете использовать оператор -match, который по умолчанию выполняет регулярное выражение, поэтому вы все равно можете использовать регулярное выражение, не используя аргумент -RegEx для Переключатель.
Where-Object должен иметь набор переданных ему объектов. В вашем втором блоке сценария это не происходит, поэтому в фильтре переменная $ _ будет пустой.
Есть несколько способов исправить это - первое, что приходит на ум, это заменить Where-Object выражением "if". Например
if ($line."IP Address" -Match "^172.31.52.*") { write-output $line }