Powershell. Пытаться к циклу с использованием Import-csv

97
8

Я конвертирую код, который в настоящее время анализирует большой файл 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", как это делается на примере скрипта, описанного выше.

Любые рекомендации и возможности обучения приветствуются.

спросил(а) 2021-01-19T19:22:19+03:00 2 месяца, 3 недели назад
1
Решение
75

Мой хороший человек, вам нужно познакомиться с командлетом 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 для Переключатель.

ответил(а) 2021-01-19T19:22:19+03:00 2 месяца, 3 недели назад
62

Where-Object должен иметь набор переданных ему объектов. В вашем втором блоке сценария это не происходит, поэтому в фильтре переменная $ _ будет пустой.

Есть несколько способов исправить это - первое, что приходит на ум, это заменить Where-Object выражением "if". Например

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

ответил(а) 2021-01-19T19:22:19+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема