近期某人更新了 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 ,且加入到环境变量中。

枯死的灌木!