Benutzer mit den meisten Antworten
select-string für mehrere Textdateien

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
- Bearbeitet Denniver ReiningMVP, Moderator Freitag, 20. Mai 2011 11:16 Titel angepasst
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/- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Freitag, 20. Mai 2011 11:56
- Als Antwort markiert VenoX_SCE Dienstag, 24. Mai 2011 08:27
-
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
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/- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Freitag, 20. Mai 2011 11:56
- Als Antwort markiert VenoX_SCE Dienstag, 24. Mai 2011 08:27
-
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
-
$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!
-
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
-
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!!!!