Natknąłem się na to pytanie, gdy próbuje dowiedzieć się, jak zrobić to samo siebie.
co wymyśliłem jako roztwór był następujący:
$Filtered = $Table|Select-String -Pattern $ExcludeStrings -NotMatch -SimpleMatch
$FilteredArray = @()
$Filtered.Line | foreach {$split = $_ -split ';';
$tidied = $split -replace '@|{|}|^ ';
$obj = New-Object System.Object
$tidied|foreach {$obj|Add-Member -MemberType NoteProperty -Name ($_.split('=')[0]) -Value ($_.split('=')[1])
}
$FilteredArray += $obj
}
Pierwszy wiersz jest po prostu pokazując mi filtrowanie tablicę, że mam za Import-CSV
dostać tylko wyniki chciałem.
Niestety, ten pozostawia mnie z tablicy MatchInfo, a każda tablica jest w następującym formacie:
@{Column1=Value1; Column2=Value2; Column3=Value3;}
nie eksportować z powrotem do pliku CSV ładnie w ogóle, jak jest.
Tak, zdecydowałem się utworzyć nową macierz wyjściową ($FilteredArray
).
Następnie rurami właściwość Line
tablicy matchinfo z Select-String
pętlę foreach i dla każdej linii podzielić ją na średnikiem, a następnie usunąć @ {} chars i wszelkie spacje.
Następnie utworzę nowy System.Object
, a następnie wypiętrzę uporządkowane wyjście do innej pętli foreach, tworząc nowe właściwości Note w obiekcie, nazywając je od bieżącego wiersza w uporządkowanym wyjściu aż do znaku =, a wartość będącą pozostałością tekst po znaku =.
Co ja skończyć z jest:
PS C:\Users\Graham> $obj
Column1 : Value1
Column2 : Value2
Column3 : Value3
a przefiltrowany tablica wygląda następująco:
PS C:\Users\Graham> $FilteredArray[0..3]|Format-table
Column1 Column2 Column2
------- ------- -------
Value1 Value2 Value3
Value1 Value2 Value3
Value1 Value2 Value3
To faktycznie działa bardzo dobrze. Wcześniej miałem podobne polecenia, ale nie określiłem -Enc ascii, więc powoduje to niepożądane skutki. Druga część musi porównać nowy plik data.csv z inną listą CSV, która ma wykluczenia, które należy odfiltrować. Powyższe polecenie prawdopodobnie zadziała, może uda mi się pobrać zawartość listy wykluczeń do tablicy i zmienić "Nie zainstalowane" w $ wyłączenia? – user2284702
Jeśli używasz Import-Csv do pobierania obu plików CSV, kończy się tablica obiektów, w których każdy obiekt ma właściwości odpowiadające polom w pliku CSV. Więc możesz zrobić coś takiego '$ importedCsv1 | Gdzie {$ csv1Field = $ _. Field; ($ importCsv2 | Gdzie {$ _. FilterField -eq $ csv1Field}) .Potwierdzić-0} ' –
$ csv | Select-String -NotMatch $ exclusions | Out-File $ hosts -Enc ascii działa w celu usunięcia wszystkich wykluczeń z pliku data.csv, ale pozostawia pusty wiersz u góry dla każdego dopasowania, które usuwa. Jakieś pomysły? – user2284702