|
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" |