Skip to content

Instantly share code, notes, and snippets.

@magnetikonline
Last active September 12, 2018 20:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save magnetikonline/aed3e0139ad2c12d92e85a2b98b5bf7a to your computer and use it in GitHub Desktop.
Save magnetikonline/aed3e0139ad2c12d92e85a2b98b5bf7a to your computer and use it in GitHub Desktop.
PowerShell example to copy local files recursively to target server share with orphan cleanup.

PowerShell copy local files recursively to target server

A PowerShell script which provides the following:

  • Mount remote/target server share with given username/password credentials.
  • Copy all $SourcePath files to target share ($TargetServer / $TargetShare) recursively.
  • Finally, clean up all orphaned directories/files from target share.

Usage example

./remotecopy.ps1 `
	-SourcePath "." `
	-TargetServer "localhost" -TargetShare "myshare" `
	-Username "USERNAME" -Password "PASSWORD"

Copied files from [C:\scripts\myfiles] to [\\localhost\myshare]
Deleted orphan directory [\\localhost\myshare\blurg]
Deleted orphan file [\\localhost\myshare\old-file.txt]
Param (
[string]$SourcePath = ".",
[Parameter(Mandatory = $true)] [string]$TargetServer,
[Parameter(Mandatory = $true)] [string]$TargetShare,
[Parameter(Mandatory = $true)] [string]$Username,
[Parameter(Mandatory = $true)] [string]$Password
)
Set-StrictMode -Version Latest
$DEPLOY_DRIVE_NAME = "DEPLOY_DRIVE"
# build canonical path to source, target server file share and create user credentials object
$sourceFullPath = (Resolve-Path -LiteralPath $SourcePath).ProviderPath
$targetServerSharePath = Join-Path `
-Path "\\" `
-ChildPath (Join-Path -Path $TargetServer -ChildPath $TargetShare)
$userCredential = New-Object `
-TypeName "System.Management.Automation.PSCredential" `
-ArgumentList $Username,(ConvertTo-SecureString -String $Password -AsPlainText -Force)
# mount file share
$driveItem = New-PSDrive `
-Credential $userCredential `
-Name $DEPLOY_DRIVE_NAME `
-PSProvider "FileSystem" `
-Root $targetServerSharePath
# copy source files to target server mount
Copy-Item `
-LiteralPath (Get-ChildItem -LiteralPath $sourceFullPath).FullName `
-Destination $targetServerSharePath `
-Recurse -Force
Write-Output "Copied files from [$sourceFullPath] to [$targetServerSharePath]"
# clean up orphan files/directories from target
$sourceFileList = (Get-ChildItem -LiteralPath $sourceFullPath -Recurse).FullName
$targetServerSharePathLength = $targetServerSharePath.Length
# work over target file list - if target item not in source then delete
foreach ($targetFileItem in (Get-ChildItem -LiteralPath $targetServerSharePath -Recurse)) {
$targetFilePath = $targetFileItem.FullName
# translate target path to source path for existance matching
$translatedTargetToSourcePath = Join-Path `
-Path $sourceFullPath `
-ChildPath $targetFilePath.Substring($targetServerSharePathLength)
if (
($sourceFileList -notcontains $translatedTargetToSourcePath) -and
(Test-Path -LiteralPath $targetFilePath -PathType Any)
) {
# remove directory/file item
if ($targetFileItem.PSIsContainer) {
Remove-Item -LiteralPath $targetFilePath -Recurse -Force
Write-Output "Deleted orphan directory [$targetFilePath]"
} else {
Remove-Item -LiteralPath $targetFilePath -Force
Write-Output "Deleted orphan file [$targetFilePath]"
}
}
}
# unmount file share
Remove-PSDrive -Name $DEPLOY_DRIVE_NAME
Write-Output "Finished"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment