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