3

所以,希望有人可以在这里帮助我。我过去一直在寻找解决方案,并且以前总能找到一些东西。但这似乎太奇怪了。

我有一个 PowerShell 函数可以有效地复制 New-ADUser Cmdlet,并且它接受多个参数以便执行此操作。此函数的大多数参数都将“ValueFromPipelineByPropertyName”参数属性设置为 True,这样我就可以将 CSV 和其他管道数据输入函数,而无需编写大量“if”和赋值语句。或者至少是这样的想法。

这是我的函数的一个示例(为了更好地说明这一点而缩小):

[CmdletBinding()]
Param(
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$FirstName,
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$LastName,
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$FullName
)

Process {
    if(-not $FullName) {
        $FullName = "$FirstName $LastName"
    }

    $user = "" | select FirstName,LastName,FullName
    $user.FirstName = $FirstName
    $user.LastName = $LastName
    $user.FullName = $FullName
    return $user
}

所以当我对 CSV 数据运行它时:

FirstName,LastName
Bob,Smith
Dick,Jones
Sami,Davis
Ray,Charles
Jane,Doe
Keith,Johnson
Ruth,Willson
Genni,Gartner

我得到:

FirstName                       LastName                        FullName
---------                       --------                        --------
Bob                             Smith                           Bob Smith
Dick                            Jones                           Bob Smith
Sami                            Davis                           Bob Smith
Ray                             Charles                         Bob Smith
Jane                            Doe                             Bob Smith
Keith                           Johnson                         Bob Smith
Ruth                            Willson                         Bob Smith
Genni                           Gartner                         Bob Smith

现在,我明白这里发生了什么。在管道输入或函数参数中没有指定 FullName 的值,因此我在流程语句中设置一个值以在该迭代中使用。问题是,它没有将 $FullName 变量“重置”回下一次循环迭代的空值未定义值,而是保留值集。

如果我更改 CSV 数据以明确定义 FullName 的“”值,问题就会消失。但是当管道数据没有定义属性时,这对我没有帮助。

我试图避免重新编码整个函数以使用不同的变量名或使用$_因为为了增加函数的复杂性,我还定义了参数别名,以便我们可以直接从 HR 程序的数据库中获取数据并通过管道传输它进入新的用户功能,而无需手动按摩数据。这也让我回到了无法在管道数据中添加空值参数的问题。

我知道我的解释有点啰嗦,但这种情况似乎是独一无二的(至少根据我在互联网上可以挖掘的内容)。

4

3 回答 3

1

也许这里的变量范围发生了一些棘手的事情?

您可以尝试Remove-Variable FullName在函数末尾添加 a ,看看是否有帮助。

我知道您不想使用不同的变量名,但这可能会使使用不同的变量在函数内存储“生成的”全名更清楚;希望范围不会那么混乱。

if(-not $FullName) {
    $GeneratedName = "$FirstName $LastName"
} else {
    $GeneratedName = $FullName
}
于 2012-11-09T19:48:02.593 回答
0

您需要设置 FullName 的默认值,所以下面的代码可以正常工作:

[CmdletBinding()]
Param(
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$FirstName,
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$LastName,
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$FullName=$null
)

Process {
    if(-not $FullName) {
        $FullName = "$FirstName $LastName"
    }

    $user = "" | select FirstName,LastName,FullName
    $user.FirstName = $FirstName
    $user.LastName = $LastName
    $user.FullName = $FullName
    return $user
}
于 2012-11-10T13:22:25.147 回答
0

为什么不简单地“重置”$fullname变量?

[CmdletBinding()]
Param(
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$FirstName,
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$LastName,
    [Parameter(ValueFromPipelineByPropertyName=$true)]
    [string]$FullName
)

Process {  
            if([string]::IsNullOrEmpty($FullName))
                {
                    $script:Fullname =  "$FirstName $LastName"
                }        

    $user = "" | select FirstName,LastName,FullName
    $user.FirstName = $FirstName
    $user.LastName = $LastName
    $user.FullName = $FullName
    $FullName= [string]::Empty
    $user
}
于 2012-11-09T20:34:21.840 回答