簡體   English   中英

PowerShell中管道輸入的問題

[英]Problems with pipeline input in PowerShell

所以,希望有人可以幫助我。 我過去一直在尋找解決方案,並且以前總能找到一些東西。 但這個似乎太奇怪了。

我有一個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的指定值,因此我在process語句中設置一個值以在該迭代中使用。 問題是,而不是$ FullName變量,然后“重置”回到下一個循環迭代的null未定義的值,它保持值集。

如果我更改CSV數據以明確定義FullName的“”值,則問題就會消失。 但是,當管道數據沒有定義屬性時,這對我沒有幫助。

我試圖避免重新編碼整個函數以使用不同的變量名或使用$ _因為為了增加函數的復雜性我還定義了參數別名,以便我們可以直接從我們的HR程序的數據庫獲取數據並管道它進入新的用戶功能而無需手動按摩數據。 這也讓我回到無法在管道數據中添加空值參數。

我知道我的解釋有點長,但這個場景似乎是獨一無二的(至少根據我可以在互聯網上挖掘的東西)。

這里的變量范圍有些棘手,可能嗎?

您可以嘗試在函數末尾添加一個Remove-Variable FullName ,看看是否有幫助。

我知道你不想使用不同的變量名,但這可以使用一個不同的變量來更清楚地將“生成的”全名存儲在函數中; 范圍將不那么混亂,希望如此。

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

為什么不簡單地'重置' $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
}

你需要設置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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM