PowerShell设置文件夹选项关闭显示隐藏文件不生效怎么办
问题成因
- 注册表键值设置错误。
HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced下的Hidden键值对应规则为:值为1时是勾选「显示隐藏的文件、文件夹和驱动器」,值为2时才是取消勾选、隐藏这类项目。你当前脚本写入的值为1,本身就是开启显示的配置,和你要实现的目标相反。 - 缺少全局配置变更通知。仅遍历刷新当前已打开的资源管理器窗口,无法触发explorer全进程(包括托管桌面、导航窗格的后台explorer实例)重载注册表配置,系统也不会把文件夹选项变更的事件同步给所有相关系统组件,最终表现为注册表值已修改,但运行中的程序仍使用旧缓存配置,设置不生效。
修正后可直接运行的脚本
脚本逻辑为:写入正确的注册表值,调用系统API向所有顶层窗口广播设置变更事件,最后刷新所有资源管理器实例,无需强制重启explorer进程即可实时生效。
$regPath = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' # 目标配置:取消勾选显示隐藏项目,值设为2;如果需要开启显示,将值改为1即可 Set-ItemProperty -Path $regPath -Name Hidden -Value 2 # 调用系统API广播全局设置变更通知 Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class Win32 { [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr SendMessageTimeout( IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out IntPtr lpdwResult ); } "@ $HWND_BROADCAST = [IntPtr]0xffff $WM_SETTINGCHANGE = 0x001A $SMTO_ABORTIFHUNG = 0x0002 $broadcastResult = [IntPtr]::Zero [Win32]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Policy", $SMTO_ABORTIFHUNG, 5000, [ref]$broadcastResult) | Out-Null # 刷新所有已打开的资源管理器窗口 $shell = New-Object -ComObject Shell.Application $shell.Windows() | ForEach-Object { $_.Refresh() }
执行完成后打开文件夹选项查看,对应选项会自动同步为未勾选状态,所有位置的隐藏文件会立即隐藏。
内容的提问来源于stack exchange,提问作者TypeKG
相关产品推荐
相关产品推荐

