哪些注册表命令允许我从包含撇号的文件夹的右键单击上下文菜单中以管理员身份运行 PowerShell 5 / CMD?

Posted

技术标签:

【中文标题】哪些注册表命令允许我从包含撇号的文件夹的右键单击上下文菜单中以管理员身份运行 PowerShell 5 / CMD?【英文标题】:What registry commands allow me to run PowerShell 5 / CMD as admin from the right click context menu from a folder that has an apostrophe in it? 【发布时间】:2022-01-18 11:56:47 【问题描述】:

我正在尝试设置我的右键单击上下文菜单以在当前目录中同时启动 CMD 和 PowerShell5。我的 PowerShell 7 命令运行良好。

这是我得到的:

以管理员身份打开PowerShell5的注册表命令如下:

PowerShell -Command "Start-Process cmd -ArgumentList '/s,/k,pushd %V && start PowerShell -NoExit && exit' -Verb RunAs"

以管理员身份打开命令提示符的注册表命令如下:

pwsh -noprofile -windowstyle hidden -Command "Start-Process cmd.exe -ArgumentList '/s,/k,pushd,%V' -Verb RunAs"

我必须打开 Node 命令提示符的注册表命令是这样的: cmd.exe /s /k "pushd "%V" & "C:\Program Files\nodejs\nodevars.bat""

(我不知道如何以管理员身份打开节点提示符)。

今天,我意识到如果我要打开的目录的路径或文件夹名称中有撇号,所有这些命令都会失败。我尝试了很多不同的注册表命令以及引号和转义字符的组合,但没有任何效果。它变得非常令人沮丧。

有人知道在带有撇号的目录中打开 CMD 和 PowerShell 5 的任何有效命令吗?

任何帮助都将不胜感激。

【问题讨论】:

【参考方案1】:

解决方法的关键是:

通过cmd.exe管道 (|) 启动通过%V 传递给powershell.exe 的文字文件夹路径:

cmd /c <NUL set /p="%V" 是回显%V 的值的技巧不带双引号,即使该值包含cmd.exe 元字符(它也回显不带尾随换行符,但这不是这里有问题)。

在通过管道传送到的powershell.exe 命令行中,然后可以通过automatic $input variable 间接引用文件夹路径,该automatic $input variable 提供对stdin 的访问(管道)输入。

这可以防止在命令行中直接嵌入%V 时出现的问题,特别是对于包含$` 字符的路径。

此外,PowerShell 命令可以对$env:_dir 的值执行字符串替换,以便将嵌入的' 字符加倍,从而允许将值逐字嵌入'...' 字符串中。

PowerShell 的嵌套"..." 引用需要使用\ 作为转义字符进行复杂的转义。

注意:这些命令总是会导致创建一个辅助的临时控制台窗口,PowerShell 命令会尽快将其隐藏,然后自动关闭。这将导致一些短暂的视觉干扰

要避免这种情况,需要一个额外的 GUI 子系统帮助程序可执行文件,用于在没有可见(初始)控制台窗口的情况下启动命令行。这种额外的间接层级会使引用和转义更加复杂。

注意:

以下命令被设计成逐字 放在注册表中。 以编程方式这样做会使进一步的转义变得复杂。

这些命令使用powershell.exeWindows PowerShell CLI,但它们也应该使用pwsh.exe,跨平台按需安装PowerShell (Core) 7+ CLI;根据您安装后者的方式,您可能必须在以下命令中使用其完整路径

您可以按如下方式试驾命令:

%V 替换为感兴趣文件夹的文字路径。 通过 Windows Run 对话框提交 (WinKey-R)。

提升会话的命令(以管理员身份运行):

powershell.exe(Windows PowerShell)会话:

cmd /c <NUL set /p="%V" | powershell.exe -WindowStyle Hidden -NoProfile -Command "Start-Process -Verb RunAs powershell.exe -ArgumentList ('-NoExit -Command \"Push-Location -LiteralPath ''0''\"' -f $input.Replace(\"'\", \"''\"))"

cmd.exe 会话:

cmd /c <NUL set /p="%V" | powershell.exe -WindowStyle Hidden -NoProfile -Command "Start-Process -Verb RunAs cmd -ArgumentList \"/k pushd \"\"$input\"\"\""

设置了 Node.js 环境的 cmd.exe 会话:

cmd /c <NUL set /p="%V" | powershell.exe -WindowStyle Hidden -NoProfile -Command "Start-Process -Verb RunAs cmd -ArgumentList \"/k pushd \"\"$input\"\" ^& \"\"C:\Program Files\nodejs\nodevars.bat\"\"\""

注意:如果您想使用环境变量 %ProgramFiles% 而不是硬编码 C:\Program Files 作为 Node.js 初始化批处理文件路径的一部分以提高稳健性,则必须定义注册表值为REG_EXPAND_SZ

运行 wt.exe(Windows 终端),如您所见,需要转义 ; 字符。在路径中为\;,因为; 是metacharacter on the wt.exe command line)。

cmd /c <NUL set /p="%V" | powershell.exe -WindowStyle Hidden -NoProfile -Command "Start-Process -Verb RunAs wt.exe -ArgumentList (\"-d \"\"0\" -f $input.Replace(';','\;'))"

注意:这种方法与 shell 无关。也就是说,Windows 终端自己设置工作目录,然后运行任何配置为其默认值的 shell。


提升会话的命令:

嵌套调用 PowerShell 的需求随之消失,从而简化了命令。

但是,对于打开 PowerShell 会话需要特殊注意事项:

需要一种不同的逐字传递文件夹路径的方法:设置一个辅助环境变量_dir,PowerShell 命令可以作为$env:_dir 访问它。

辅助的临时控制台窗口带来的视觉干扰,您有以下两种选择权衡

避免中断,其缺点是 cmd.exe's 应用了控制台窗口设置(并且用于启动 PowerShell 会话的初始 cmd.exe 进程在 PowerShell 中保持活动状态)进程的父进程;但是它们一起终止)。

忍受中断(这是不可避免的提升),其优点是使用与 PowerShell 可执行文件关联的常规控制台设置。

没有视觉中断,但使用cmd.exe的控制台窗口设置,即使是PowerShell

powershell.exe 会话:

cmd /c title Windows^ PowerShell & pushd "%V" & powershell.exe

cmd.exe 会话(附加 &amp; "C:\Program Files\nodejs\nodevars.bat" 用于 Node.js 初始化):

cmd /k pushd "%V"

视觉中断,但使用 PowerShell 的控制台窗口设置

powershell.exe 会话:

cmd /c pushd "%V" & start powershell.exe

注意:

以上将使用 PowerShell 的常用控制台窗口设置,但将完整的可执行路径显示为窗口的标题

虽然您可以使用 start "Windows PowerShell" powershell.exe 更改标题,例如,默认 设置然后应用 - 但是您可以自定义它们。

另一种方法是从 inside PowerShell 更改窗口标题(但是,在 PowerShell 完全加载之前,更改不会生效):

cmd /c pushd "%V" & start powershell.exe -NoExit -Command [Console]::Title='Windows PowerShell'

最后,如果您通过其完整路径调用pwsh.exe,并且该路径包含空格,则需要将空格单独双引号>,因为将路径 作为一个整体双引号会导致它被误认为是窗口 title 参数(如果您显式传递(必须双引号)标题参数,不需要额外的工作);例如:

:: Note the individually quoted space (" ")
cmd /c pushd "%V" & start C:\PowerShell" "7\pwsh.exe

【讨论】:

以上是关于哪些注册表命令允许我从包含撇号的文件夹的右键单击上下文菜单中以管理员身份运行 PowerShell 5 / CMD?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 的右键单击备份选项

bash中双引号单引号反撇号的用法

如何让资源管理器的右键菜单中常驻“用 Notepad 打开”功能

在 Apps 脚本中对带有撇号的位置进行地理编码会出现“不允许操作”错误

Volley StringRequest 响应更改撇号的值('更改为â)

声明包含单引号/撇号的 char 值的最清晰方法