【问题标题】:Powershell Parameter passing issuePowershell 参数传递问题
【发布时间】: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


【解决方案1】:

你错过了一个论点。

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

    Write "$Variable"
}

【讨论】:

  • [Parameter(Mandatory=$True)][Parameter(Mandatory)] 相同。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多