PowerShell/docs/sync-folder.md
2024-03-27 17:36:59 +01:00

3.1 KiB

Script: sync-folder.ps1

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). IMPORTANT NOTE: Make sure the target path is correct because the content gets replaced (DATA LOSS)!

Parameters

PS> ./sync-folder.ps1 [[-sourcePath] <String>] [[-targetPath] <String>] [<CommonParameters>]

-sourcePath <String>
    Specifies the path to the source folder
    
    Required?                    false
    Position?                    1
    Default value                
    Accept pipeline input?       false
    Accept wildcard characters?  false

-targetPath <String>
    Specifies the path to the target folder
    
    Required?                    false
    Position?                    2
    Default value                
    Accept pipeline input?       false
    Accept wildcard characters?  false

[<CommonParameters>]
    This script supports the common parameters: Verbose, Debug, ErrorAction, ErrorVariable, WarningAction, 
    WarningVariable, OutBuffer, PipelineVariable, and OutVariable.

Example

PS> ./sync-folder.ps1 C:\MyPhotos D:\Backups\MyPhotos

Notes

Author: Markus Fleschutz | License: CC0

https://github.com/fleschutz/PowerShell

Script Content

<#
.SYNOPSIS
	Syncronizes two folders
.DESCRIPTION
	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).
	IMPORTANT NOTE: Make sure the target path is correct because the content gets replaced (DATA LOSS)!
.PARAMETER sourcePath
	Specifies the path to the source folder
.PARAMETER targetPath
	Specifies the path to the target folder
.EXAMPLE
	PS> ./sync-folder.ps1 C:\MyPhotos D:\Backups\MyPhotos
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz | License: CC0
#>

param([string]$sourcePath = "", [string]$targetPath = "")

try {
	if ($sourcePath -eq "") { $sourcePath = Read-Host "Enter the path to the source folder" }
	if ($targetPath -eq "") { $targetPath = Read-Host "Enter the path to the target folder" }
	$stopWatch = [system.diagnostics.stopwatch]::startNew()

	$robocopyParameters = $sourcePath, $targetPath, '/MIR', '/FFT', '/NDL', '/NP', '/NS'
	# /MIR = mirror a directory tree
	# /FFT = assume FAT file times (2-second granularity)
	# /NDL = don't log directory names
	# /NP  = don't display percentage copied
	# /NS  = don't log file sizes

	robocopy.exe $robocopyParameters
	if ($lastExitCode -gt 3) { throw 'Robocopy failed.' }

	[int]$elapsed = $stopWatch.Elapsed.TotalSeconds
	"✔️ Synced 📂$sourcePath to 📂$targetPath in $elapsed sec"
	exit 0 # success
} catch {
	"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}

(generated by convert-ps2md.ps1 using the comment-based help of sync-folder.ps1 as of 03/27/2024 17:36:32)