Renamed to sync-dir.ps1 and updated it

This commit is contained in:
Markus Fleschutz 2025-02-12 09:03:05 +01:00
parent 1540f7cae0
commit 9cee4a13f0

View File

@ -1,16 +1,16 @@
<# <#
.SYNOPSIS .SYNOPSIS
Syncronizes two folders Sync two dirs
.DESCRIPTION .DESCRIPTION
This PowerShell script synchronizes (mirrors) the content of 2 directory trees by using Robocopy. This PowerShell script synchronizes (mirrors) the content of 2 directory trees by using Robocopy.
Typical use cases are backups: at first everything is copied (full backup), afterward only changes are copied (incremental backup). Typical use cases are backups: at first everything is copied (full backup), afterward only changes are copied (incremental backup).
IMPORTANT NOTE: Make sure the target path is correct because the content gets replaced (DATA LOSS)! IMPORTANT NOTE: Make sure the target path is correct because the content gets replaced (DATA LOSS)!
.PARAMETER sourcePath .PARAMETER sourcePath
Specifies the path to the source folder Specifies the path to the source dir (to be entered by default)
.PARAMETER targetPath .PARAMETER targetPath
Specifies the path to the target folder Specifies the path to the target dir (to be entered by default)
.EXAMPLE .EXAMPLE
PS> ./sync-folder.ps1 C:\MyPhotos D:\Backups\MyPhotos PS> ./sync-dir.ps1 C:\Photos D:\Backups\Photos
.LINK .LINK
https://github.com/fleschutz/PowerShell https://github.com/fleschutz/PowerShell
.NOTES .NOTES
@ -20,22 +20,23 @@
param([string]$sourcePath = "", [string]$targetPath = "") param([string]$sourcePath = "", [string]$targetPath = "")
try { try {
if ($sourcePath -eq "") { $sourcePath = Read-Host "Enter the path to the source folder" } if ($sourcePath -eq "") { $sourcePath = Read-Host "Enter the path to the source directory" }
if ($targetPath -eq "") { $targetPath = Read-Host "Enter the path to the target folder" } if ($targetPath -eq "") { $targetPath = Read-Host "Enter the path to the target directory" }
$stopWatch = [system.diagnostics.stopwatch]::startNew() $stopWatch = [system.diagnostics.stopwatch]::startNew()
$robocopyParameters = $sourcePath, $targetPath, '/MIR', '/FFT', '/NDL', '/NP', '/NS' $robocopyParameters = $sourcePath, $targetPath, '/MIR', '/FFT', '/NDL', '/NP', '/NS'
#
# /MIR = mirror a directory tree # /MIR = mirror a directory tree
# /FFT = assume FAT file times (2-second granularity) # /FFT = assume FAT file times (2-second granularity)
# /NDL = don't log directory names # /NDL = don't log directory names
# /NP = don't display percentage copied # /NP = don't display percentage copied
# /NS = don't log file sizes # /NS = don't log file sizes
#
robocopy.exe $robocopyParameters & robocopy.exe $robocopyParameters
if ($lastExitCode -gt 3) { throw 'Robocopy failed.' } if ($lastExitCode -gt 3) { throw 'Robocopy failed.' }
[int]$elapsed = $stopWatch.Elapsed.TotalSeconds [int]$elapsed = $stopWatch.Elapsed.TotalSeconds
"✅ Synced 📂$sourcePath to 📂$targetPath in $elapsed sec" "✅ Synced 📂$sourcePath to 📂$targetPath in $($elapsed)s."
exit 0 # success exit 0 # success
} catch { } catch {
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"