参数属性以某种方式更改powershell脚本输出?

时间:2014-03-04 22:43:16

标签: powershell snmp powershell-v3.0 net-snmp

我使用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命令没有问题,如前所述。它仍然有点奇怪,但我继续推进"延伸"。

1 个答案:

答案 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