mrheisenberg
Goto Top

PowerShell-Skript

Moin Leute,

ich sitze gerade an einem Skript was mir folgendes machen soll:

Aus einem Verzeichnis (Logs) in ein anderes Verzeichnis (Log-Kopie) kopieren, mit dem Windows-Board-Tool zippen, und danach entsprechend löschen, so jetzt bricht der immer ab, ohne irgendwas....

Ich habe den Part mit dem löschen auskommentiert zum testen, und das Skript soweit Kommentiert.

Kann mir jemand helfen den Fehler zu finden, ich steh grad am Schlauch....

# Quellverzeichnis und Zielverzeichnis
$sourcePath = "C:\ProgramData\XXXXXX\Logs"  
$destinationPath = "\\XXXXXX\it\XXXXXX_Logs"  

# Definition größe und alter (1 GB)  (2 months)
$fileSizeThreshold = 1GB
$fileAgeThreshold = (Get-Date).AddMonths(-2)

# alle .txt Dateien im Verzeichnis finden mit den Vorgaben
$logFiles = Get-ChildItem -Path $sourcePath -Filter *.txt | Where-Object {
    $_.Length -gt $fileSizeThreshold -and $_.LastWriteTime -lt $fileAgeThreshold
}

foreach ($file in $logFiles) {
    # Definition Dateiname nach Zippen
    $compressedFileName = "$($file.BaseName).zip"  
    $compressedFilePath = Join-Path -Path $sourcePath -ChildPath $compressedFileName

    # Kompression
    try {
        Compress-Archive -Path $file.FullName -DestinationPath $compressedFilePath -CompressionLevel Optimal

        Write-Output "Successfully compressed: $($file.FullName) to $compressedFilePath"  

        # Zielpfad
        $destinationFile = Join-Path -Path $destinationPath -ChildPath $compressedFileName

        # Kopiervorgang
        try {
            Copy-Item -Path $compressedFilePath -Destination $destinationFile -ErrorAction Stop

            # Verifizierung das Datei vorhanden ist
            if (Test-Path -Path $destinationFile) {
                Write-Output "Successfully copied: $($compressedFilePath) to $destinationFile"  
                # Löschrutine auskommentiert zu Testzwecke
                # Remove-Item -Path $file.FullName -ErrorAction Stop
                # Remove-Item -Path $compressedFilePath -ErrorAction Stop
                # Write-Output "Successfully copied and deleted: $($file.FullName)" 
            } else {
                Write-Output "File copy failed, not deleting: $($file.FullName)"  
            }
        } catch {
            Write-Output "Error copying file: $($compressedFilePath) - $_"  
        }
    } catch {
        Write-Output "Compression failed for file: $($file.FullName) - $_"  
    }
}

Grüße

Content-Key: 93267370482

Url: https://administrator.de/contentid/93267370482

Printed on: June 1, 2024 at 11:06 o'clock

Member: NordicMike
Solution NordicMike May 14, 2024 at 09:07:56 (UTC)
Goto Top
bricht der immer ab, ohne irgendwas
Bricht er ab oder beendet normal? Mach Dir ein paar mehr Diagnose Zeilen rein mit "write-output". Auch am Ende mit "Script ohne Fehlermeldung beendet". Auch dazwischen, am besten lässt du dir die Variablen ausgeben, dann siehst du wo er gerade was macht.
Member: Penny.Cilin
Penny.Cilin May 14, 2024 at 09:14:47 (UTC)
Goto Top
@NordicMike
Bricht er ab oder beendet normal? Mach Dir ein paar mehr Diagnose Zeilen rein mit "write-output". Auch am Ende mit "Script ohne Fehlermeldung beendet". Auch dazwischen, am besten lässt du dir die Variablen ausgeben, dann siehst du wo er gerade was macht.
Dafür gibt es die PowerShell ISE, oder VS Code. Da iss doch 'n Debugger drinne. - Menno

Gruss Penny.
Member: MrHeisenberg
MrHeisenberg May 14, 2024 at 09:17:03 (UTC)
Goto Top
Zitat von @Penny.Cilin:
Dafür gibt es die PowerShell ISE, oder VS Code. Da iss doch 'n Debugger drinne. - Menno

Gruss Penny.

Menno. wenn der Debugger Daten liefern würde würd ich nicht ins Forum schreiben ;)
Member: NordicMike
Solution NordicMike May 14, 2024 at 09:21:44 (UTC)
Goto Top
Stimmt auch wieder.

Man muss ihn halt mit Prüfpunkten füttern.

So sieht man aber auch viel schneller, dass er einen Dateinamen mit Umlaut übersprungen hat, was man beim Debugger nicht so leicht erkennt.
Member: TK1987
TK1987 May 14, 2024 at 09:22:00 (UTC)
Goto Top
Moin,

das Skript läuft hier im Test problemlos. Worüber wird das Skript gestartet?
Ich vermute mal, der ausführende Benutzer hat keine ausreichenden Berechtigungen für den Zielpfad. Prüfe das mal oder ändere den Zielpfad in einen lokalen Pfad ab.

Gruß Thomas
Member: Kraemer
Kraemer May 14, 2024 at 09:23:21 (UTC)
Goto Top
Moin,

sehr wahrscheinlich ist
$logFiles
leer. Da du das im Code nicht prüfst, wird auch nichts passieren.

Gruß

PS: Sieh dir mal die -PassThru Option von Compress-Archive an. Lässt sich in deinem Fall toll verwenden...
Member: MrHeisenberg
MrHeisenberg May 14, 2024 at 09:25:46 (UTC)
Goto Top
Zitat von @NordicMike:

bricht der immer ab, ohne irgendwas
Bricht er ab oder beendet normal? Mach Dir ein paar mehr Diagnose Zeilen rein mit "write-output". Auch am Ende mit "Script ohne Fehlermeldung beendet". Auch dazwischen, am besten lässt du dir die Variablen ausgeben, dann siehst du wo er gerade was macht.

danke für den schubs in die richtige Richtung, habe nun das Skript um den
write-output
erweitert, und bekomme nun einige Daten retour, bsp. ist die Dateigröße mit 1GB zu groß gewählt, da dieser erst ab 1,07GB zählt und die Datei 1,048GB hat, jetzt wird gebastelt :D
Member: Kraemer
Kraemer May 14, 2024 at 09:31:07 (UTC)
Goto Top
Zitat von @MrHeisenberg:

bsp. ist die Dateigröße mit 1GB zu groß gewählt, da dieser erst ab 1,07GB zählt und die Datei 1,048GB hat, jetzt wird gebastelt :D

Also genau so, wie ich es geschrieben habe. Du solltest dich dringend besser um deine Variablen kümmern.

In deinem Fall etwa so:

[Array]$logFiles = Get-ChildItem -Path $sourcePath -Filter *.txt | Where-Object {
    $_.Length -gt $fileSizeThreshold -and $_.LastWriteTime -lt $fileAgeThreshold
}

if ($logFiles){
  foreach ($file in $logFiles) {
...
} 
else {
  write-output "Nothing to do"  
}
Member: MrHeisenberg
MrHeisenberg May 14, 2024 at 09:31:31 (UTC)
Goto Top
Hab nun das abgeänderte Skript mit dem
write-output
, und nun läufts auch

$sourcePath = "C:\ProgramData\XXXXXX\Logs"  
$destinationPath = "\\XXXXXXX\it\XXXX_Logs"  
$fileSizeThreshold = 900MB
$fileAgeThreshold = (Get-Date).AddMonths(-2)

Write-Output "Starte das Skript..."  
Write-Output "Quellverzeichnis: $sourcePath"  
Write-Output "Zielverzeichnis: $destinationPath"  
Write-Output "Dateigröße Schwelle: $fileSizeThreshold"  
Write-Output "Datum Schwelle: $fileAgeThreshold"  

try {
    $logFiles = Get-ChildItem -Path $sourcePath -Filter *.txt
    Write-Output "Anzahl der gefundenen .txt-Dateien: $($logFiles.Count)"  
} catch {
    Write-Output "Fehler beim Abrufen der Dateien: $_"  
    exit
}

$filteredFiles = $logFiles | Where-Object {
    $_.Length -gt $fileSizeThreshold -and $_.LastWriteTime -lt $fileAgeThreshold
}
Write-Output "Anzahl der gefilterten Dateien: $($filteredFiles.Count)"  

foreach ($file in $filteredFiles) {
    Write-Output "Bearbeite Datei: $($file.FullName)"  
    
    $compressedFileName = "$($file.BaseName).zip"  
    $compressedFilePath = Join-Path -Path $sourcePath -ChildPath $compressedFileName
    Write-Output "Komprimierte Datei Pfad: $compressedFilePath"  

    try {
        Compress-Archive -Path $file.FullName -DestinationPath $compressedFilePath -CompressionLevel Optimal
        Write-Output "Erfolgreich komprimiert: $($file.FullName) zu $compressedFilePath"  
    } catch {
        Write-Output "Komprimierung fehlgeschlagen für Datei: $($file.FullName) - $_"  
        continue
    }

    $destinationFile = Join-Path -Path $destinationPath -ChildPath $compressedFileName
    Write-Output "Zieldatei Pfad: $destinationFile"  

    try {
        Copy-Item -Path $compressedFilePath -Destination $destinationFile -ErrorAction Stop
        Write-Output "Erfolgreich kopiert: $($compressedFilePath) zu $destinationFile"  
    } catch {
        Write-Output "Fehler beim Kopieren der Datei: $($compressedFilePath) - $_"  
        continue
    }

    if (Test-Path -Path $destinationFile) {
        Write-Output "Datei erfolgreich im Zielverzeichnis gefunden: $destinationFile"  
        # Remove-Item -Path $file.FullName -ErrorAction Stop
        # Remove-Item -Path $compressedFilePath -ErrorAction Stop
        # Write-Output "Erfolgreich kopiert und gelöscht: $($file.FullName)" 
    } else {
        Write-Output "Datei wurde nicht im Zielverzeichnis gefunden: $destinationFile"  
    }
}

Write-Output "Skript abgeschlossen."  

bitte gerne wenn es wer brauchen kann, der Punkt mit

        # Remove-Item -Path $file.FullName -ErrorAction Stop
        # Remove-Item -Path $compressedFilePath -ErrorAction Stop
        # Write-Output "Erfolgreich kopiert und gelöscht: $($file.FullName)" 


ist zu Testzwecken auskommentiert.

thx an die Hilfe
Member: Kraemer
Kraemer May 14, 2024 at 09:53:03 (UTC)
Goto Top
# Remove-Item -Path $file.FullName -ErrorAction Stop
# Remove-Item -Path $compressedFilePath -ErrorAction Stop
# Write-Output "Erfolgreich kopiert und gelöscht: $($file.FullName)"  

ist zu Testzwecken auskommentiert.

Das sollte man so nicht machen. Dafür gibt es
-WhatIf
Member: MrHeisenberg
MrHeisenberg May 14, 2024 at 10:01:09 (UTC)
Goto Top
Zitat von @Kraemer:

Das sollte man so nicht machen. Dafür gibt es
-WhatIf

so?

Remove-Item -Path $file.FullName -ErrorAction Stop -WhatIf
Remove-Item -Path $compressedFilePath -ErrorAction Stop -WhatIf