axmol/1k/fsync.ps1

85 lines
2.4 KiB
PowerShell

# sync file or directory
# .\fsync.ps1 -s srcPath -d destPath -l 1
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
[string]$srcPath,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
[string]$destPath,
[Parameter(Mandatory=$false, ValueFromPipeline=$true)]
[PSDefaultValue(Value=$null)]
$linkOnly
)
function ParseBoolFuzzy($value) {
$value = "$value".ToLower()
return $value.startsWith('1') -or $value.StartsWith('t') -or $value.StartsWith('y')
}
$linkOnly = ParseBoolFuzzy($linkOnly)
# 0: windows, 1: linux, 2: macos
$IsWin = $IsWindows -or ("$env:OS" -eq 'Windows_NT')
# convert to native path style
if ($IsWin) {
$srcPath = $srcPath.Replace('/', '\')
$destPath = $destPath.Replace('/', '\')
} else {
$srcPath = $srcPath.Replace('\', '/')
$destPath = $destPath.Replace('\', '/')
}
if(!$srcPath -or !(Test-Path $srcPath -PathType Any)) {
throw "fsync.ps1: The source directory $srcPath not exist"
}
if (Test-Path $destPath -PathType Any) { # dest already exist
if ($linkOnly) { # is symlink and dest exist
$fileItem = (Get-Item $destPath)
if ($fileItem.Target -eq $srcPath) {
Write-Host "fsync.ps1: Symlink $destPath ===> $($fileItem.Target) exists"
return
}
Write-Host "fsync.ps1: Removing old link target $($fileItem.Target)"
# force delete if exist dest not symlink
if ($fileItem.PSIsContainer -and !$fileItem.Target) {
$fileItem.Delete($true)
} else {
$fileItem.Delete()
}
}
}
$destLoc = Split-Path $destPath -Parent
if (!(Test-Path $destLoc -PathType Container)) {
New-Item $destLoc -ItemType Directory 1>$null
}
if ($linkOnly) {
Write-Host "fsync.ps1: Symlink $srcPath to $destPath ..."
if ($IsWin -and (Test-Path $srcPath -PathType Container)) {
cmd.exe /c mklink /J $destPath $srcPath
}
else {
# ln -s $srcPath $destPath
New-Item -ItemType SymbolicLink -Path $destPath -Target $srcPath 2>$null
}
}
else { # copy
Write-Host "fsync.ps1: Copying $srcPath to $destPath ..."
if (Test-Path $srcPath -PathType Container) {
if (!(Test-Path $destPath -PathType Container)) {
Copy-Item $srcPath $destPath -Recurse -Force
} else {
Copy-Item $srcPath/* $destPath/ -Recurse -Force
}
} else {
Copy-Item $srcPath $destPath -Force
}
}
if(!$?) { # $Error array
exit 1
}