Powershell Prüfung ob Datei kopiert wurde
Hallo,
ich habe in Powershell ein Script erstellt was auch funktioniert.
Jedoch habe ich noch ein Problem dabei.
Das Script kopiert mir alle Dateien aus der Quelle ins Ziel. (Falls im Ziel schon vorhanden, wird die Datei trotzdem kopiert mit Versionsnummer 1 usw....
Weiterhin kopiert das Script mir alle Dateien aus der Quelle ins Temp. (Falls im Temp schon vorhanden, wird die Datei trotzdem kopiert mit Versionsnummer 1 usw....
Alles was älter als 30 Tage ist, wird im Temp gelöscht.
Alles aus der Quelle wird gelöscht.
Am nächsten Tag sind in der Quelle wieder 2 Dateien und das Script läuft deshalb 1x am Tag.
Kann Mann irgendwie prüfen, ob auch wirklich kopiert wurde?
Der Hintergrund ist, wenn das kopieren nicht funktioniert, wird ja trotzdem gelöscht und die Dateien sind weg.
Ich habe den Temp kopieren als """Sicherheit""" gedacht, aber es ist ja keine.
Wenn jemand helfen kann, wäre ich sehr dankbar.
Grüße
ich habe in Powershell ein Script erstellt was auch funktioniert.
Jedoch habe ich noch ein Problem dabei.
Das Script kopiert mir alle Dateien aus der Quelle ins Ziel. (Falls im Ziel schon vorhanden, wird die Datei trotzdem kopiert mit Versionsnummer 1 usw....
Weiterhin kopiert das Script mir alle Dateien aus der Quelle ins Temp. (Falls im Temp schon vorhanden, wird die Datei trotzdem kopiert mit Versionsnummer 1 usw....
Alles was älter als 30 Tage ist, wird im Temp gelöscht.
Alles aus der Quelle wird gelöscht.
Am nächsten Tag sind in der Quelle wieder 2 Dateien und das Script läuft deshalb 1x am Tag.
Kann Mann irgendwie prüfen, ob auch wirklich kopiert wurde?
Der Hintergrund ist, wenn das kopieren nicht funktioniert, wird ja trotzdem gelöscht und die Dateien sind weg.
Ich habe den Temp kopieren als """Sicherheit""" gedacht, aber es ist ja keine.
$source = "E:\Quelle1"
$target = "E:\Ziel"
$temp = "E:\Temp"
#von Quelle ins Temp kopieren
foreach($file in Get-ChildItem $source -file -filter *.txt -recurse){
$dst = "$temp\$($file.Name)"
$cnt = 1
while(Test-Path $dst){
$dst = "$temp\$($file.Basename)_$cnt$($file.Extension)"
$cnt++
}
$file | Copy-Item -Destination $dst -force -verbose
}
#von Quelle ins Ziel kopieren
foreach($file in Get-ChildItem $source -file -filter *.txt -recurse){
$dst = "$target\$($file.Name)"
$cnt = 1
while(Test-Path $dst){
$dst = "$target\$($file.Basename)_$cnt$($file.Extension)"
$cnt++
}
$file | Copy-Item -Destination $dst -force -verbose
}
#Temp löschen wenn älter 30 Tage
Get-childitem $temp\*.txt -recurse | where-object { $_.LastWriteTime -lt (get-date).adddays(-30)} | foreach-object { rm -recurse $_.fullname }
#Quelle löschen
Remove-Item "$source\*.txt"
Wenn jemand helfen kann, wäre ich sehr dankbar.
Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 81785610218
Url: https://administrator.de/contentid/81785610218
Ausgedruckt am: 22.11.2024 um 05:11 Uhr
12 Kommentare
Neuester Kommentar
Moin,
Test-Path kennst du ja schon.
Wenn du dann auch noch eine Checksumme berechnest, solltest du auf der sicheren Seite sein.
Gruß
Test-Path kennst du ja schon.
Wenn du dann auch noch eine Checksumme berechnest, solltest du auf der sicheren Seite sein.
Gruß
OK, das war nur mein Vorschlag alles älter als 30 Tage zu löschen.
Um die Quelle zu löschen hängt du hinter Zeile 24 eine Abfrage ob sich die Datei im Zielverzeichnis befindet. Wenn ja, dann quelle löschen.
Du kannst auch den Status der Kopie abfragen:
https://stackoverflow.com/questions/32727252/how-to-handle-copy-item-exc ...
Um die Quelle zu löschen hängt du hinter Zeile 24 eine Abfrage ob sich die Datei im Zielverzeichnis befindet. Wenn ja, dann quelle löschen.
Du kannst auch den Status der Kopie abfragen:
https://stackoverflow.com/questions/32727252/how-to-handle-copy-item-exc ...
Jetzt einfach mal aus dem Kopf dahingeschrieben (ohne Temp)
$TempErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = 'SilentlyContinue'
try {
$SourceFiles = Get-ChildItem -Path "C:\temp" -File -Filter "*.txt" -Recurse -Force
$DestPath = "C:\temp"
[Void](Get-ChildItem $DestPath -Force)
foreach ($File in $SourceFiles) {
$Count = 0
$DestFile = Join-Path -Path $DestPath -ChildPath "$($File.BaseName)_$($Count)$($File.Extension)"
while (Test-Path -Path $DestFile) {
$Count++
$DestFile = Join-Path -Path $DestPath -ChildPath "$($File.BaseName)_$($Count)$($File.Extension)"
}
Copy-Item -LiteralPath $File.Fullname -Destination $DestFile
[Void](Get-ChildItem $DestPath -Force)
if ((Get-FileHash -LiteralPath $File).Hash -ne (Get-FileHash -LiteralPath $DestFile).Hash) {
Throw "Checksummen stimmen nicht überein"
}
Remove-Item $File
}
}
catch {
Write-Host $PsItem
}
finally {
$ErrorActionPreference = $TempErrorActionPreference
}
Jedoch bringt er bei deinem Script am Ende immer "Checksummen stimmen nicht überein"
Wie gesagt aus dem Kopf gescrhieben. In der Zeile fehlen zwei mal .FullName
if ((Get-FileHash -LiteralPath $File).Hash -ne (Get-FileHash -LiteralPath $DestFile).Hash) {
if ((Get-FileHash -LiteralPath $File.FullName).Hash -ne (Get-FileHash -LiteralPath $DestFile.FullName).Hash) {
jedoch wird bei Dir immer versioniert.
Kleinigkeit. Solltest du ohne weiteres anpassen können
Wenn du nur löschst wenn der Hash nicht übereinstimmt, kein Wunder 😀.
Außerdem steht der Code außerhalb der For-Each Schleife, da hast du ganz schön verunstaltet ....
Schau dir den Code von Krämer nochmal ganz genau an ...
Gruß schrick
Außerdem steht der Code außerhalb der For-Each Schleife, da hast du ganz schön verunstaltet ....
Schau dir den Code von Krämer nochmal ganz genau an ...
$source = "E:\Quelle1"
$target = "E:\Ziel1"
$ErrorActionPreference = "Stop"
#von Quelle ins Temp kopieren
foreach($file in Get-ChildItem $source -file -filter *.txt -recurse){
Try{
$dst = "$target\$($file.Name)"
$cnt = 1
while(Test-Path $dst){
$dst = "$target\$($file.Basename)_$cnt$($file.Extension)"
$cnt++
}
$file | Copy-Item -Destination $dst -force -verbose
if ((Get-FileHash -LiteralPath $file.Fullname).Hash -ne (Get-FileHash -LiteralPath $dst).Hash) {
Throw "Checksummen stimmen nicht überein '$($file.Fullname)' <=> '$dst'"
}else{
Remove-Item $file.Fullname -force
}
}catch{
write-host $_.Exception.Message -F Red
}
}
Gruß schrick