none
Nur aktuelle, tägliche Logs zusammenfassen RRS feed

  • Frage

  • Guten Morgen zusammen,

    ich habe einen Code, der die täglichen Logdateien in ein monatliches Log zusammenschreibt. Das wird dann wiederum in ein Zip-Archiv geschoben.

    Das Problem ist jetzt, dass die alten, täglichen Logs z.B. die vom April im selben SourceOrdner stehen, wie die neuen Logs vom Mai. Deswegen möchte ich, dass die täglichen Logs vom z.B. April gelöscht werden, nachdem das monatliche Log erstellt wurde.  ODER: Eine Abfrage, die die tägl. Logs des aktuellen Monats zusammenfast ind das monatliche. Damit im Ordner immer die aktuellen täglichen Logs zusammengefasst werden.

    Noch zur Info: Das Script wirtd 1 Mal im Monat von einem Task ausgeführt.

    Set-StrictMode -Version "2.0"
    Clear-Host
    Import-Module pscx
    
    $Source="D:\bla\bla"
    $Destination="D:\bla\bla\bla" #muss existieren
    $Level=1
    $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)
    
    #Alle Verzeichnisse
    $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | Where{$_.PSISContainer -Match $true})
    
    #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm
    ForEach ($Folder in $Folders) {
        $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log'
        Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname 'u_ex*.log'))
        
        #das monatliche LogFile wird in ein gleichnamiges Zip-Archive gepackt 
        ForEach ($File in Get-ChildItem -Path $Folder) {
            if ($File.name -notlike "u_*") {
    	       Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append}
        }
    }

    Freue mich über jede Hilfe!

    Vielen Dank!


    • Bearbeitet Randy30 Montag, 3. Juni 2013 08:26
    Montag, 3. Juni 2013 07:02

Antworten

  • Set-StrictMode -Version "2.0"
    Clear-Host
    Import-Module pscx
    
    $Source="D:\bla\bla"
    $Destination="D:\bla\bla\bla" #muss existieren
    $Level=1
    $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)
    $VorMonat = "{0:00}" -f ((get-date).Month -1)
    
    #Alle Verzeichnisse
    $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | where{$_.PSISContainer -match $true})
    
    #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm
    
    foreach ($Folder in $Folders) {
        $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log'
        Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname "u_ex13$($VorMonat)*.log"))
        
        #das monatliche LogFile wird in ein gleichnamiges Zip-Archive gepackt 
        foreach ($File in Get-ChildItem -Path $Folder) {
            if ($File.name -notlike "u_*") {
    	       Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append}
        }
    }

    Dein Code von oben, erganezt um die bildung des Vormonates und bei Add-Content arbeite ich nicht nun mit diesem Moant.

    "u_ex13$($VorMonat)*.log"

    • Als Antwort markiert Randy30 Dienstag, 4. Juni 2013 11:26
    Dienstag, 4. Juni 2013 10:45
  • Man könnte da jetzt bei Remove-Item mit dem Parameter -ErrorAction SilentliContinue Arbeiten.
    Dies machen nur Anfänger! Wir sind aber Profis! ;-)
    Es ist immer schlecht Fehler zu Ignorieren dann weiß man nicht mehr was vor sich geht!
    Ich habe eine IF abfrage eingebaut, die Testet ob es die Datei noch gibt, wenn ja wird Sie gelöscht:

    Set-StrictMode -Version "2.0"
    Clear-Host
    Import-Module pscx

    # einmalige Variablen Initialisierung
    $Source="D:\bla\bla"
    $Destination="D:\bla\bla\bla" #muss existieren
    $ZipKompressionsLevel=1
    $JahrMonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)
    $VorMonat = "{0:00}" -f ((get-date).Month -1)


    #Alle Verzeichnisse ermitteln
    $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | Where{$_.PSISContainer -Match $true})

    # jeden Ordner durchlaufen
    ForEach ($Folder in $Folders) {

        # Dateinamen für die Sammeldatei + Pfad zu dem Aktuellen Ordner erstellen
        $SammelDateiPfad = Join-Path $Folder.Fullname "$($Folder.Name)_$JahrMonat.log"
        
        # jede *.log Datei in dem Ordner durchlaufen
        ForEach ($File in Get-ChildItem -Path $Folder -Filter "*.log") {
                
            # Wenn die Datei im Namen den letzten Monat hat
            If ($VorMonat -eq $File.Name.Substring(6,2)) {
                
                # Fehler abfangen damit nicht eine Datei gelöscht wird,
                # obwohl sie nicht in der Sammeldatei ist!
                Try{
                    # Sammeldatei erstellen und
                    # alle täglichen Logs eines Monats in einer Datei Sammeln
                    # Diese Datei liegt im Aktuell bearbeiteten Ordner
                    Add-Content -Path $SammelDateiPfad -Value (Get-Content -Path $File.Fullname) -ErrorAction stop
                
                    # Log-Datei ist nun in der Sammeldatei und sie wird gelöscht wenn Sie noch existiert
                    If (Test-Path $File.Fullname) {
                        Remove-Item -Path $File.Fullname -Force -WhatIf
                    }
                    
                } # End Try
                Catch {
                    # Fehler ausgeben
                    Write-Error -Message "Fehler beim anhängen der Datei $($File.Fullname) `n and die Datei $SammelDateiPfad!" -Exception $_.Exception
                } # End Catch
            } # End If $VorMonat
        } # End ForEach $File
        
        
        # Fehler abfangen damit die Sammeldatei nicht gelöscht wird,
        # wenn beim zippen etwas schief läuft!
        Try{
            # Sammeldatei des Monats zu dem Zip Archiv hinzufügen
            Write-Zip -path $SammelDateiPfad -Level $ZipKompressionsLevel -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append -ErrorAction stop
            
            # Die Sammeldatei ist nun in der Zip-Datei Ich lösche Sie wenn sie noch existiert
            IF (Test-Path $File.Fullname) {
                Remove-Item -Path $File.Fullname -Force -WhatIf
            }
            
        }
        Catch {
            # Fehler ausgeben
            Write-Error -Message "Fehler beim anhängen der Datei $SammelDateiPfad `n and die ZIP-Datei $((Join-Path $Destination  ($Folder.Name + '.zip')))!" -Exception $_.Exception
        }
        
    } # End ForEach $Folder


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Mittwoch, 5. Juni 2013 10:28
    • Als Antwort markiert Randy30 Mittwoch, 5. Juni 2013 11:22
    Mittwoch, 5. Juni 2013 10:22

Alle Antworten

  • Eine einfache Variante wäre deine IF-Abfrage ganz unten um die Bedingung zu erweitern, das dass letzte Schreibzugriffsdatum der Datei im aktuellen Monat liegen muß:

     

    	if (($File.name -notlike "u_*") -and ( ($file.LastWriteTime).Month -eq (get-date).Month )) {
    	    Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append}
        }

     
    Mit einer Negierung dieser Abfrage (also dann mit -ne statt -eq) kannst du natürlich auch umgekehrt alle Dateien herausfinden die nicht aus dem aktuellen Monat stammen und löschen oder verschieben etc.
    Sicherer wäre es allerdings wenn die Dateien z.b. das Datum in ihrem Dateinamen hätten und man darauf filtern könnte. Die Benutzung der CreationTime/LastWriteTime/etc.-Flags ist immer mit einer Restunsicherheit behaftet.

     Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Montag, 3. Juni 2013 08:43
    Moderator
  • Vielen Dank Denniver für deine Antwort,

    aber ich glaube ich habs nicht gut erklärt.

    In meinem Code werden alle täglichen Logs (der jew. Verzeichnisse) zusammengefasst. Aber ich will selektieren, dh. nur die aktuellsten in das monatliche Log ($Dateiname) zusammenfassen und dann erst in das Zip-Archiv schieben. Und die alten, die ja schon im Vormonat zusammengefasst wurden löschen/verschieben...

    vielen Dank u viele Grüße

    Randy30


    • Bearbeitet Randy30 Montag, 3. Juni 2013 10:27
    Montag, 3. Juni 2013 10:26
  • Du hast den Code oben nicht selbst geschrieben, oder? :)

    Wie auch immer, du hast leider wieder keine Zusatzinfos rausgerückt. Das macht es sehr schwierig genau zu verstehen was du tun willst.

    Ich glaube du musst mal genauer ausführen wie deine Verzeichnis/Datei-Struktur aufgebaut ist und was du ganz genau machen möchtest.

    Bitte mal anhand eines konkreten Beispiels...

     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 3. Juni 2013 11:58
    Moderator
  • genau, das meiste ist nicht von mir....

    Beispiel:

    unter "D:bla\bla" stehen folgede tägl. Logs:

    u_ex130512

    u_ex130510

    u_ex130405

    u_ex130306

    jetzt sollen aber (über einen Task) 1 mal im Monat alle tägl. Logfiles des letzten Monats zusammengefasst werden. D.h. z.b: am 1.Juni werden u_ex130512

    und u_ex130510 zu einer monatlichen Datei XXX_yyyymm zusammengefasst. (Dann in das Zip-Archiv geschoben)

    Mein momentaner Code, fasst aber alle oben genannten Logfiles in ein monatliches Logfile zusammen. Was ja nicht richtig ist... also noch bevor ins Zip-Archiv gepackt wird, wahrscheinlich in der ersten For-Each-Schleife, muss die Abfrage passieren?!

    Ich hoffe ich habs jetzt besser erklären können.

    Vielen Dank für eure Hilfe...

    Dienstag, 4. Juni 2013 07:04
  • Hallo,

    also wenn dein Script z.B.: immer am 1. eines Monates laeuft kann du mit folgendem Code den Vormonat 2 stellig ermitteln.

    $VorMonat = "{0:00}" -f ((get-date).Month -1)
    $VorMonat

    Also im Moment 05, diese 05 taucht ja nun in den gewuenchten Dateien auf, d.h. die kannst Du so ueber eine Substrting extrahieren. ab der Stelle 6 in der Laenge 2. Man beginnt mit 0 beim Zaehlen. Wenn Du allerdings unerschiedliche Namens Formate hast muss hier noch nachgearbeitet werden...

    $FileName = "u_ex130512"
    $FileMonat = $FileName.Substring(6,2)
    $FileMonat

    Somit erhaelts Du fuer die gewuenschten Dateien auch die 05.

    Nun musst Du nur noch die Add-Content-Zeile mit eine IF-Abfrage ummanteln, welche prueft ob $VorMoant -eq $FileMoant ist.

    Die Variablen Namen musst du entsprechend anpassen.

    Beste Gruesse
    brima

    Dienstag, 4. Juni 2013 08:01
  • Vielen Dank brima,

    ich habe mein $File.name in einen String umgewandelt, damit ich die Substring Methode nutzen kann. Wahrscheinlich nicht grad die schönste Methode...

    Habs getestet, das Komische ist, es wird teilweise ignoriert OBWOHL in jedem Verzeichnis tägliche Logs für Mai enthalten sind! :-/

    (Die Namensformate sind bei allen Log-Files identisch)

    ...
    $VorMonat = "{0:00}" -f ((get-date).Month -1)
    
    ForEach ($Folder in $Folders) {
        $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log'
        $FileM = $File.name.ToString()
        $FileMonat = $FileM.Substring(6,2) if ($VorMonat -eq $FileMonat) {Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname 'u_ex*.log'))} #das monatliche LogFile wird in ein gleichnamiges Zip-Archive gepackt ForEach ($File in Get-ChildItem -Path $Folder) { if ($File.name -notlike "u_*") { Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination ($Folder.Name + '.zip')) -quiet -Append} } }

    Was mache ich falsch??

    Viele Grüße


    • Bearbeitet Randy30 Dienstag, 4. Juni 2013 09:41
    Dienstag, 4. Juni 2013 09:40
  • Hallo,

    aus deinem Code geht nicht hervor, was hier $File sein soll, $FileM = $File.name.ToString(), das taucht erst in der zeiten ForEach auf. und bei Add Content sprichts du die Datei, die du hinzufuegen willst mit $Folder.Fullname an, dass passt alles nicht zusammen, und so bringt das IF eingelich auch nicht viel, weil du pruefst auf eine Datei ab fuegst aber wegen dem Stern in 'u_ex*.log' doch alles hinzu, usw.

    Mit Verlaub, ein grosses durcheinander. Darauf hat dich ja schon Denniver mit anderen Worten bereichts aufmerksam gemacht.

    Beste Gruesse
    brima

    Dienstag, 4. Juni 2013 10:30
  • Set-StrictMode -Version "2.0"
    Clear-Host
    Import-Module pscx
    
    $Source="D:\bla\bla"
    $Destination="D:\bla\bla\bla" #muss existieren
    $Level=1
    $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)
    $VorMonat = "{0:00}" -f ((get-date).Month -1)
    
    #Alle Verzeichnisse
    $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | where{$_.PSISContainer -match $true})
    
    #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm
    
    foreach ($Folder in $Folders) {
        $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log'
        Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname "u_ex13$($VorMonat)*.log"))
        
        #das monatliche LogFile wird in ein gleichnamiges Zip-Archive gepackt 
        foreach ($File in Get-ChildItem -Path $Folder) {
            if ($File.name -notlike "u_*") {
    	       Write-Zip -path $File.Fullname -Level $Level -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append}
        }
    }

    Dein Code von oben, erganezt um die bildung des Vormonates und bei Add-Content arbeite ich nicht nun mit diesem Moant.

    "u_ex13$($VorMonat)*.log"

    • Als Antwort markiert Randy30 Dienstag, 4. Juni 2013 11:26
    Dienstag, 4. Juni 2013 10:45
  • Hallo nochmal,

    sorry wg. dem Durcheinander! Bin wie gesagt noch Neuling und Blick grad gar nicht wirklich durch.

    Über die Add-Content Zeile habe ich nicht wirklich nachgedacht, aber das macht wirklich keinen Sinn.

    $File.name gibt  z.B.: u_ex130501.log aus deswegen mein Gedanke dies in ein String umzuwandeln; Aber $File taucht erst unten auf, das ist richtig. so funzt es nicht.

    doch komplizierter als ich dachte... :-(

    Dienstag, 4. Juni 2013 10:58
  • Vielen Dank brima!

    Das funktioniert!!! Auf diese Schreibweise wäre ich nicht gekommen!!!

    Eine Frage hätte ich noch: Es wird der komplette Pfad gezipped, aber Ziel ist, nur das jeweilige monatliche Logfile ins entsprechende Zip-Archiv zu schieben. So dass $Destination folgendes enthält: Datei.zip\XXX_yyyymm.log - also nicht $File.Fullname als Pfadangabe im Write-Zip. Ich hatte es vorher anders, aber nicht sauber...jetzt weiß ich (wiedermal) nicht genau wie ich das realisieren kann...

    Vielen Dank &Viele Grüße 

    Dienstag, 4. Juni 2013 11:39
  • Hallo.

    also mit

    Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname "u_ex13$($VorMonat)*.log"))

    hast du ja jetzt in >Join-Path $Folder.Fullname $Dateiname< deine gewuenschten Logs, also alle die fuer z.B: dem Moant 5 in diesem Oddner, wenn ich es richtig verstehe (ist halt eben schwer weil keiner hier deine Verzeichnisstruktur kennt)

    Und eben diese Datei willtst Du nun gezippt unter einem anderen Verzeichnis ablegen?

    Dann kannst Du direkt unter Add-Content mit der Zeile  Write-Zip weitermachen.

    Set-StrictMode -Version "2.0"
    Clear-Host
    Import-Module pscx
    
    $Source="D:\bla\bla"
    $Destination="D:\bla\bla\bla" #muss existieren
    $Level=1
    $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)
    $VorMonat = "{0:00}" -f ((get-date).Month -1)
    
    #Alle Verzeichnisse
    $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | where{$_.PSISContainer -match $true})
    
    #sammelt die tägl. Logs in monatliche nach folgendem Muster: XXX_yyyymm
    
    foreach ($Folder in $Folders) {
        $Dateiname= $Folder.Name + '_' + $jahrmonat + '.log'
        Add-Content -Path (Join-Path $Folder.Fullname $Dateiname) -Value (Get-Content -Path (Join-Path $Folder.Fullname "u_ex13$($VorMonat)*.log"))
    	Write-Zip -path (Join-Path $Folder.Fullname $Dateiname) -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append
    }

    Dienstag, 4. Juni 2013 12:02
  • Wenn ich dich richtig verstanden habe müsste es mit meinem Code Funktionieren.
    Ich habe auch Code drin der Dateien Löscht !!
    Diesen Code habe ich mit -Whatif so abgesichert das die Dateien nicht wirklich gelöscht werden.
    Es wird dir nur angezeigt was passieren würde wenn....
    Wenn du das löschen Aktivieren willst musst du -Whatif entfernen.

    Ungetestet!:

    Set-StrictMode -Version "2.0"
    Clear-Host
    Import-Module pscx
    
    # einmalige Variablen Initialisierung
    $Source="D:\bla\bla"
    $Destination="D:\bla\bla\bla" #muss existieren
    $Level=1
    $jahrmonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)
    $VorMonat = "{0:00}" -f ((get-date).Month -1)
    
    
    #Alle Verzeichnisse ermitteln
    $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | Where{$_.PSISContainer -Match $true})
    
    # jeden Ordner durchlaufen
    ForEach ($Folder in $Folders) {
    
        # Dateinamen für die Sammeldatei + Pfad zu dem Aktuellen Ordner erstellen
    	$SammelDateiPfad = Join-Path $Folder.Fullname "$($Folder.Name)_$jahrmonat.log"
        
        # jede *.log Datei in dem Ordner durchlaufen
    	ForEach ($File in Get-ChildItem -Path $Folder -Filter "*.log") {
            	
    		# Wenn die Datei im Namen den letzten Monat hat 
    		If ($VorMonat -eq $File.Name.Substring(6,2)) {
    			
    			# Fehler abfangen damit nicht eine Datei gelöscht wird,
    			# obwohl sie nicht in der Sammeldatei ist!
    			Try{
    				# Sammeldatei erstellen und
        			# alle täglichen Logs eines Monats in einer Datei Sammeln
    				# Diese Datei liegt im Aktuell bearbeiteten Ordner
        			Add-Content -Path $SammelDateiPfad -Value (Get-Content -Path $File.Fullname) -ErrorAction stop
    			
    				# Log-Datei ist nun in der Sammeldatei und sie wird gelöscht
    				Remove-Item -Path $File.Fullname -Force -WhatIf
    				
    			} # End Try
    			Catch {
    				# Fehler ausgeben
    				Write-Error -Message "Fehler beim anhängen der Datei $($File.Fullname) `n and die Datei $SammelDateiPfad!" -Exception $_.Exception
    			} # End Catch
    		} # End If $VorMonat
        } # End ForEach $File
    	
    	
    	# Fehler abfangen damit die Sammeldatei nicht gelöscht wird,
    	# wenn beim zippen etwas schief läuft!
    	Try{
    		# Sammeldatei des Monats zu dem Zip Archiv hinzufügen 
    		Write-Zip -path $SammelDateiPfad -Level $Level -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append -ErrorAction stop
    		
    		# Die Sammeldatei ist nun in der Zip-Datei Ich lösche Sie
    		Remove-Item -Path $File.Fullname -Force -WhatIf
    	}
    	Catch {
    		# Fehler ausgeben
    		Write-Error -Message "Fehler beim anhängen der Datei $SammelDateiPfad `n and die ZIP-Datei $((Join-Path $Destination  ($Folder.Name + '.zip')))!" -Exception $_.Exception
    	}
    	
    } # End ForEach $Folder


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 4. Juni 2013 12:31
  • Vielen Dank brima,

    ich hatte es über die ISE getestet, da gings nicht, aber "PS als Admin ausführen", hat dann geklappt!

    vielen Dank nochmal!

    • Bearbeitet Randy30 Mittwoch, 5. Juni 2013 09:17
    Mittwoch, 5. Juni 2013 05:17
  • Hallo Peter,

    vielen Dank, es funktioniert, nur bekomme ich zu jedem Ordner,indenen die täglichen logs standen, eine Fehlermeldung, dass das jeweils letzte tägliche Logfile für diesen Monat nicht existiert. In der Sammeldatei ist es jedoch mit dabei!

    Remove-Item : Cannot find path 'D:\bla\bla\bla\u_ex130531.log' because it does not exist.
    At D:\...\test3.ps1:55 char:14
    +         Remove-Item <<<<  -Path $File.Fullname -Force
        + CategoryInfo          : ObjectNotFound: (D:\...\...\u_ex130531.log:String) [Remove-Item], ItemNotFoundEx
       ception
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

    D.h., es wird richtig zusammengefasst und auch gelöscht, aber er versucht trotzdem in jedem Ordner nach der letzten tägl. Logdatei zu suchen...?

    Vielen Dank& viele Grüße

    Mittwoch, 5. Juni 2013 09:32
  • Man könnte da jetzt bei Remove-Item mit dem Parameter -ErrorAction SilentliContinue Arbeiten.
    Dies machen nur Anfänger! Wir sind aber Profis! ;-)
    Es ist immer schlecht Fehler zu Ignorieren dann weiß man nicht mehr was vor sich geht!
    Ich habe eine IF abfrage eingebaut, die Testet ob es die Datei noch gibt, wenn ja wird Sie gelöscht:

    Set-StrictMode -Version "2.0"
    Clear-Host
    Import-Module pscx

    # einmalige Variablen Initialisierung
    $Source="D:\bla\bla"
    $Destination="D:\bla\bla\bla" #muss existieren
    $ZipKompressionsLevel=1
    $JahrMonat = "{0:yyyyMM}" -f (get-date).AddMonths(-1)
    $VorMonat = "{0:00}" -f ((get-date).Month -1)


    #Alle Verzeichnisse ermitteln
    $Folders=@(Get-ChildItem -Path $Source -Exclude 'Test' | Where{$_.PSISContainer -Match $true})

    # jeden Ordner durchlaufen
    ForEach ($Folder in $Folders) {

        # Dateinamen für die Sammeldatei + Pfad zu dem Aktuellen Ordner erstellen
        $SammelDateiPfad = Join-Path $Folder.Fullname "$($Folder.Name)_$JahrMonat.log"
        
        # jede *.log Datei in dem Ordner durchlaufen
        ForEach ($File in Get-ChildItem -Path $Folder -Filter "*.log") {
                
            # Wenn die Datei im Namen den letzten Monat hat
            If ($VorMonat -eq $File.Name.Substring(6,2)) {
                
                # Fehler abfangen damit nicht eine Datei gelöscht wird,
                # obwohl sie nicht in der Sammeldatei ist!
                Try{
                    # Sammeldatei erstellen und
                    # alle täglichen Logs eines Monats in einer Datei Sammeln
                    # Diese Datei liegt im Aktuell bearbeiteten Ordner
                    Add-Content -Path $SammelDateiPfad -Value (Get-Content -Path $File.Fullname) -ErrorAction stop
                
                    # Log-Datei ist nun in der Sammeldatei und sie wird gelöscht wenn Sie noch existiert
                    If (Test-Path $File.Fullname) {
                        Remove-Item -Path $File.Fullname -Force -WhatIf
                    }
                    
                } # End Try
                Catch {
                    # Fehler ausgeben
                    Write-Error -Message "Fehler beim anhängen der Datei $($File.Fullname) `n and die Datei $SammelDateiPfad!" -Exception $_.Exception
                } # End Catch
            } # End If $VorMonat
        } # End ForEach $File
        
        
        # Fehler abfangen damit die Sammeldatei nicht gelöscht wird,
        # wenn beim zippen etwas schief läuft!
        Try{
            # Sammeldatei des Monats zu dem Zip Archiv hinzufügen
            Write-Zip -path $SammelDateiPfad -Level $ZipKompressionsLevel -OutputPath (Join-Path $Destination  ($Folder.Name + '.zip')) -quiet -Append -ErrorAction stop
            
            # Die Sammeldatei ist nun in der Zip-Datei Ich lösche Sie wenn sie noch existiert
            IF (Test-Path $File.Fullname) {
                Remove-Item -Path $File.Fullname -Force -WhatIf
            }
            
        }
        Catch {
            # Fehler ausgeben
            Write-Error -Message "Fehler beim anhängen der Datei $SammelDateiPfad `n and die ZIP-Datei $((Join-Path $Destination  ($Folder.Name + '.zip')))!" -Exception $_.Exception
        }
        
    } # End ForEach $Folder


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Mittwoch, 5. Juni 2013 10:28
    • Als Antwort markiert Randy30 Mittwoch, 5. Juni 2013 11:22
    Mittwoch, 5. Juni 2013 10:22
  • Hallo Randy,

    schön das wir dein Problem nun lösen konnten. Ich möchte dich aber bitten, dich nun selbst mal in die Powershell-Grundlagen einzuarbeiten. Aufgaben dieser Art wie du sie gepostet hast, gepaart mit fehlendem Grundlagenwissen wie bei dir zur Zeit, laufen immer darauf hinaus das die Forenteilnehmer im Endeffekt deine Arbeit machen. Das ist so nicht gedacht.

    Also bitte: kaufe dir ein Powershell-Buch!

    Danke,

    Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 5. Juni 2013 11:33
    Moderator
  • Hallo Denniver,

    ich bin ja gerade dabei mich einzuarbeiten...ich versuche es ja auch selbst, nur komme ich meist nicht auf die lösung oder ich baue ein wirkliches Durcheinander auf....

    sorry, ist so auch nicht geplant von mir

    viele Grüße

    Randy

    Mittwoch, 5. Juni 2013 11:47
  • Vielen Dank nochmal für die tolle Unterstützung!!!! Auch an brima!!!

    Randy

    Donnerstag, 6. Juni 2013 07:17