Powershell – ricerca CSV e restituire solo le righe con errore specifico

Sto cercando di scrivere uno script powershell che restituisce solo le righe che hanno una voce specifica in una delle colonne, ma un po ‘ fatica.
Il CSV ha 2 colonne rilevanti, l’ID e l’Errore.
Al momento ho questo:

$ImportFile = Import-csv X:\errorlist.csv
$Error = $userobject.Error
$ID = $userobject.ID
 $ErrorMessage1 = "Error1"

 foreach($test in $ImportFile) 
  {
   $field1 = $test.Error
   $field2 = $test.ID
     Echo "$field1, $field2" 
  } Where-Object {$_.Error -like $ErrorMessage1}   

Tuttavia l’eco ritorna ancora tutto in csv, anche con il Where-Object.
Sto cercando di eseguire un ForEach perché, in definitiva, dove ho l’eco ho intenzione di inserire uno script SQL che utilizza l’ID di informazioni nel file csv per correggere gli errori specifici. Quindi penso che ho bisogno di tenere il foreach per ogni processo di script sql a sua volta, a meno che qualcuno non ha un’idea migliore?

 

3 Replies
  1. 0

    Filtrare le righe da un file CSV prima di eseguire l’istruzione SQL:

    Import-Csv X:\errorlist.csv |
        Where-Object { $_.Error -like $ErrorMessage } |
        ForEach-Object {
            # Don't use aliases in scripts, use the real cmdlet names. Makes maintenance easier.
            Write-Host ('{0}, {1}' -f $_.Error,$_.ID)
    
            # Run your SQL cmd here.
        }
    • Grazie @spruzzato di bit…. che è esattamente quello che stavo cercando.
  2. 1

    Provare in questo modo, questo controllo per $ErrorMessage1 l’ID di Errore o di colonne:

    Import-csv X:\errorlist.csv | 
    Where-Object {$_.Error -like "*$ErrorMessage1*" -or $_.ID -like "*$ErrorMessage1*"}
    • Mi piacerebbe farlo -like "*$ErrorMessage1*" o -eq $ErrorMessage1.
    • Grazie, penso che dovrebbe avere ampliato un po ‘ quello che il mio obiettivo finale sarà… io sto cercando di eseguire un ForEach perché, in definitiva, dove ho l’eco ho intenzione di inserire uno script SQL che utilizza l’ID di informazioni nel file csv per correggere gli errori specifici. Quindi penso che ho bisogno di tenere il foreach per ogni processo di script sql a sua volta, a meno che qualcuno non ha un’idea migliore?
    • È possibile reindirizzare al foreach-object e utilizzare un’istruzione IF all’interno di esso.
    • si dovrebbe includere queste informazioni nel tuo post originale, sapere che cosa ulteriore elaborazione deve avvenire sarà aiutare le persone a dare il miglior consiglio possibile.
    • D’accordo, grazie per il commento
    • sì, buona idea. Ci scusiamo per la mancanza di info nel primo post, questo è letteralmente il primo script di powershell ho provato a scrivere e di apprendimento veloce, ci sono un sacco di opzioni diverse in powershell che dipendono da altri fattori!

  3. 0

    Il foreach loop opera in modo indipendente degli Where-object, in modo che tutti si stanno facendo è il dump del contenuto del file CSV per la console.

    È possibile abbreviare questo molto semplicemente pompando i dati attraverso la pipeline. Questo filtro CSV record verso il basso per solo quelli che soddisfano i tuoi criteri.

    $ErrorMessage1 = "Error1"
    $allerrors = Import-csv X:\errorlist.csv|where-object {$_.error -eq $ErrorMessage1}
    $allerrors;

Lascia un commento