Jump to content
Melde dich an, um diesen Inhalt zu abonnieren  
Needhelp12

Power Shell - Dateien vergleichen & ausgeben

Empfohlene Beiträge

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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? ;)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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ß
 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 ;)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.txt
Compare-Object -referenceObject $Software -differenceObject $DB
Diff $Software $DB -IncludeEqual |
Format-Table InputObject, SideIndicator -AutoSize
Out-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
                
            }
        }
    }

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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...

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 ! :)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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()

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 von Cybquest

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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ß

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesen Inhalt zu abonnieren  

×