2014-03-04 53 views
4

我正在使用net-snmp擴展功能,以便能夠在查詢特定的SNMP oid時運行powershell腳本。做參數屬性以某種方式更改PowerShell腳本輸出?

snmpd被配置爲運行帶有一些參數的get-storageinfo.ps1腳本。

腳本被調用像這樣由net-snmp代理:

& c:\scripting\get-storageinfo.ps1 -name somedevicename -detaillevel 2 -oid oidstring 

然而,事情打破當我添加參數屬性或列出CmdletBinding(或兩者)在我的GET-storageinfo我的參數定義。 ps1腳本。 我不明白爲什麼。 我在我的腳本的最頂端(實際上有一些評論後)。

[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)非常適合運行腳本並返回值,而不使用屬性/ cmdlet綁定來使用腳本。正因爲如此,我知道調用程序(snmpd)正確地傳遞了參數。問題必須特定於屬性或cmdlet綁定。

這兩個聲明中有關輸出到net-snmp等外部程序的可能區別是什麼?我無法弄清楚差異。

UPDATE 我已經恢復回snmpd.conf的「extend」命令,而不是「pass」commando。 pass命令沒有一致的結果。我想我不明白它的用法。 如前所述,extend命令沒有問題。這有點奇怪,但我會繼續「延長」。

+0

你能不能給,你下載的net-snmp擴展功能的鏈接,和NET-SNMP Win32版本? – JPBlanc

+0

[來自此URL](http://sourceforge.net/projects/net-snmp/files/net-snmp%20binaries/5.7-binaries/)我已經下載了net-snmp-5.7.0-1.x86用於安裝Net-SNMP的.exe包 – JayST

+0

$ name包含OID?運行snmpd的計算機上安裝了哪個版本的PowerShell?您是否注意到32位服務啓動32位PowerShell版本的事實? – JPBlanc

回答

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