"Powershell Start-Process -ArgumentList" 中的文字引号

Literal quotes in "Powershell Start-Process -ArgumentList"

我目前正在尝试创建一个从右键单击上下文菜单打开管理 Powershell 的命令。对于上下文,CMD 中的上下文菜单命令 运行。

我的问题是我正在尝试 cd 进入右键单击所在的目录。下面的命令适用于大多数目录,但如果目录路径包含 space,则它只会尝试移动到 space 之前的路径部分,并抛出错误。我的理解是当前目录是通过 %V 传递的,但是当我 运行 命令 echo %V 使用相同的过程时,它会将带有 space 的路径拆分为 2 行,所以我假设路径的各个部分存储在单独的字符串中?

Powershell -noexit "Start-Process 'C:\Users\<me>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell\Windows PowerShell.lnk' -ArgumentList '-noexit','Set-Location -literalPath `"%V`"' -Verb RunAs"

我已经更新了上面的命令以匹配下面的建议,当右键单击桌面时(之前由于缺少 spaces 而有效)我现在收到以下错误:

Set-Location : Cannot find path 'C:\Users\<me>\Desktop`' because it does not exist.
At line:1 char:1
+ Set-Location -literalPath `C:\Users\<me>\Desktop`
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (C:\Users\<me>\Desktop`:String) [Set-Location], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

请注意,在以上两个代码块中,<me> 是我的实际用户名。

我一直在努力尝试在路径周围加上引号,但由于我已经同时使用了单引号和双引号,所以我似乎无法让 Powershell 添加引号。

任何帮助将不胜感激,在此先感谢。

编辑:

对于那些仍在寻找答案的人,我 运行 下面的 Powershell 脚本将功能命令添加到我的上下文菜单中:

$menu = 'Open Windows PowerShell Here as Administrator'
$command = "$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""

'directory', 'directory\background', 'drive' | ForEach-Object {
    New-Item -Path "Registry::HKEY_CLASSES_ROOT$_\shell" -Name runas\command -Force |
    Set-ItemProperty -Name '(default)' -Value $command -PassThru |
    Set-ItemProperty -Path {$_.PSParentPath} -Name '(default)' -Value $menu -PassThru |
    Set-ItemProperty -Name HasLUAShield -Value ''
}

答案来自How do I start PowerShell from Windows Explorer?

如果您想避免 space 问题,您可以通过在字符串中使用 ` 转义来重用 "

例如:

$command = "Set-Location `"C:\temp\test space`""

字符串将变成这个并且 spaces 将被正确处理:

Set-Location "C:\temp\test space"