Zum Inhalt wechseln


Foto

Power Shell - Dateien vergleichen & ausgeben

Windows Server 2012 SCCM

  • Bitte melde dich an um zu Antworten
23 Antworten in diesem Thema

#1 Needhelp12

Needhelp12

    Newbie

  • 12 Beiträge

 

Geschrieben 27. Oktober 2014 - 08:18

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



#2 Cybquest

Cybquest

    Expert Member

  • 1.886 Beiträge

 

Geschrieben 27. Oktober 2014 - 10:29

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


My name is Frank, you can say you to me.

#3 Needhelp12

Needhelp12

    Newbie

  • 12 Beiträge

 

Geschrieben 27. Oktober 2014 - 10:47

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.



#4 Cybquest

Cybquest

    Expert Member

  • 1.886 Beiträge

 

Geschrieben 27. Oktober 2014 - 11:18

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.


My name is Frank, you can say you to me.

#5 Needhelp12

Needhelp12

    Newbie

  • 12 Beiträge

 

Geschrieben 27. Oktober 2014 - 14:28

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.



#6 Cybquest

Cybquest

    Expert Member

  • 1.886 Beiträge

 

Geschrieben 27. Oktober 2014 - 15:01

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.


My name is Frank, you can say you to me.

#7 Needhelp12

Needhelp12

    Newbie

  • 12 Beiträge

 

Geschrieben 28. Oktober 2014 - 07:01

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ß
 



#8 Cybquest

Cybquest

    Expert Member

  • 1.886 Beiträge

 

Geschrieben 28. Oktober 2014 - 08:33

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


My name is Frank, you can say you to me.

#9 Needhelp12

Needhelp12

    Newbie

  • 12 Beiträge

 

Geschrieben 28. Oktober 2014 - 10:16

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



#10 Cybquest

Cybquest

    Expert Member

  • 1.886 Beiträge

 

Geschrieben 28. Oktober 2014 - 10:35

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


My name is Frank, you can say you to me.

#11 Needhelp12

Needhelp12

    Newbie

  • 12 Beiträge

 

Geschrieben 28. Oktober 2014 - 10:58

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



#12 Cybquest

Cybquest

    Expert Member

  • 1.886 Beiträge

 

Geschrieben 28. Oktober 2014 - 11:56

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


My name is Frank, you can say you to me.

#13 Needhelp12

Needhelp12

    Newbie

  • 12 Beiträge

 

Geschrieben 28. Oktober 2014 - 12:15

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?



#14 Cybquest

Cybquest

    Expert Member

  • 1.886 Beiträge

 

Geschrieben 28. Oktober 2014 - 12:37

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, 28. Oktober 2014 - 12:39.

My name is Frank, you can say you to me.

#15 nobodycares

nobodycares

    Newbie

  • 1 Beiträge

 

Geschrieben 29. Oktober 2014 - 07:40

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ß





Auch mit einem oder mehreren der folgenden Tags versehen: Windows Server 2012, SCCM