PowerShell 中 * 是一个通配符(a wildcard character),而 Wiindows Registry 注册表路径中的 * 并不是通配符,而是一个普通字符,使用 Get-Item 等命令查询或者修改注册表时,会出现预料以外的行为,也就是,实际上想要操作某一个注册表路径,结果把其它路径的注册表内容也给操作了。
比如以下命令,想要查询 HKCU:\Software\Classes\*\shell\QuarkCloudDrive.upload,结果 除了 HKEY_CURRENT_USER\Software\Classes\*\shell\QuarkCloudDrive.upload 还查询到了 HKEY_CURRENT_USER\Software\Classes\Directory\shell\QuarkCloudDrive.upload,这并不是想要的结果,这实际上是因为 PowerShell 把 -Path 参数中的 * 当成了通配符,而不是 * 这个字符本身。
- PS C:\Users\wuxiancheng> Get-Item -Path "HKCU:\Software\Classes\*\shell\QuarkCloudDrive.upload"
- Hive: HKEY_CURRENT_USER\Software\Classes\*\shell
- Name Property
- ---- --------
- QuarkCloudDrive.upload (default) : 上传到夸克网盘
- Icon : "C:\Users\wuxiancheng\AppData\Local\Programs\quark-cloud-drive\QuarkCloudDrive.exe"
- Hive: HKEY_CURRENT_USER\Software\Classes\Directory\shell
- Name Property
- ---- --------
- QuarkCloudDrive.upload (default) : 上传到夸克网盘
- Icon : "C:\Users\wuxiancheng\AppData\Local\Programs\quark-cloud-drive\QuarkCloudDrive.exe"
复制代码 Windows 文件系统不允许文件名、文件夹名及文件路径包含 * 字符,所以对于文件系统来说,不会存在这个问题,但注册表允许 * 字符,注册表路径中的 * 是 * 这个字符本身,而不是通配符,要将注册表路径中的 * 当成普通字符,需要对 * 转义,而使用 \* 或 `* 都不能实现将注册表路径中的 * 转化为普通意义上的 * 字符。
将 * 放在 [] 中才能真正地转义注册表路径中的 *,所以,上述 Get-Item 查询注册表时正确的写法应该是- Get-Item -Path "HKCU:\Software\Classes\[*]\shell\QuarkCloudDrive.upload"
复制代码- PS C:\Users\wuxiancheng> Get-Item -Path "HKCU:\Software\Classes\[*]\shell\QuarkCloudDrive.upload"
- Hive: HKEY_CURRENT_USER\Software\Classes\*\shell
- Name Property
- ---- --------
- QuarkCloudDrive.upload (default) : 上传到夸克网盘
- Icon : "C:\Users\wuxiancheng\AppData\Local\Programs\quark-cloud-drive\QuarkCloudDrive.exe"
复制代码 但响应速度很慢,需要好几秒钟才能返回查询结果,很明显并没有按给定的路径直接查询出结果,而是还是把注册表给完整搜了一遍。
另一种办法,是使用 -LiteralPath 参数代替 -Path 参数,-LiteralPath 不会解析通配符,直接使用给定的路径定位注册表。- PS C:\Users\wuxiancheng> Get-Item -LiteralPath "HKCU:\Software\Classes\*\shell\QuarkCloudDrive.upload"
- Hive: HKEY_CURRENT_USER\Software\Classes\*\shell
- Name Property
- ---- --------
- QuarkCloudDrive.upload (default) : 上传到夸克网盘
- Icon : "C:\Users\wuxiancheng\AppData\Local\Programs\quark-cloud-drive\QuarkCloudDrive.exe"
复制代码 Get-Item Set-Item Remove-Item Get-ItemProperty Set-ItemProperty Get-ItemPropertyValue 等 PowerShell 命令都支持 -LiteralPath 参数。
不知道从什么时候开始大家都开始用夸克网盘分享文件了,但夸克网盘它真的是一坨狗屎,恶意限速不说,还往电脑的右键菜单塞垃圾,可以写一个脚本来引导运行夸克网盘,然后在夸克网盘进程结束运行后自动清理它拉出来的狗屎。- HKEY_CURRENT_USER\Software\Classes\*\shell\QuarkCloudDrive.imSendSelf
- HKEY_CURRENT_USER\Software\Classes\*\shell\QuarkCloudDrive.upload
- HKEY_CURRENT_USER\Software\Classes\*\shellex\ContextMenuHandlers\ QuarkCloudDrive.ContextMenuExt
复制代码 相关链接 PowerShell wild cards Get-Item |
|