2017-07-01 59 views
0

我有一個奇怪的一個我已經搜索現有的Q & A和還沒有找到一個匹配。 我一直在使用的基本格式PowerShell的參數傳遞問題

function FunctioName 
{ 
    [CmdletBinding()] 
    Param(
    [parameter(Mandatory)] 
    [String]$VariableName 
    ) 

當我設置的參數,以強制如上我收到一條空值的參數綁定異常被傳遞使用的參數驗證寫好了功能。在調試中運行腳本我可以看到被傳遞的函數參數不是null,並且是有效的字符串。 當我以完全相同的方式運行腳本而沒有強制標誌時,字符串被傳遞給函數並且它正確執行。 有沒有人有任何想法,可能是什麼問題。這個問題正在影響我的應用程序中的一些函數,有趣的是,似乎受影響的函數都只有一個參數,具有多個參數的函數似乎沒有受到影響。

好,謝謝你們的寶貴意見的大加讚賞。順便說一句,我正在使用PowerShell 5。 繼續深入研究問題,我發現變量被作爲字符串數組傳遞給函數,但是一個空字符串值被添加到數組中,我認爲這是問題的原因。這是它開始變得有趣的地方,我需要給出更多的背景。

我運行Active Directory查詢用戶的腳本屬性滿足特定的條件,那些匹配創建一個字符串數組,每個值的用戶,主機名和其他屬性的屬性的分隔值,該值。 爲了確保我獲得最新的值,我使用ASDI GetInfo方法,這似乎觸發了奇怪的行爲。

在高級別上的功能是

Function GetuserAttr 
{ 
    $inscopeusers = New-Object System.Collections.ArrayList 
    $accountlist = (Get-ADUser -Filter { attribute1 -eq "value"} -Properties attribute1).SamAccountName 

foreach ($user in $accountlist) 
{ 
    $DN = getDN($user) # basically a funtion I wrote to create ASDI object for user account. 
    $DN.GetInfo() # this method call appears to cause issues 
    $attr1 = $DN.Get("Attribute1") 
    $attr2 = $DN.Get("Attribute2") 
    $hoststring = "$($user)|$($attr1)|$($attr2)" 
    $inscopeusers.Add($hoststring) > null 
} 
return $inscopeusers 
} 

陣列在此函數返回的字符串被饋送到一些其他的功能,其中之一是,正在給我原先提出了錯誤的一個。 當我使用GetInfo方法時,這個函數返回的數組在數組中包含多個空值,當我刪除該命令時數組沒有空字符串。 當我在其他函數的數組上操作時,更奇怪的是,當使用GetInfo方法時,數組似乎失去了它的一些屬性。因此,例如我能夠使用foreach循環遍歷數組值,但我不能通過像$ array [1]這樣的索引來訪問數組值。 通過簡單地註釋掉函數中的GetInfo方法調用,返回的數組似乎正常工作,您可以通過索引訪問數組值。

我有另一個函數也使用GetInfo並返回一個哈希表,當我嘗試對返回的哈希表進行操作時,我無法使用$ hashtable ['key']等鍵值訪問值,但是我可以訪問它們使用$ hashtable.key。我知道這是很奇怪的,並不能真正認爲這可能是什麼

是否有任何一個人都經歷了類似的問題。

+2

需要更多的信息。不能Repro。 – Jaykul

+0

'FunctioName -VariableName([string] :: Empty)'雖然'([string] :: Empty)將會失敗,但它是一個_valid_字符串和'([string] :: Empty)-eq $ null'返回'false' 。看起來''VariableName'參數_mandatory_被用'[string] :: IsNullOrEmpty($ VariableName)''作爲'[string] :: IsNullOrEmpty([string] :: Empty)''返回'true'來測試。 – JosefZ

+1

你能提供你試圖運行它的PowerShell版本嗎? '$ PSVersionTable'應該給你。我相信短語法[[Parameter(Mandatory)]'在PS v3之前是無效的,所以如果你在PS v2中,你需要使用'[Parameter(Mandatory = $ true)]'。 – beavel

回答

0

你錯過了一個參數。

Function Test 
{ 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$True)] 
     [String] 
     $Variable 
    ) 

    Write "$Variable" 
} 
+1

'[Parameter(Mandatory = $ True)]'與[Parameter(Mandatory)]'相同。 – JosefZ