none
select-string für mehrere Textdateien RRS feed

  • Frage

  • Hallo!

    Ich habe folgende aufgabe zu lösen:

    Eine installation schreibt auf einem zentralen Verzeichnis für jeden PC ein Logfile, das in etwa so aussieht PC11001.txt - da dort etwa 300-400 logfiles liegen und immer wieder neue dazukommen, brauche ich ein Script dass den Installationserfolg nachvollziehen kann.

    Wenn im logfile der String 3510. (mit dem Punkt!) vorkommt, dann ist die Installation richtig erfolgt --> die zugehörige Textdatei soll in den Unterordner "OK" verschoben werden.

    So, nun habe ich bereits folgendes:

    # $ziel = Verzeichnis in das die Logs der Rechner, welche OK sind, geschoben werden
    
    
    
    $ziel = \\UNC PFAD zum verzeichnis in dem die Textdateien liegen sollen wenn sie ok sind
    
    
    
    Get-ChildItem –Recurse | foreach ($_) {
    
    $a = select-string -pattern ": 8.0.3510." -quiet
    
    
    
    If ($a = "True") { Move-Item $_.fullname $ziel }
    
    }
    
    

     Aber leider komme ich auf keinen grünen Zweig damit :(

    lg & danke im Voraus


    Freitag, 20. Mai 2011 06:33

Antworten

  • Der Grundgedanke war schon ganz richtig, du hast nur ein paar Fehler in der Pipeline. Grundsätzlich würde ich am Anfang die Pipeline nur benutzen, wenn du davon wirklich einen funktionellen Gewinn erzielst, ansonsten wird es dadurch Syntaxmässig nur komplizierter.

    Ohne kannst du das Skript Schritt für Schritt aufbauen und leichter debuggen:

    $installresults = "d:\test"
    $okdir = "d:\ok"
    
    $erg = Get-ChildItem $installresults –Recurse 
    
    foreach ($file in $erg) {
     if (select-string $file -pattern 3510.) {
     Move-Item $file.fullname $okdir -whatif
     }
    }
    
    

    Das -whatif hinter Move-Item kannst du rauslöschen, wenn das Egebnis beim Testlauf wie gewünscht ist.
    Die richtige Syntax mit Pipeline will ich dir aber nicht vorenthalten :)

    $installresults = "d:\test"
    $okdir = "d:\ok"
    Get-ChildItem $installresults –Recurse | Where-Object {select-string $_ -pattern 3510.} | Move-Item -destination $okdir -whatif
    


    Grüße, Denniver

     


    http://bytecookie.wordpress.com/
    Freitag, 20. Mai 2011 11:13
    Moderator
  • Ich kann den Fehler nicht reproduzieren. Die Fehlermeldung weist aber darauf hin, das PoSH im Select-Befehl die einzelnen Dateien nicht im angebenden Verzeichnis verortet, sondern im Scriptverzeichnis. Ändere daher mal die Zeile:

     if (select-string $file -pattern 3510.) {
    
    

    in diese:

     if (select-string $file.fullname -pattern 3510.) {
    

    und teste es mal so.

    Grüße, Denniver

     

     


    http://bytecookie.wordpress.com/


    • Als Antwort markiert VenoX_SCE Dienstag, 24. Mai 2011 08:27
    Dienstag, 24. Mai 2011 00:41
    Moderator

Alle Antworten

  • Der Grundgedanke war schon ganz richtig, du hast nur ein paar Fehler in der Pipeline. Grundsätzlich würde ich am Anfang die Pipeline nur benutzen, wenn du davon wirklich einen funktionellen Gewinn erzielst, ansonsten wird es dadurch Syntaxmässig nur komplizierter.

    Ohne kannst du das Skript Schritt für Schritt aufbauen und leichter debuggen:

    $installresults = "d:\test"
    $okdir = "d:\ok"
    
    $erg = Get-ChildItem $installresults –Recurse 
    
    foreach ($file in $erg) {
     if (select-string $file -pattern 3510.) {
     Move-Item $file.fullname $okdir -whatif
     }
    }
    
    

    Das -whatif hinter Move-Item kannst du rauslöschen, wenn das Egebnis beim Testlauf wie gewünscht ist.
    Die richtige Syntax mit Pipeline will ich dir aber nicht vorenthalten :)

    $installresults = "d:\test"
    $okdir = "d:\ok"
    Get-ChildItem $installresults –Recurse | Where-Object {select-string $_ -pattern 3510.} | Move-Item -destination $okdir -whatif
    


    Grüße, Denniver

     


    http://bytecookie.wordpress.com/
    Freitag, 20. Mai 2011 11:13
    Moderator
  • Hallo,

    konnte Dennivers Tipp weiterhelfen?

    Gruß,
    Andrei

    Sonntag, 22. Mai 2011 17:27
    Moderator
  • Hallo!

    Erstmal vielen Dank für den Tip - das sieht sehr gut aus, bei -whatif macht er alles richtig, aber ausführen tut er das script nicht - ich erhalte folgende fehlermeldung:

    PS C:\Users\USERNAME\Desktop> C:\Users\USERNAME\Desktop\Check_OFCinstall.ps1
    
    
    
    Select-String : Der Pfad "C:\Users\USERNAME\Desktop\ok" kann nicht gefunden werden, da er nich
    
    
    
    t vorhanden ist.
    
    
    
    Bei C:\Users\USERNAME\Desktop\Check_OFCinstall.ps1:7 Zeichen:19
    
    
    
    + if (select-string <<<< $file -pattern 3510.) {
    
    
    
     + CategoryInfo  : ObjectNotFound: (C:\Users\arzberger\Desktop\ok:String) [Select-S 
    
    
    
     tring], ItemNotFoundException
    
    
    
     + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SelectStringCommand
    
    
    
    
    
    
    
    
    
    
    
    

    Ich verstehe das nicht, ich habe 100% für die beiden variablen $installresults und $okdir die richtigen Pfade angegeben.

    Bei USERNAME steht natürlich mein Username :)

    lg

     




    • Bearbeitet VenoX_SCE Montag, 23. Mai 2011 12:22
    Montag, 23. Mai 2011 08:14
  • Poste mal bitte das Skript so wie es jetzt aussieht.

    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Montag, 23. Mai 2011 11:44
    Moderator
  • $installresults = "\\scbfile01\prism$\Sources\OScan8-MSI\log"
    $okdir = "\\scbfile01\prism$\Sources\OScan8-MSI\log\ok"
    
    $erg = Get-ChildItem $installresults –Recurse 
    
    foreach ($file in $erg) {
     if (select-string $file -pattern 3510.) {
     Move-Item $file.fullname $okdir -whatif
     }
    }
    
    

    lg & danke für die Hilfe bis jetzt und im Voraus!

    Montag, 23. Mai 2011 12:21
  • Ich kann den Fehler nicht reproduzieren. Die Fehlermeldung weist aber darauf hin, das PoSH im Select-Befehl die einzelnen Dateien nicht im angebenden Verzeichnis verortet, sondern im Scriptverzeichnis. Ändere daher mal die Zeile:

     if (select-string $file -pattern 3510.) {
    
    

    in diese:

     if (select-string $file.fullname -pattern 3510.) {
    

    und teste es mal so.

    Grüße, Denniver

     

     


    http://bytecookie.wordpress.com/


    • Als Antwort markiert VenoX_SCE Dienstag, 24. Mai 2011 08:27
    Dienstag, 24. Mai 2011 00:41
    Moderator
  • Hab den Fehler gefunden - er hat "ok" mit select string bearbeiten wollen (Fehlermeldung kann datei nicht öffnen - klar, ist ja ein ordner) - so funktionierts:

    $installresults = "\\scbfile01\prism$\Sources\OScan8-MSI\log"
    $okdir = "\\scbfile01\prism$\Sources\OScan8-MSI\ok"
    
    $erg = Get-ChildItem $installresults –Recurse 
    
    foreach ($file in $erg) {
     if (select-string $file.fullname -pattern 3510.) {
     Move-Item $file.fullname $okdir -whatif
     }
    }
    

     

    Vielen dank nochmal!!!!

    Dienstag, 24. Mai 2011 08:26