Advanced Tricks for Power Users with Windows Symbolic Link Maker
1. Use directory junctions for large folders
When: Linking directories on the same NTFS volume.
Command:
bash
mklink /J “C:\Path\To\Link” “C:\Path\To\TargetFolder”
Why: Junctions have lower overhead than full symbolic links and avoid some permission issues.
2. Create developer-friendly source-to-build links
When: Keeping source code in one drive and build output on another (or in a RAM disk).
Command:
bash
mklink /D “D:\Project\src” “C:\Users\You\Repos\Project\src”
Why: Tools that expect relative paths can work unchanged while heavy build artifacts live elsewhere.
3. Replace user folders without breaking apps
When: Moving Documents, Pictures, etc., to another drive without reconfiguring apps.
Command:
bash
robocopy “C:\Users\You\Documents” “E:\UsersBackup\Documents” /MIR /COPYALL rmdir “C:\Users\You\Documents” mklink /D “C:\Users\You\Documents” “E:\UsersBackup\Documents”
Why: Preserves folder structure and app compatibility; use robust copy then create link.
4. Use symbolic links for versioned backups
When: Pointing a stable path (e.g., LatestBackup) to timestamped backup folders.
Command:
bash
mklink /D “D:\Backups\Latest” “D:\Backups\2026-02-050300”
Why: Scripts and restore tools can always refer to “Latest” while archives remain immutable.
5. Link across OS boundaries in WSL
When: Exposing Windows folders to WSL or vice versa without duplicating data.
Command (from elevated Windows):
bash
mklink /D “C:\wslshared” “\wsl$\Ubuntu\home\you\project”
Why: Simplifies tooling that runs on both Windows and WSL, but watch path translation and permissions.
6. Automate link creation and validation
When: Managing many links across machines or deployments.
Script (PowerShell):
powershell
\(links</span><span> = @</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span> </span><span>@</span><span class="token" style="color: rgb(57, 58, 52);">{</span><span>Link=</span><span class="token" style="color: rgb(163, 21, 21);">"C:\LinkA"</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> Target=</span><span class="token" style="color: rgb(163, 21, 21);">"D:\TargetA"</span><span class="token" style="color: rgb(57, 58, 52);">}</span><span class="token" style="color: rgb(57, 58, 52);">,</span><span> </span><span> @</span><span class="token" style="color: rgb(57, 58, 52);">{</span><span>Link=</span><span class="token" style="color: rgb(163, 21, 21);">"C:\LinkB"</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> Target=</span><span class="token" style="color: rgb(163, 21, 21);">"E:\TargetB"</span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span></span><span class="token" style="color: rgb(0, 0, 255);">foreach</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">\)l in \(links</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">-not</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">Test-Path</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)l.Link)) { cmd /c “mklink /D"</span><span class="token" style="color: rgb(57, 58, 52);">$</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">$l</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">Link</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(163, 21, 21);">”"</span><span class="token" style="color: rgb(57, 58, 52);">$</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">$l</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">Target</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(163, 21, 21);">”” } elseif ((Get-Item \(l</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>Link</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>LinkType </span><span class="token" style="color: rgb(57, 58, 52);">-and</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">Get-Item</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)l.Link).Target -ne \(l</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>Target</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">Write-Host</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"Updating </span><span class="token" style="color: rgb(57, 58, 52);">\)(\(l</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">Link</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">Remove-Item</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)l.Link cmd /c “mklink /D"</span><span class="token" style="color: rgb(57, 58, 52);">$</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">$l</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">Link</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(163, 21, 21);">”"</span><span class="token" style="color: rgb(57, 58, 52);">$</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(54, 172, 170);">$l</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">Target</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(163, 21, 21);">”” } }
Why: Ensures reproducible environment setup and detects stale links.
7. Troubleshoot permission and elevation issues
- Run elevated: mklink requires admin for some link types; use an elevated shell.
- Use Developer Mode: On Windows ⁄11, enable Developer Mode to allow non-elevated symlink creation for convenience.
- Check attributes: Antivirus or folder permissions can block link creation—temporarily test with a simple folder.
8. Mix link types deliberately
- Use /H (hard link) for files when you need identical file data without separate copies (same volume only).
- Use /J (junction) for directories on same volume.
- Use /D (symbolic) for cross-volume or network targets.
Choose based on portability, permissions, and tooling expectations.
9. Beware of recursive loops
Avoid creating links that point to parent folders or form cycles; they can break backups and recursion-based tools. Use Test-Path and careful planning.
10. Backup and restore strategy
- Store a manifest of links (Link path → Target path).
- On restore, recreate links in the correct order (targets before links). Example manifest line:
Code
C:\LinkA => D:\TargetA
If you want, I can generate a PowerShell script to scan an existing folder tree and produce a manifest or recreate links from a manifest.
Leave a Reply