哪些注册表命令允许我从包含撇号的文件夹中右键单击上下文菜单以管理员身份 运行 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?

我正在尝试设置右键单击上下文菜单以在当前目录中同时启动 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"

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

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

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

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

如有任何帮助,我们将不胜感激。

解决的关键是:

  • 通过 cmd.exepipe (|) 启动,文字文件夹路径通过 %V 传递给 powershell.exe:

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

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

      • 这可以防止在 %V 直接 嵌入 命令行时出现的问题,特别是对于包含 $ 和 [=30 的路径=]个字符。
    • 此外,PowerShell 命令可以对 $env:_dir 的值执行 字符串替换 ,以便加倍嵌入 ' 字符,这允许将值逐字嵌入 '...' 字符串。

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

  • 注意:这些命令总是会导致创建一个 辅助的临时控制台 window,PowerShell 命令会尽快隐藏它,然后auto-closes。这会导致一些短暂的视觉中断

    • 避免这种情况需要额外的 GUI-subsystem 辅助可执行文件来启动没有可见(初始)控制台的命令行 window。这种额外的间接级别会使引用和转义进一步复杂化。

注:

  • 以下命令旨在逐字放置在注册表中。以编程方式这样做会使转义变得更加复杂。

  • 命令使用 powershell.exeWindows PowerShell CLI,但它们也应该与 pwsh.exe 一起使用, cross-platform、install-on-demand PowerShell (Core) 7+ CLI;根据您安装后者的方式,您可能必须在下面的命令中使用它的完整路径

  • 您可以test-drive命令如下:

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

提升sessions(运行作为管理员的命令):

一个 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(\"'\", \"''\"))"

A cmd.exe session:

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

A cmd.exe session 设置了 Node.js 环境:

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\"\"\""

注意:如果您想使用 environment-variable %ProgramFiles% 而不是 hard-coding C:\Program Files 作为 Node.js initialization-batch 文件路径以提高稳健性,您必须将注册表值定义为 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-agnostic。也就是说,Windows 终端本身设置工作目录,然后 运行s 任何 shell 配置为其默认值。


-提升的命令sessions:

  • 嵌套 调用 PowerShell 的需求随后消失,这简化了命令。

  • 但是,对于打开 PowerShell session 特殊注意事项适用:

    • 需要一种逐字传递文件夹路径的不同方法:设置了辅助环境变量_dir,PowerShell 命令可以使用该变量作为 $env:_dir.

      访问
    • 临时的辅助控制台视觉干扰window,您有两个选择,需要进行以下权衡:

      • 避免中断,其缺点是cmd.exe's console-window settings are applied (and that the initial cmd.exe process used to launch the PowerShell session stays alive as the PowerShell process' parent进程;然而,它们一起终止。

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

没有 视觉干扰,但使用 cmd.exe 的 console-window 设置,即使是 PowerShell:

A powershell.exe session:

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

A cmd.exe session(为 Node.js 初始化附加 & "C:\Program Files\nodejs\nodevars.bat"):

cmd /k pushd "%V"

视觉中断,但使用 PowerShell 的 console-window 设置:

A powershell.exe session:

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

注:

  • 以上将使用 PowerShell 的常用 console-window 设置,但会显示 完整的可执行文件le path 作为 window 的 title.

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

  • 另一种方法是更改​​ inside PowerShell 中的 window 标题(但是,更改只有在 PowerShell 完全加载后才会生效):

    cmd /c pushd "%V" & start powershell.exe -NoExit -Command [Console]::Title='Windows PowerShell'
    
  • 最后,如果您通过 完整路径 调用 pwsh.exe 并且该路径包含 空格 ,你需要 double-quote 空格 单独 ,因为 double-quoting 路径 作为一个整体 会导致它被弄错对于 window title 参数(如果您明确传递(必要的 double-quoted)标题参数,则不需要额外的工作);例如:

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