我使用net-snmp扩展功能在查询特定的SNMP oid时能够运行powershell脚本。
snmpd配置为运行带有一些参数的get-storageinfo.ps1脚本。
net-snmp代理正在调用脚本:
& c:\scripting\get-storageinfo.ps1 -name somedevicename -detaillevel 2 -oid oidstring
但是,当我在get-storageinfo.ps1脚本中的参数定义中添加参数属性或CmdletBinding(或两者)时,事情就会中断。 我不明白为什么。 我把它放在我脚本的最顶端(实际上经过一些评论之后)。
[CmdletBinding()]
Param(
[string]$name,
[string]$detaillevel
[string]$oid
)
或者这个,同样的问题
Param(
[Parameter(Mandatory=$True)][string]$name,
[string]$detaillevel
[string]$oid
)
这会以某种方式破坏我的snmpd功能。当正在读取配置的OID时,我得到: "此OID"
目前不存在此类实例以下(只有这个)完美无缺,完全没有CmdletBinding和参数属性:
Param(
[string]$name,
[string]$detaillevel
[string]$oid
)
这会将值返回到net-snmp,就像它应该做的那样。 Net-SNMP(snmpd)非常适合运行脚本并在使用脚本时返回值而没有属性/ cmdletbinding。因此,我知道调用程序(snmpd)正确传递了参数。问题必须特定于属性或cmdletbinding。
关于net-snmp等外部程序输出的这两个声明之间可能存在什么差异?我无法弄清楚差异。
更新 我已经回归到"延伸"命令snmpd.conf而不是"传递"突击队。 pass命令没有一致的结果。我想我不太了解它的用法。 extend命令没有问题,如前所述。它仍然有点奇怪,但我继续推进"延伸"。
答案 0 :(得分:0)
这可能只是一个帖子错字,但你错过了分隔第二和第三个参数的逗号。
回答你原来的问题,答案是“不应该”。脚本的调用者可能以元编程方式操作脚本,即从磁盘读取文件并明确调用它。如果它正在期待,比如说'args'变量存在,它可能会失败,因为'args'变量没有填充在高级函数(CmdletBinding)中。我怀疑是这种情况。根据您发布的调用,我很想知道CmdletBinding属性如何影响输出。
NoCmdletBinding.ps1:
Param(
[string]$name,
[string]$detaillevel,
[string]$oid
)
"Has CmdletBinding: $(Test-Path Variable:\PsCmdlet)"
"name : $name"
"detaillevel : $detaillevel"
"oid : $oid"
"args.Count : $($args.Count)"
PS> & '.\NoCmdletBinding.ps1' -name somedevicename -detaillevel 2 -oid oidstring FourthArg
Has CmdletBinding: False
name : somedevicename
detaillevel : 2
oid : oidstring
args.Count : 1
CmdletBinding.ps1:
[CmdletBinding()]
Param(
[string]$name,
[string]$detaillevel,
[string]$oid
)
"Has CmdletBinding: $(Test-Path Variable:\PsCmdlet)"
"name : $name"
"detaillevel : $detaillevel"
"oid : $oid"
"args.Count : $($args.Count)"
# Passing a 4th arg to an advanced function throws an error
PS> & '.\CmdletBinding.ps1' -name somedevicename -detaillevel 2 -oid oidstring
Has CmdletBinding: True
name : somedevicename
detaillevel : 2
oid : oidstring
args.Count : 0