2017-07-03 19 views
1

スクリプトブロック内に追加機能の機能Begin, Process, Endを使用することはできますか?例えばスクリプトブロックでBegin、Process、Endを使用する

私は、次のスクリプトブロックしました:私は、私がブロックを変更するスクリプトブロックの詳細出力を制御できるようにしたいので

$startStopService = { 
Param(
    [bool] $startService)  

    if ($startService){ 
    ... 
    Start-Service "My-Service" 
    } 
    else { 
    Stop-Service "My-Service" 
    } 
} 

を:

$startStopService = { 
Param(
    [bool] $startService)  

    Begin { 
    $oldPreference = $VerbosePreference 
    $VerbosePreference = $Using:VerbosePreference 
    } 
    Process { 
    if ($startService){ 
     ... 
     Start-Service "My-Service" 
    } 
    else { 
     Stop-Service "My-Service" 
    } 
    } 
    End { 
    # Restore the old preference 
    $VerbosePreference = $oldPreference 
    } 
} 

scriptblockはコマンドレットではありませんが、ここではBegin, Process, Endを使用できますか?エラーが発生したかどうかにかかわらず、VerbosePreferenceが古い値に復元されることを望みます。もちろん、try{}finally{}を使用することもできますが、Begin, Process, Endはより直感的です。

Thxを

答えて

3

about_script_blocksで説明したようにそれは、可能です:関数のように

、スクリプトブロックはDynamicParam、開始し、 プロセス、およびエンドキーワードを含めることができます。詳細については、about_Functions およびabout_Functions_Advancedを参照してください。これをテストするには


、私はあなたのスクリプトブロックを変更し、これを実行しました:

$startStopService = { 
Param(
    # a bool needs $true or $false passed AFAIK 
    # A switch is $true if specified, $false if not included 
    [switch] $startService 
)  

    Begin { 
    $oldPreference = $VerbosePreference 
    Write-Output "Setting VerbosePreference to Continue" 

    # $Using:VerbosePreference gave me an error 
    $VerbosePreference = "Continue" 
    } 
    Process { 
    if ($startService){ 
     Write-Verbose "Service was started" 
    } 
    else { 
     Write-Verbose "Service was not started" 
    } 
    } 
    End { 
    # Restore the old preference 
    Write-Output "Setting VerbosePreference back to $oldPreference" 
    $VerbosePreference = $oldPreference 
    } 

} 

Write-Verbose "This message will not print if VerbosePreference is the default SilentlyContinue" 

. $startStopService -startService 

Write-Verbose "This message will not print if VerbosePreference is the default SilentlyContinue" 

何の機能あなたは後にしていますか?スクリプトブロックを実行しているが、スクリプトの残りの部分で$VerbosePreferenceを変更しないときは、詳細メッセージを印刷したい場合、[CmdletBinding()]-Verboseフラグ使用することを検討:

$startStopService = { 
    [CmdLetBinding()] 
    Param(
     [switch] $startService 
    ) 

    Write-Verbose "This is a verbose message" 

} 
Write-Verbose "This message will not print if VerbosePreference is the default SilentlyContinue" 

. $startStopService -verbose 

Write-Verbose "This message will not print if VerbosePreference is the default SilentlyContinue" 

編集を - Invoke-Commandコマンド

コメントの後、私はInvoke-Commandの機能を探しています。そして、うまくいかないことがたくさんありました。 あなたは$VerbosePreference = "Continue"をスクリプトブロック内に宣言することができ、これはスクリプトブロックの範囲に限定されます。後で元に戻す必要はありません。 Invoke-Command-VerboseスイッチCommonParameterを渡そうとし

$startStopService = { 
    [CmdLetBinding()] 
    Param(
     [parameter(Position=0)] 
     [switch]$startStopService, 

     [parameter(Position=1)] 
     [switch]$Verbose 
    ) 

    if($Verbose){ 
     $VerbosePreference = "Continue" 
    } 

    Write-Verbose "This is a verbose message" 

} 

Write-output "VerbosePreference: $VerbosePreference" 
Write-Verbose "This message will not print if VerbosePreference is the default SilentlyContinue" 

Invoke-Command -Scriptblock $startStopService -ArgumentList ($true,$true) 

Write-output "VerbosePreference: $VerbosePreference" 
Write-Verbose "This message will not print if VerbosePreference is the default SilentlyContinue" 

には、外出先ではなかったです。これは、$true/$false(または省略)を渡して冗長出力を制御できる標準のVerboseスイッチパラメータを使用します。

関連:
about_Functions
about_Functions_Advanced

+1

を私はあなたの答え( 'CmdletBinding')の第二の選択肢を探していました。簡単な質問: 'CmdletBinding'も' Invoke-Command'でも動作しますか? 'Invoke-Command -session $ remoteSession -scriptblock $ startStopService -verbose'としましょう。 – Moerwald

+0

@Moerwald短いバージョンでは、ドキュメントの[[CommonParameters]] '(https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell)に準拠する必要があります。コア/呼び出しコマンド)。しかし、私はそれを試してみるとうまくいきません。検索しましたが、あなたは既に読んでいる[this post](https://stackoverflow.com/questions/16197021/how-to-write-verbose-from-invoke-command)を見つけました。これはこれをバグと言います。それが事実かどうか、または私たちがやっているやり方に間違いがあるかどうかはわかりません。 – gms0ulman

+0

答えのためのThx。はい、投稿を読んだことがあります。それは約3歳なので、私はそれの周りに良い方法があるかもしれないと思った。 – Moerwald

関連する問題