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
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"
./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]