michi.wtr
Goto Top

Cmdlet Copy-Item Fail

Hey Community,

Ich bin gerade ein wenig am verzweifeln. Ich habe mir ein Skript geschrieben, welches ein Backup von meinem Ordner der Berufsschule (OneDrive-Ordner) auf meinen Fritz.NAS Speicher erstellen soll.

Die Idee: Das Skript wird per Aufgabenplanung ausgeführt, sobald ich meinen Computer entsperre, und dieser sich im Heimnetzwerk befindet. Leider funktioniert das Skript aber nicht ganz richtig:


###############################################################################
###############################################################################
###                                                                         ###
###  Backup Directory                                                       ###
###  ================                                                       ###
###                                                                         ###
###  This Scipt generates a copy of the differences in                      ###
###  in relation to a directory and a backup directory.                     ###
###                                                                         ###
###  The script needs two arguments to run:                                 ###
###  $args[0] = path of folder to copy (just files inside get copied)       ###
###  $args[1] = path of destination to save copied files of the folder      ###
###                                                                         ###
###############################################################################
###############################################################################


<#'if ($args.Length -lt 2) {exit} # Wrong call of the script 

$pathCopy = $args[0]
$pathDest = $args[1]

if (-not (Test-Path -Path $pathCopy) -or -not (Test-Path -Path $pathDest)) {exit} # Wrong path#>


#############################################################################################################
#############################################################################################################
#                                       Copy the differences


# Find Files existing for both directories
$filesCopy = Get-ChildItem -Path $pathCopy -File -Recurse -Force | 
                select -Property @{Name='CommonName';Expression={$_.FullName.Replace("$pathCopy\",'')}}  
$filesDest = Get-ChildItem -Path $pathDest -File -Recurse -Force | 
                select -Property @{Name='CommonName';Expression={$_.FullName.Replace("$pathDest\",'')}}  

$files = @()

if ($filesCopy -eq $null) {$filesCopy = @()}
if ($filesDest -eq $null) {$filesDest = @()}


# Files that exist in both folders
$temp = compare -ReferenceObject $filesCopy -DifferenceObject $filesDest -Property CommonName -IncludeEqual -ExcludeDifferent | 
            select -Property @{Name='FullNameCopy';Expression={"$pathCopy\$($_.CommonName)"}}, `  
                             @{Name='FullNameDest';Expression={"$pathDest\$($_.CommonName)"}}  


# Filter only files that got changed
if ($temp -ne $null) 
{
    $files += $temp | foreach `
                {
                    if ((Get-Item -Path $_.FullNameCopy -Force).LastWriteTimeUtc.ToString() -ne (Get-Item -Path $_.FullNameDest -Force).LastWriteTimeUtc.ToString()) {$_}
                }
}


# Files that exist just in the folder to copy
$temp = compare -ReferenceObject $filesCopy -DifferenceObject $filesDest -Property CommonName | 
            where {$_.SideIndicator -eq '<='} |   
                select -Property @{Name='FullNameCopy';Expression={"$pathCopy\$($_.CommonName)"}}, `  
                                 @{Name='FullNameDest';Expression={"$pathDest\$($_.CommonName)"}}  


if ($temp -ne $null) {$files += $temp}



# Copy files
$files | foreach {
    if (-not (Split-Path -Path $_.FullNameDest -Parent | Set-Variable -Name temp -PassThru | select -ExpandProperty Value | Test-Path)) 
    {
        New-Item -Path (Split-Path -Path $temp -Parent) -Name (Split-Path -Path $temp -Leaf) -ItemType Directory -Force
    };
    if (Test-Path -Path $_.FullNameDest) {
        Set-ItemProperty -Path $_.FullNameDest -Name IsReadOnly -Value $false
    };
    Copy-Item -Path $_.FullNameCopy -Destination $temp -Force;
    Set-ItemProperty -Path $_.FullNameDest -Name LastWriteTimeUtc -Value (Get-ItemProperty -Path $_.FullNameCopy -Name LastWriteTimeUtc | select -ExpandProperty LastWriteTimeUtc) -Force;
    Set-ItemProperty -Path $_.FullNameDest -Name IsReadOnly -Value $true
}


$pathCopy = Der Pfad des Ordners für den das Backup erstellt werden soll
$pathDest = Der Pfad zum Ordner, in dem das Backup gespeichert werden soll
$filesCopy = Dateien, die sich im Ordner $pathCopy befinden (Liste der Pfade der Dateien OHNE den Teil $pathCopy)
$filesDest = Dateien, die sich im Ordner $pathDest befinden (Liste der Pfade der Dateien OHNE den Teil $pathDest)
$files = Dateien, die Kopiert werden müssen (Liste mit je 2 Pfaden:
-FullNameCopy: Pfad der Datei im Ordner $pathCopy
-FullNameDest: Pfad der Datei im Ordner $pathDest)

$filesCopy und $filesDest wurden lediglich erstellt zum schnellen Filtern der Dateien, die in beiden Ordnern vorhanden sind.


Da ich natürlich nicht immer alle Dateien Kopieren möchte, sondern nur neue und geänderte Dateien, möchte ich die Dateien die Kopiert werden müssen ($files) herausfiltern.

Das funktioniert auch wunderbar, bis auf den Punkt, bei dem Dateien, die in beiden Ordnern vorhanden sind auf ihr Änderungsdatum verglichen werden sollen...
Aus irgendeinem Grund wird dieses nicht korrekt übernommen. Es gibt immer eine Sekunde Unterschied, woher die kommt, keine Ahnung.

Beispiel:
lastwritetimeutc

Deshalb habe ich die vorletzte Zeile im Code hinzugefügt, in der ich die LastWriteTimeUtc vom Orginal Item nochmal übernehmen möchte, funktioniert bei einem Teil der Dateien, aber leider nur bei etwa 10%.... Da ich aber ungeänderte Dateien nicht kopieren möchte, wäre das essentiell, dass ich die Korrekte LastWriteTime in der Kopie mit stehen habe.

Hätte da irgendwer eine Ahnung?

PS: Auch wenn ich die Dateien einfach alle komplett kopiere, dann wird zwar im Explorer das gleiche Änderungsdatum angezeigt, jedoch unterscheidet sich diese immer um diese eine Minute, ist das irgendwie ein Rundungsfehler den ich da korrigieren müsste?

Content-Key: 6424969226

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

Printed on: April 28, 2024 at 07:04 o'clock

Mitglied: 6247018886
Solution 6247018886 Mar 19, 2023 updated at 12:01:56 (UTC)
Goto Top
Moin.
Es gibt immer eine Sekunde Unterschied, woher die kommt, keine Ahnung.
Du nutzt wohl statt NTFS, FAT32 Formatierung auf dem Speicher, das hat nur eine 2 Sekunden Auflösung für die LastWriteTime zur Verfügung:
https://en.wikipedia.org/wiki/File_Allocation_Table
Warum nicht gleich Robocopy nehmen das hat auch schon den Schalter /fft dafür:
https://learn.microsoft.com/de-de/windows-server/administration/windows- ...

Cheers briggs
Member: michi.wtr
michi.wtr Mar 19, 2023 at 12:12:32 (UTC)
Goto Top
Zitat von @6247018886:

Du nutzt wohl statt NTFS, FAT32 Formatierung auf dem Speicher, das hat nur eine 2 Sekunden Auflösung für die LastWriteTime zur Verfügung:

Ah ja danke dir, das könnte evtl. das Problem sein, werde ich mir mal anschauen...


Zitat von @6247018886:

Warum nicht gleich Robocopy nehmen das hat auch schon den Schalter /fft dafür:

Ok, wusste ich nicht ^^ robocopy zwar schonmal gehört, aber nicht gewusst, dass man schon alles automatisch prüfen lassen kann face-smile