找回密码
 新建账号

PowerShell 注册表路径通配符*转义

[复制链接]
php 发表于 2024/4/30 14:01 | 显示全部楼层 |阅读模式
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 参数中的 * 当成了通配符,而不是 * 这个字符本身。
  1. PS C:\Users\wuxiancheng> Get-Item -Path "HKCU:\Software\Classes\*\shell\QuarkCloudDrive.upload"

  2.     Hive: HKEY_CURRENT_USER\Software\Classes\*\shell

  3. Name                           Property
  4. ----                           --------
  5. QuarkCloudDrive.upload         (default) : 上传到夸克网盘
  6.                                Icon      : "C:\Users\wuxiancheng\AppData\Local\Programs\quark-cloud-drive\QuarkCloudDrive.exe"

  7.     Hive: HKEY_CURRENT_USER\Software\Classes\Directory\shell

  8. Name                           Property
  9. ----                           --------
  10. QuarkCloudDrive.upload         (default) : 上传到夸克网盘
  11.                                Icon      : "C:\Users\wuxiancheng\AppData\Local\Programs\quark-cloud-drive\QuarkCloudDrive.exe"
复制代码
Windows 文件系统不允许文件名、文件夹名及文件路径包含 * 字符,所以对于文件系统来说,不会存在这个问题,但注册表允许 * 字符,注册表路径中的 * 是 * 这个字符本身,而不是通配符,要将注册表路径中的 * 当成普通字符,需要对 * 转义,而使用 \* 或 `* 都不能实现将注册表路径中的 * 转化为普通意义上的 * 字符。

将 * 放在 [] 中才能真正地转义注册表路径中的 *,所以,上述 Get-Item 查询注册表时正确的写法应该是
  1. Get-Item -Path "HKCU:\Software\Classes\[*]\shell\QuarkCloudDrive.upload"
复制代码
  1. PS C:\Users\wuxiancheng> Get-Item -Path "HKCU:\Software\Classes\[*]\shell\QuarkCloudDrive.upload"

  2.     Hive: HKEY_CURRENT_USER\Software\Classes\*\shell

  3. Name                           Property
  4. ----                           --------
  5. QuarkCloudDrive.upload         (default) : 上传到夸克网盘
  6.                                Icon      : "C:\Users\wuxiancheng\AppData\Local\Programs\quark-cloud-drive\QuarkCloudDrive.exe"
复制代码
但响应速度很慢,需要好几秒钟才能返回查询结果,很明显并没有按给定的路径直接查询出结果,而是还是把注册表给完整搜了一遍。
另一种办法,是使用 -LiteralPath 参数代替 -Path 参数,-LiteralPath 不会解析通配符,直接使用给定的路径定位注册表。
  1. PS C:\Users\wuxiancheng> Get-Item -LiteralPath "HKCU:\Software\Classes\*\shell\QuarkCloudDrive.upload"


  2.     Hive: HKEY_CURRENT_USER\Software\Classes\*\shell


  3. Name                           Property
  4. ----                           --------
  5. QuarkCloudDrive.upload         (default) : 上传到夸克网盘
  6.                                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 参数。
不知道从什么时候开始大家都开始用夸克网盘分享文件了,但夸克网盘它真的是一坨狗屎,恶意限速不说,还往电脑的右键菜单塞垃圾,可以写一个脚本来引导运行夸克网盘,然后在夸克网盘进程结束运行后自动清理它拉出来的狗屎。
  1. HKEY_CURRENT_USER\Software\Classes\*\shell\QuarkCloudDrive.imSendSelf
  2. HKEY_CURRENT_USER\Software\Classes\*\shell\QuarkCloudDrive.upload
  3. HKEY_CURRENT_USER\Software\Classes\*\shellex\ContextMenuHandlers\  QuarkCloudDrive.ContextMenuExt
复制代码
相关链接 PowerShell wild cards Get-Item

手机版|轻松E站

GMT+8, 2024/5/18 23:24

快速回复 返回顶部 返回列表