无法通过注册表正确调用PowerShell脚本。找不到接受参数'$NULL'的位置参数 [英] Can't call a Powershell script through the registry properly. A positional parameter cannot be found that accepts argument '$null'

查看:11
本文介绍了无法通过注册表正确调用PowerShell脚本。找不到接受参数'$NULL'的位置参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里有一个简单的测试函数,名为RegistryBoundParams.ps1

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $Target,

    [Parameter(Mandatory = $false)]
    [switch]
    $MySwitch
)

if(!(Test-IsAdmin)){
    Request-AdminRights -NoExit
    Exit
}

if($MySwitch){
    "Do something" | Out-Host
}else {
    "Do something else" | Out-Host
}

Show-AllArguments

如果我通过PS终端调用,一切正常:

准确调用:C:Toolsscripts> .RegistryBoundParams.ps1 -Target "C:Test" -MySwitch

如果我通过注册表调用它(将该命令添加到上下文菜单),我会得到:

pwsh -noexit -file "C:ToolsscriptsRegistryBoundParams.ps1" -Target "C:Program FilesPython39python.exe" -MySwitch

错误明文:RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

下面是一个reg文件,它准确地显示了我在注册表中添加的内容:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT*shell1_TestRegistry]
@="Test Powershell Script from Registry"
"Icon"="C:\Tools\icons\apps\Powershell 1.ico,0"
"NeverDefault"=""

[HKEY_CLASSES_ROOT*shell1_TestRegistrycommand]
@="pwsh -noexit -file "C:\Tools\scripts\RegistryBoundParams.ps1" -Target "C:\Program Files\Python39\python.exe""

因此,正在将$Null传递给脚本,而我不知道原因。

我真的真的需要一些帮助。

非常感谢您的指导。

编辑:


我发现,如果我添加一个名为$catchall的新字符串变量,脚本就能正常工作。我怀疑,当从注册表调用它时,出于某种原因,它附加了一个空值。这就是为什么当我定义一个附加的";捕获";变量时,该脚本会起作用。

这绝对不是一个理想的解决方案,所以我仍然在这里寻找解决方案。非常感谢您的帮助!

编辑2:


事实证明,我正在使用的Request-AdminRights脚本(即mkelement0)有一个错误,现在已经修复。任何想要使用绑定/非绑定参数支持单行自我提升的人都可以跨平台...go get it!

推荐答案

问题是您的自提升函数所基于的代码中的错误(已修复)Request-AdminRights

错误在于,对于像您这样的高级脚本,$args--在高级脚本中从不绑定--被错误地序列化为$null,而不是转换为@(),从而导致$null在重新调用时作为额外参数传递。

如果您基于original answer中的Ensure-Elevated函数的现在更新的主体重新定义Request-AdminRights函数,您的问题应该会消失-不需要修改所包含的脚本。

这篇关于无法通过注册表正确调用PowerShell脚本。找不到接受参数'$NULL'的位置参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆