Needhelp12 0 Geschrieben 27. Oktober 2014 Melden Teilen Geschrieben 27. Oktober 2014 Hallo zusammen, ich habe Probleme mit Windows Power Shell, da ich damit noch nie gearbeitet habe. Ich soll mit Hilfe von Windows Power Shell zwei Text Dateien vergleichen und die veränderungen sollen in eine 3. bzw 4. datei gespeichert werden. Konkret geht es darum das Inventarsystem gibt alle 15 min eine Text datei aus: "Software.txt" in dieser Datei steht z.B. Rechner 12345 bekommt Software XY. Das Script soll auf einem Windows Server 2012 auf welchem SCCM Installiert ist nun einen abgleich mit seiner Datenbank machen was hat sich geändert innerhalb der letzten 15 min. Sollte eine änderung geschehen sein soll diese in die Datei "+" geschrieben werden sollte dies nicht der Fall sein wird in die Datei "-" geschrieben. Ebenso soll eine LOG Datei erstellt werden in welcher evtl. Fehlermeldungen ausgegeben werden. Ich bedanke mich vorab schonmal für die Hilfe Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 27. Oktober 2014 Melden Teilen Geschrieben 27. Oktober 2014 Hallo und Willkommen, erwartest Du ein fertiges Script? Hast Du denn andere Script-Erfahrung (VBS o.ä.)? Wie ist, unabhängig von der Scriptsprache, Dein bisheriger Ansatz? Derjenige, der Dir die Aufgabe gab weiß, dass Du noch nie mit PS gearbeitet hast? Dann würde ich mal davon ausgehen, dass er erwartet, dass Du Dir nicht nur ne fertige Lösung "abholst", oder? ;) Zitieren Link zu diesem Kommentar
Needhelp12 0 Geschrieben 27. Oktober 2014 Autor Melden Teilen Geschrieben 27. Oktober 2014 Nein ich erwarte natürlich kein fertiges Script und "erwarten" finde ich ist sowieso ein schwieriges Wort, weil ich um Hilfe bitte und dankbar für jede Antwort bin. (nur am rande) Nein eigentlich gibt es kaum Script erfahrungen, da bisher immer eher der Technische ansatz erarbeitet worden ist, deswegen stehe diesem Thema mit ziemlich schlechten Vorwissen gegenüber. Mein bisheriger Ansatz ist, dass ich versuche mir ein Script aus verscheidenen Quellen wie google zusammen zu kopieren, dass ist leider aber nicht so wie erhofft umzusetzten und habe deshalb den Beitrag in dem "Experten" Forum erstellt. JA, der jenige weiß das und hat mir empfohlen zu Googlen und Hilfe in Foren oder ähnlichen Platformen zu suchen. Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 27. Oktober 2014 Melden Teilen Geschrieben 27. Oktober 2014 OK :) In dieser "Software.txt" steht immer nur was drin, wenn was geändert wurde? D.h. wenn nix geändert wurde, ist die Datei leer? In diesem Fall dürfte ja reichen, den "Content" der Datei in die Ausgabedatei zu schreiben mittels "Append" (also in der Art ...get-content 'MeineDatei'... || ... Out-File... -append...) Wenn die Dateien verglichen werden müssen wäre "Compare-Object" vermutlich der passende Ansatz. Zitieren Link zu diesem Kommentar
Needhelp12 0 Geschrieben 27. Oktober 2014 Autor Melden Teilen Geschrieben 27. Oktober 2014 Erstmal danke für die Antwort,dass hilft mir schonmal weiter, also: Ein Script auf dem Inventar Server erzeugt alle 15 Minuten eine Datei, die “Software.txt“ heißt. Diese beinhaltet immer den kompletten Bestand aller Software die den Endgeräten zugeordnet ist, das ist der sogenannte „SOLL-Bestand“. Nach 15 Minuten wird diese Datei neu erzeugt. Um jetzt die Differenz zur vorherigen Datei ermitteln zu können, muss die vorher erzeugte Datei gespeichert werden. Das ist der Arbeitsauftrag, welchen ich mir quasi selber geschrieben habe, hier ist auch beschrieben, was die Software.txt Datei beinhaltet. Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 27. Oktober 2014 Melden Teilen Geschrieben 27. Oktober 2014 Dann wäre, wie gesagt, Compare-Object wohl das Mittel der Wahl. Über ne Abfrage des "SideIndicator" kannst dann Deine 2 Dateien "+" und "-" befüllen. So in der Art (ungeprüft!): Compare-Object $(Get-Content 'Software.txt') $(Get-Content 'DB.txt') | ? {$_.Sideindicator -eq "=>"} | Out-File 'Hinzugefügt.txt' -append Compare-Object $(Get-Content 'Software.txt') $(Get-Content 'DB.txt') | ? {$_.Sideindicator -eq "<="} | Out-File 'Entfernt.txt' -append ... und danach einfach die Software.txt in DB.txt umkopieren. Zitieren Link zu diesem Kommentar
Needhelp12 0 Geschrieben 28. Oktober 2014 Autor Melden Teilen Geschrieben 28. Oktober 2014 Hallo, danke für die Antwort ich habe das ganze soweit ausprobiert, bisschen abgeändert funktioniert auch die erstellung der beiden Dateien, jedoch schreibt das Script in die Datei "$_.Sideindicator -eq "<=" " und nicht was geändert worden ist. Wie kann ich den fehler beheben ? Gruß Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 28. Oktober 2014 Melden Teilen Geschrieben 28. Oktober 2014 Hast Du die Fragezeichen vergessen? Der mittlere gepipte Teil is kpl. so: ? {$_.Sideindicator -eq "=>"} Statt dem Fragezeichen kannst auch "Where" hinschreiben, dann isses evtl. klarer ;) Zitieren Link zu diesem Kommentar
Needhelp12 0 Geschrieben 28. Oktober 2014 Autor Melden Teilen Geschrieben 28. Oktober 2014 Also der hat anscheinend ein Problem mit ? sowie Where. Ich habe es jetzt mal ganz anders gemacht und er vergleicht jetzt schon mal und legt eine neue Datei an, aber in diese wird nach wie vor keine änderung hinein geschrieben, sie bleibt leer. $Software = Get-Content "C:\Users\nutzer\Desktop\Software.txt"$DB = Get-Content "C:\Users\nutzer\Desktop\DB.txt"Copy-Item C:\Users\nutzer\Desktop\Software.txt C:\Users\nutzer\Desktop\DB.txtCompare-Object -referenceObject $Software -differenceObject $DBDiff $Software $DB -IncludeEqual |Format-Table InputObject, SideIndicator -AutoSizeOut-File 'C:\Users\nutzer\Desktop\änderung.txt' -append Wahlweise auch das hier, wo müsste ich hier Out-File einsetzten, damit ich die Ausgabe erhalte? if($_.InputObject -match $pattern) { if($_.SideIndicator -ne "==") { if($_.SideIndicator -eq "=>") { $lineOperation = "added" |where } elseif($_.SideIndicator -eq "<=") { $lineOperation = "deleted" |where } [PSCustomObject] @{ Line = $lineNumber Operation = $lineOperation Text = $_.InputObject } } } Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 28. Oktober 2014 Melden Teilen Geschrieben 28. Oktober 2014 Nu ja, wenn Du VOR dem Vergleich die Datei umkopierst, muss Deine Ausgabe ja leer sein ;) Bei mir macht dieses Script hier genau das, was Du m.E. gerne hättest... (also diesmal geprüft ;)) $Software = Get-Content "J:\DIV\LOG\Software.txt" $DB = Get-Content "J:\DIV\LOG\DB.txt" Compare-Object $Software $DB | ? {$_.Sideindicator -eq "<="} | Out-File 'J:\DIV\LOG\Hinzugefügt.txt' -append Compare-Object $Software $DB | ? {$_.Sideindicator -eq "=>"} | Out-File 'J:\DIV\LOG\Entfernt.txt' -append Copy "J:\DIV\LOG\Software.txt" "J:\DIV\LOG\DB.txt" ... vor dem "Out-File" könnte man die Ausgabe halt noch bissle hübscher formatieren... Zitieren Link zu diesem Kommentar
Needhelp12 0 Geschrieben 28. Oktober 2014 Autor Melden Teilen Geschrieben 28. Oktober 2014 Super vielen dank, ja das leuchtet ein habe ich in der Zwischenzeit auch bemerkt, dass das nicht funktionieren konnte so :suspect: :D Gibt es durch einen anderen Befehl die möglichkeit die Aktuelle Systemzeit + Datum in das Output File zu bekommen, zur besseren Übersicht ? Bis jetzt wirklich vielen dank für die super Hilfe ! :) Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 28. Oktober 2014 Melden Teilen Geschrieben 28. Oktober 2014 Z.B. vor das Ganze sowas: "Check am " + (get-date)| Out-File 'Hinzugefügt.txt' -append; ... und wenn Datum und Zeit getrennt sein sollen, z.B. (get-date).ToShortDateString() bzw. (get-date).ToShortTimeString() Zitieren Link zu diesem Kommentar
Needhelp12 0 Geschrieben 28. Oktober 2014 Autor Melden Teilen Geschrieben 28. Oktober 2014 Okay, nun wirklich meine allerletzte frage, da ich zu dieser Frage bisher nirgendwo eine Antwort gefunden habe geschweige denn bekommen habe undzwar die Fehlerausgabe dir mir evtl. gegeben wird bsp. ich verschiebe die Software.txt. Wird normalerweise unten in der PS Console angezeigt, ist es möglich diese Fehler in eine Datei umzuleiten sagen wir in C:\log.txt? Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 28. Oktober 2014 Melden Teilen Geschrieben 28. Oktober 2014 (bearbeitet) Ne einfache Möglichkeit wäre: Try { ... bisheriges Script Catch { $Error | Out-File 'C:\log.txt' } ... ansonsten kannst Dir auch mal die Parameter -erroraction und -errorvariable diverser Methoden (wie z.B. Get-Content) anschauen. Einfach mal googlen :) bearbeitet 28. Oktober 2014 von Cybquest Zitieren Link zu diesem Kommentar
nobodycares 0 Geschrieben 29. Oktober 2014 Melden Teilen Geschrieben 29. Oktober 2014 Hallo, ich bin auch neu hier in dem Forum und habe ein ähnliches Problem, die Antworten von dir Frank haben mir jedoch schon ein ganzes Stückchen weitergeholfen. Meine Frage ist es: Bei dem anliegen von Needhelp12 werden zwei Dateien ausgegeben, wäre es hier möglich bevor die ausgabe stattfindet eine Art "Format-Table -Property XY" um die ausgabe noch in Spalten zu sortieren als bsp. Man vergleich zwei Rechnernamen und die dazughörige Software welcher in einer Zahl ausgegeben wird. Das dann über den PC- Namen (Rechner) und über der Zahl (Software) steht, das habe ich mehrfach probiert, jedoch noch keine Lösung gefunden. Gruß Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.