【发布时间】:2017-12-05 00:46:32
【问题描述】:
我有一个奇怪的问题,我搜索了现有的 Q&A 并没有找到匹配项。 我已经使用基本格式的参数验证编写了我的函数
function FunctioName
{
[CmdletBinding()]
Param(
[parameter(Mandatory)]
[String]$VariableName
)
当我如上所述将参数设置为强制时,我得到一个参数绑定异常,表明传递了一个空值。在调试中运行脚本我可以看到传递的函数参数不是空的,而是一个有效的字符串。 当我在没有强制标志的情况下以完全相同的方式运行脚本时,字符串被传递到函数中并正确执行。 有没有人有任何想法,可能是什么问题。这个问题正在影响我的应用程序中的许多函数,有趣的是,受影响的函数似乎都只有一个参数,多个参数的函数似乎没有受到影响。
好的,谢谢大家的反馈,非常感谢。顺便说一句,我正在使用 powershell 5 。 对于这个问题,进一步调查我发现该变量作为字符串数组传递给函数,但是一个空字符串值被附加到数组中,我认为这是导致问题的原因。这是它开始变得有趣的地方,我需要提供更多背景知识。
我正在运行的脚本查询活动目录中满足特定条件的用户属性,那些匹配的我创建一个字符串数组,每个值都是用户、主机名和其他属性属性的分隔值。 为了确保获得最新值,我使用了 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'] 等键值访问值,但我可以使用$哈希表.key。我知道这很奇怪,我想不出它会是什么
有没有其他人遇到过类似的问题。
【问题讨论】:
-
需要更多信息。无法复制。
-
FunctioName -VariableName ([string]::Empty)会失败,尽管([string]::Empty)是一个有效 字符串并且([string]::Empty) -eq $null返回false。似乎$VariableName参数 mandatory 使用[string]::IsNullOrEmpty($VariableName)之类的东西进行测试,因为[string]::IsNullOrEmpty([string]::Empty)返回true。 -
您能否提供您尝试在其中运行它的 PowerShell 版本?
$PSVersionTable应该给你。我相信短语法[Parameter(Mandatory)]在 PS v3 之前无效,所以如果你在 PS v2 中,你需要使用[Parameter(Mandatory=$true)]。 -
查看您调用函数的方式以及您提供的输入的示例也会很有帮助,以便我们尝试重现。
标签: powershell