14

-WhatIfのようなものについては、[CmdletBinding]属性によって私たちに$ PSCmdlet.ShouldProcess()が与えられています。 -Verbose、-Debug、-PassThruなどの共通のコマンドライン引数を実装するためのツールやプラクティスは他にもありますか?Powershell:標準のスイッチを実装する方法は?

答えて

14

Write-DebugおよびWrite-Verboseは、-Debugおよび-Verboseのパラメータを自動的に処理します。

-PassThruは、技術的に共通のパラメータではありませんが、あなたはそれが好きで実装できます。

function PassTest { 
    param(
     [switch] $PassThru 
    ) 
    process { 
     if($PassThru) {$_} 
    } 
} 

1..10|PassTest -PassThru 

そして、これは、コマンドレットにあなたの関数のパススルーの値を使用する例です:

function Add-ScriptProperty { 
    param(
     [string] $Name, 
     [ScriptBlock] $Value, 
     [switch] $PassThru 
    ) 
    process{ 
     # Use ":" to explicitly set the value on a switch parameter 
     $_| Add-Member -MemberType ScriptProperty -Name $Name -Value $Value ` 
      -PassThru:$PassThru 
    } 
} 

$calc = Start-Process calc -PassThru| 
     Add-ScriptProperty -Name SecondsOld ` 
      -Value {((Get-Date)-$this.StartTime).TotalSeconds} -PassThru 
sleep 5 
$calc.SecondsOld 

を持っています詳細についてはGet-Help about_CommonParametersをご覧ください。

+0

私はあなたが入力変数を保存し、何かをして、最後に保存された変数をパススルーしたいと思うかもしれません($ passthruの場合)。 – Matt

+2

はい、 'PassTest'は便利な機能ではありません。単に '-PassThru'をどのように実装できるかを示すためのほんの例です。さらに、入力変数で何かをすることもできますが、元の値を変更せずにパススルーすることもできます(例: '$ _。Kill(); if($ PassThru){$ _}')。 PassThruパラメータを使用して別のコマンドのPassThruを設定するという非trivalの例を追加しました。 – Rynant