Jump to content

Power Shell - Dateien vergleichen & ausgeben


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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ß

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...