近期某人更新了 windows 自带的老旧 PowerShell5.1 到最新版本 7.5 后,发现
在右键菜单中的 “在此处打开 PowerShell 窗口” 选项工作不正常,打开的 PowerShell 无法进入指定目录
Set-Location : 找不到接受实际参数“19”的位置形式参数。
所在位置 行:1 字符: 1
+ Set-Location -literalPath D:\桌面\TempFile\新建文件夹 (19)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-Location],ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetLocationCommand
PS C:\WINDOWS\system32>
这报错,一眼就看出来是向Set-Location传递的参数格式错误,原因是PowerShell 把“ (19) ”误认为是一个单独的参数,而不是路径的一部分,因为没有引号包裹整个路径。这在包含空格的路径中频繁出现。
解决办法是更改windows右键菜单中 “在此处打开 PowerShell 窗口” 选项的命令参数。
先打开注册表编辑器,进入到
HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell\command
目录,可以看到有一个默认值,值为命令行参数。
因为只有 TrustedInstaller 用户有权限修改这个默认值,而且本注册表项的所有者为 TrustedInstaller 用户。
所以我们需要手动更改所有者为当前用户,这样才有权限修改这个注册表项的值。
对左边列表command右键,选择权限->高级->更改->在输入框中输入当前用户名称->检查名称->确定
更改为当前用户后,即有权限编辑command下的所有项
此时可编辑默认值为
powershell.exe -NoExit -Command "Set-Location -LiteralPath '%V'"
如果点击确定时报错 “无法编辑:写该值的新内容时出错。” ,就是上一步设置权限的时候没弄好。
这时(可能需要重启),右键菜单“在此处打开PowerShell窗口”即可正常进入指定目录。
为了保证安全性,可以把注册表中command项的所有者还原为TrustedInstaller用户,用户全名为
NT SERVICE\TrustedInstaller
其他:如果你的 powershell 更新过,但打开的仍然是老版本的 powershell 5.1 版本,想要更改默认使用最新版的powershell,也可以将这个值更改为
pwsh.exe -NoExit -Command "Set-Location -LiteralPath '%V'"
当然,前提是先安装新版 powershell ,且加入到环境变量中。