以下代码保存为test.bat执行。其中powershell代码由gemini ai提供。
- <#*,:
- @echo off
- cd /d "%~dp0"
- set "batchfile=%~f0"
- Powershell -ExecutionPolicy Bypass -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create([IO.File]::ReadAllText($env:batchfile,[Text.Encoding]::GetEncoding(0) )) )"
- pause
- exit /b
- #>
- # 1. 配置你的新根目录
- $BaseDir = "D:\MyFiles"
- # 2. 文件夹及其对应的官方 GUID
- $FolderMap = @{
- #"Downloads" = "374DE290-123F-4565-9164-39C4925E467B"
- #"Documents" = "FDD39AD0-238F-46AF-ADB4-6C85480369C7"
- "Desktop" = "B4BFCC3A-DB2C-424C-B029-7FE99A87C641"
- #"Pictures" = "33E28130-4E1E-4676-835A-98395C3BC3BB"
- #"Music" = "4BD8C516-2D47-496B-A4A2-054C1D1DDB01"
- #"Videos" = "18989B1D-99B5-455B-841C-AB7C74E4DDFC"
- }
- # 3. 嵌入底层 C# 代码防止闪退
- $CSource = @"
- using System;
- using System.Runtime.InteropServices;
- public class ShellManager {
- [DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
- public static extern void SHSetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, string pszPath);
-
- [DllImport("shell32.dll")]
- public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
- }
- "@
- if (!([System.Management.Automation.PSTypeName]'ShellManager').Type) {
- Add-Type -TypeDefinition $CSource
- }
- # 4. 执行循环修改
- foreach ($Name in $FolderMap.Keys) {
- $Target = Join-Path $BaseDir $Name
- if (!(Test-Path $Target)) { New-Item $Target -ItemType Directory -Force | Out-Null }
-
- try {
- $Guid = [Guid]$FolderMap[$Name]
- # 参数 0 代表立即生效并通知系统
- [ShellManager]::SHSetKnownFolderPath($Guid, 0, [IntPtr]::Zero, $Target)
- Write-Host "[成功] $Name 已定向至 $Target" -ForegroundColor Green
- } catch {
- Write-Host "[失败] $Name 无法修改,可能被 OneDrive 占用" -ForegroundColor Red
- }
- }
- # 5. 强制触发全局 UI 刷新 (SHCNE_ASSOCCHANGED)
- [ShellManager]::SHChangeNotify(0x08000000, 0x0000, [IntPtr]::Zero, [IntPtr]::Zero)
- Write-Host "`n操作完成!如果侧边栏图标没变,请点一下它,它会自动跳转到新位置。" -ForegroundColor Cyan
复制代码 |