哪些注册表命令允许我从包含撇号的文件夹的右键单击上下文菜单中以管理员身份运行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?
问题描述
这是我得到的信息:
以管理员身份打开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
odejs
odevars.bat""
(我无法以管理员身份打开节点提示符)。
今天,我意识到如果我要打开的目录的路径或文件夹名中有撇号,那么所有这些命令都会失败。我尝试了这么多不同的注册表命令以及引号和转义字符的组合,但都不起作用。这变得非常令人沮丧。有没有人知道在带有撇号的目录中同时打开CMD和PowerShell 5的有效命令?
任何帮助都将不胜感激。
推荐答案
解决方案的关键是:
通过
cmd.exe
和管道(|
)启动通过%V
传递到powershell.exe
的文本文件夹路径:cmd /c <NUL set /p="%V"
是一个技巧,它回显%V
的值而不带双引号,即使该值包含cmd.exe
元字符(它也回显时没有尾随换行符,但这在这里不是问题)。在要通过管道传输到的
powershell.exe
命令行中,然后可以通过automatic$input
variable间接引用文件夹路径,它提供对stdin(管道)输入的访问。- 这可以防止在命令行中直接嵌入
%V
时出现的问题,特别是包含$
和`
字符的路径。
- 这可以防止在命令行中直接嵌入
此外,PowerShell命令还可以对
$env:_dir
的值执行字符串替换,以便双重嵌入'
字符,从而允许将该值嵌入到逐字记录的'...'
字符串中。
PowerShell的嵌套
"..."
报价要求使用作为转义字符进行复杂的转义。
注意:这些命令总是会导致创建一个辅助的临时控制台窗口,PowerShell命令会尽快隐藏该窗口,然后自动关闭。这将导致一些短暂的视觉中断。
- 要避免这种情况,需要额外的GUI子系统帮助器可执行文件,以便在没有可见(初始)控制台窗口的情况下启动命令行。这种额外的间接级别会使引用和转义进一步复杂化。
注意:
以下命令旨在将逐字放置在注册表中。以编程方式执行会使转义进一步复杂化。
这些命令使用
powershell.exe
Windows PowerShellCLI,但它们也应该与跨平台的按需安装PowerShell (Core) 7+CLI一起使用;根据安装后者的方式,您可能必须在下面的命令中使用其完整路径。您可以按如下方式测试命令:
- 将
%V
替换为感兴趣文件夹的文字路径。 - 通过Windows
Run
对话框(WinKey-R)提交。
- 将
提升的会话的命令(以管理员身份运行):
Apowershell.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("'", "''"))"
Acmd.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
odejs
odevars.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(';',';'))"
注意:此方法是外壳不可知的。也就是说,Windows终端自己设置工作目录,然后运行任何配置为其默认shell的shell。
用于非-提升的会话的命令:
这样就不再需要嵌套调用PowerShell,从而简化了命令。
但是,对于打开PowerShell会话,需要特别注意以下事项:
需要另一种逐字传递文件夹路径的方法:设置辅助环境变量,
_dir
,PowerShell命令可以$env:_dir
访问该环境变量。视觉中断通过一个辅助的临时控制台窗口,您有两个选择,权衡:
避免中断,其缺点是应用了
cmd.exe
的控制台窗口设置(并且用于启动PowerShell会话的初始cmd.exe
进程作为PowerShell进程的父进程保持活动状态;但是,它们一起终止)。忍受中断(这是使用提升不可避免的),其优点是使用与PowerShell可执行文件关联的常规控制台设置。
无视觉中断,但使用cmd.exe
的控制台窗口设置,即使是PowerShell:
Apowershell.exe
会话:
cmd /c title Windows^ PowerShell & pushd "%V" & powershell.exe
Acmd.exe
会话(Node.js初始化追加& "C:Program Files
odejs
odevars.bat"
):
cmd /k pushd "%V"
视觉中断,但使用PowerShell的控制台窗口设置:
Apowershell.exe
会话:
cmd /c pushd "%V" & start powershell.exe
注意:
以上将使用PowerShell的常规控制台窗口设置,但会将完整可执行路径显示为窗口的标题。
虽然您可以使用
start "Windows PowerShell" powershell.exe
更改标题,例如,然后应用默认设置,但是您可以自定义它们。另一种方法是从PowerShell中的更改窗口标题(但是,在PowerShell完全加载之前,更改不会生效):
cmd /c pushd "%V" & start powershell.exe -NoExit -Command [Console]::Title='Windows PowerShell'
最后,如果通过完整路径调用
pwsh.exe
,且该路径包含空格,则需要对空格单独使用双引号,因为将路径作为一个整体使用双引号会导致将其误认为窗口title参数(如果显式传递(必然用双引号引起的)title参数,则不需要额外的工作);例如:: Note the individually quoted space (" ") cmd /c pushd "%V" & start C:PowerShell" "7pwsh.exe
这篇关于哪些注册表命令允许我从包含撇号的文件夹的右键单击上下文菜单中以管理员身份运行PowerShell 5/CMD?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!