簡體   English   中英

編寫Powershell函數,可以使用管道輸入和“常規”輸入來調用

[英]Write Powershell function, that can be called with pipeline input AND “normal” input"

我有一個簡單的功能:

    function Write-Log {
        [CmdletBinding()]
        param (
            # Lines to log
            [Parameter(Mandatory , ValueFromPipeline )]
            [AllowEmptyString()]
            $messages
        )

        process {
            Write-Host $_ 
        }
    }

基於ValueFromPipeline ,可以將函數與管道輸入配合使用,例如

 "a","b", "c" | Write-Log
 a
 b
 c

沒關系。 但是,如果我想以這種方式使用函數:

 Write-Log -message "a", "b", "c"

自動$_變量為空,不打印任何內容。

我還發現了這兩個stackoverflow鏈接:

他們兩個都建議以下模式:

  function Write-Log {
        [CmdletBinding()]
        param (
            # Lines to log
            [Parameter(Mandatory , ValueFromPipeline )]
            [AllowEmptyString()]
            $messages
        )

        process {
            foreach ($message in $messages){
                Write-Host $message
            }
        }
    }

上面的模式適用於我的用例。 但是從我的角度來看,在“ process”塊中調用foreach感覺很奇怪,因為(據我所知)對於每個管道項目都調用了process塊。 是否存在更好的更干凈的方式來編寫支持兩個用例的函數?

謝謝。

如果要將數組傳遞給類似這樣的參數,就必須這樣做

Write-Log -Messages a,b,c  

否則你只能做

Write-Log -Messages a

您仍然可以在不使用foreach的情況下通過管道傳遞數組:

Echo a b c | Write-Log

我感謝cmdlet可以同時執行這兩項操作,例如get-process。

暫無
暫無

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

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