Add script to move JSON files with collision handling
This commit is contained in:
parent
49664742ef
commit
10087e85f8
1 changed files with 57 additions and 0 deletions
57
powerboi.ps1
Normal file
57
powerboi.ps1
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
$src = "D:\broken"
|
||||||
|
$dest = "C:\Responses"
|
||||||
|
$deg = 16000
|
||||||
|
|
||||||
|
# What to do when a destination file with the same name exists and contents are identical.
|
||||||
|
# Options: 'skip' - do not move the source (leave it where it is)
|
||||||
|
# 'overwrite' - replace the destination with the source
|
||||||
|
$SameFileAction = 'skip'
|
||||||
|
|
||||||
|
New-Item -ItemType Directory -Path $dest -Force | Out-Null
|
||||||
|
|
||||||
|
Get-ChildItem -Path $src -Filter *.json -Recurse -File |
|
||||||
|
ForEach-Object -Parallel {
|
||||||
|
$dest = $using:dest
|
||||||
|
# copy the using-scoped setting into a local variable for safe use inside the scriptblock
|
||||||
|
$sameAction = $using:SameFileAction
|
||||||
|
$name = $_.Name
|
||||||
|
$target = Join-Path $dest $name
|
||||||
|
|
||||||
|
if (Test-Path -LiteralPath $target) {
|
||||||
|
# Try comparing contents by hash. If identical, either skip or overwrite based on $using:SameFileAction.
|
||||||
|
try {
|
||||||
|
$srcHash = Get-FileHash -Algorithm SHA256 -Path $_.FullName
|
||||||
|
$dstHash = Get-FileHash -Algorithm SHA256 -Path $target
|
||||||
|
if ($srcHash.Hash -eq $dstHash.Hash) {
|
||||||
|
switch ($sameAction.ToLower()) {
|
||||||
|
'skip' {
|
||||||
|
Write-Verbose "Skipping move for identical file: $name"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
'overwrite' {
|
||||||
|
Move-Item -LiteralPath $_.FullName -Destination $target -Force
|
||||||
|
return
|
||||||
|
}
|
||||||
|
default {
|
||||||
|
Write-Verbose "Unknown SameFileAction '$sameAction', skipping $name"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
# If hashing failed for any reason, fall back to the existing collision-avoidance behavior.
|
||||||
|
Write-Verbose "Hash comparison failed for $($name): $($_)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# If we reach here, target exists and contents differ: find a non-colliding name (foo (1).json, etc.)
|
||||||
|
$i = 1
|
||||||
|
while (Test-Path -LiteralPath $target) {
|
||||||
|
$base = [IO.Path]::GetFileNameWithoutExtension($name)
|
||||||
|
$ext = [IO.Path]::GetExtension($name)
|
||||||
|
$target = Join-Path $dest ("{0} ({1}){2}" -f $base,$i,$ext)
|
||||||
|
$i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Move-Item -LiteralPath $_.FullName -Destination $target -Force
|
||||||
|
} -ThrottleLimit $deg
|
||||||
Loading…
Add table
Add a link
Reference in a new issue