双引号在注册表项中有什么区别?

双引号在注册表项中有什么区别?

我刚刚在 Windows 注册表中的适当位置添加了“shell”、“powershell”和“command”键,为自己创建了一个“在此处打开 PowerShell”上下文菜单项。“command”的默认值是我的 powershell.exe 的路径,使用反斜杠作为转义符,而不是将整个路径括在双引号中。

这导致打开了一个 cmd 窗口并执行了 powershell,也就是说,窗口很小、很黑,并且按照默认的命令提示符样式格式化。
当我将路径更改为不使用反斜杠作为转义字符,而是将整个路径括在双引号中,而不做任何其他更改时,打开了一个正常、更大、蓝色的 powershell 窗口。

我想知道双引号会给注册表带来什么变化?在这种情况下它们如何改变执行,为什么?

所涉及的键是:
C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe

"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe"

第一个键将打开一个标准的黑色命令提示符窗口,其中启动了 PowerShell,而第二个键将打开熟悉的蓝色“PowerShell”窗口。

请注意,在特定文件夹中启动 Powershell 的键在末尾有参数,这里故意省略了这些参数,因为这些是我用来测试的键,并且会产生不同的结果。

答案1

在第一种情况下,您没有逃避任何事情;新进程是使用完整的命令行创建的C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe,正如您所说的那样。(已使用 Process Explorer 验证。)

Windows 将控制台样式信息(颜色、字体、窗口大小)存储在 中。当运行HKCU\Console控制台模式程序(即生成其自身实例的程序)时,Windows 会检查名为该程序 EXE 完整路径的子项,并在路径中包含环境变量conhost.exeConsole崩溃(见注释)并将\替换为_。 (如果失败,Windows 将检查名为 但没有\替换的子项,但注册表编辑器不会允许您将其包含\在项名称中。已使用进程监视器进行验证。)

笔记:“折叠”(与环境变量相关)只是我对“扩展”的反义词。扩展是%SystemRoot%用环境变量的值替换环境变量的过程(例如C:\Windows在本例中)。似乎 Windows 在查询控制台键之前尽可能将值折叠到环境变量中,因此C:\Windows被替换为%SystemRoot%

通常,Windows 会在名为 的子项中找到 PowerShell 的设置%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe。但由于程序路径中有多余的反斜杠(Windows 可以原谅但不会清理,至少在本例中不会),因此它找不到任何特殊的控制台设置,因为没有合适的子项。当我将上下文菜单项设置为 launch C:\Windows\system32\WindowsPowerShell\v1.0\\powershell.exe(注意最后一个\重复)并将实际子项重命名为%SystemRoot%_System32_WindowsPowerShell_v1.0__powershell.exe(注意最后一个_重复)时,启动的 PowerShell 实例获得了样式。

在旁边:通过在现有命令提示符中键入来启动的 PowerShell 实例powershell永远不会获得特殊样式,因为它们附加到其父级的控制台,而父级通常具有无聊的默认样式。该现象与上述情况无关。

进一步阅读:Jay Bazuzi 的很好的答案提到了样式可以来自的几个地方。

相关内容