From 3f0ddc41a0b61b9392b62be0e7182e5c8584c0ed Mon Sep 17 00:00:00 2001 From: Markus Fleschutz Date: Wed, 12 Feb 2025 13:58:47 +0100 Subject: [PATCH] Updated check-symlinks.ps1 and sync-dir.ps1 --- scripts/check-symlinks.ps1 | 43 +++++++++++++++++++------------------- scripts/sync-dir.ps1 | 3 ++- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/scripts/check-symlinks.ps1 b/scripts/check-symlinks.ps1 index 2a734e4d..42111f08 100755 --- a/scripts/check-symlinks.ps1 +++ b/scripts/check-symlinks.ps1 @@ -1,15 +1,14 @@ <# .SYNOPSIS - Checks symlinks in a folder + Checks all symlinks in a folder .DESCRIPTION - This PowerShell script checks every symbolic link in a folder (including subfolders). - It returns the number of broken symlinks as exit value. + This PowerShell script checks all symbolic links in a directory tree. It returns the number of broken symlinks as exit value. .PARAMETER folder Specifies the path to the folder .EXAMPLE - PS> ./check-symlinks C:\Users - ⏳ Checking symlinks at 📂C:\Users including subfolders... - ✅ Found 0 broken symlinks at 📂C:\Users in 60 sec + PS> ./check-symlinks D:\ + ⏳ Please wait while checking symlinks at: 📂D:\ ... + ✅ Found 0 broken symlinks at 📂D:\ in 60s. .LINK https://github.com/fleschutz/PowerShell .NOTES @@ -19,36 +18,36 @@ param([string]$Folder = "") try { - if ($Folder -eq "" ) { $Folder = read-host "Enter the path to the folder" } + if ($Folder -eq "" ) { $Folder = Read-Host "Enter the path to the folder" } - $StopWatch = [system.diagnostics.stopwatch]::startNew() - $FullPath = Resolve-Path "$Folder" - "⏳ Checking symlinks at 📂$FullPath including subfolders..." + $stopWatch = [system.diagnostics.stopwatch]::startNew() + $fullPath = Resolve-Path "$Folder" + "⏳ Please wait while checking symlinks at 📂$fullPath ..." - [int]$NumTotal = [int]$NumBroken = 0 - Get-ChildItem $FullPath -recurse | Where { $_.Attributes -match "ReparsePoint" } | ForEach-Object { + [int]$numTotal = [int]$numBroken = 0 + Get-ChildItem $fullPath -recurse | Where { $_.Attributes -match "ReparsePoint" } | ForEach-Object { $Symlink = $_.FullName $Target = ($_ | Select-Object -ExpandProperty Target -ErrorAction Ignore) if ($Target) { $path = $_.FullName + "\..\" + ($_ | Select-Object -ExpandProperty Target) $item = Get-Item $path -ErrorAction Ignore if (!$item) { - $NumBroken++ - "Symlink $Symlink to: $Target seems broken (#$NumBroken)" + $numBroken++ + "Broken symlink #$($numBroken) at $Symlink linking to: $Target" } } - $NumTotal++ + $numTotal++ } - [int]$Elapsed = $StopWatch.Elapsed.TotalSeconds - if ($NumTotal -eq 0) { - "✅ No symlink found at 📂$FullPath in $Elapsed sec" - } elseif ($NumBroken -eq 1) { - "✅ Found $NumBroken broken symlink at 📂$FullPath in $Elapsed sec" + [int]$elapsed = $stopWatch.Elapsed.TotalSeconds + if ($numTotal -eq 0) { + "✅ No symlink found at 📂$fullPath in $($elapsed)s." + } elseif ($numBroken -eq 1) { + "✅ Found $numBroken broken symlink at 📂$fullPath in $($elapsed)s ($numTotal symlinks in total)." } else { - "✅ Found $NumBroken broken symlinks at 📂$FullPath in $Elapsed sec" + "✅ Found $numBroken broken symlinks at 📂$fullPath in $($elapsed)s ($numTotal symlinks in total)." } - exit $NumBroken + exit $numBroken } catch { "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" exit 1 diff --git a/scripts/sync-dir.ps1 b/scripts/sync-dir.ps1 index 0848eb90..b8af162e 100755 --- a/scripts/sync-dir.ps1 +++ b/scripts/sync-dir.ps1 @@ -27,9 +27,10 @@ try { $stopWatch = [system.diagnostics.stopwatch]::startNew() "⏳ Please wait while syncing content from 📂$sourcePath to 📂$targetPath ..." - & robocopy.exe $sourcePath $targetPath /MIR /FFT /NJH /NDL /NFL /NP /NS + & robocopy.exe $sourcePath $targetPath /MIR /SL /FFT /NJH /NDL /NFL /NP /NS # # /MIR = mirror a directory tree + # /SL = copy Symbolic Links as links instead of as the link targets # /FFT = assume FAT file times (2-second granularity) # /NJH = no job header # /NDL = no directory list (don't log directory names)