2013-05-06 6 views
6

Write-Verboseコマンドレットをスクリプトと関数で使用したいと考えています。スクリプト(.ps1)ファイルでは正常に動作しますが、モジュール(.psm1)ファイルでは動作しません。コマンドレットはモジュールでは無視されます。次のスクリプト実行Write-VerboseがPowerShellモジュールで無視される

PS> .\scaffold.ps1 -verbose 

が生成されます

VERBOSE: starting foo 
path: c:\bar.txt 
[missing entry here - 'verbose path: c:\bar.txt'] 
VERBOSE: ending foo 

scaffold.ps1:

[cmdletbinding()] 
param() 

import-module Common -force 

write-verbose "starting foo" 

foo "c:\bar.txt" 

write-verbose "ending foo" 

Common.psm1:

function foo { 

    [cmdletbinding()] 
    Param(
    [string]$path 
) 

    write-host "path: $path" 
    write-verbose "verbose path: $path" 

} 
0123を

この時点でマニフェスト(.psd1)をモジュール(.psm1)に関連付けていません。

モジュール固有の構文が必要ですか?私は必要なもの

**編集**

-verboseフラグが.PS1ファイルに設定されている場合、私は.PSM1ファイルにそれを渡すことができるように決定する方法です。

scaffold.ps1:

[cmdletbinding()] 
param() 

import-module Common -force 

write-verbose "starting foo" 

foo "c:\bar.txt" $verbose_flag # pass verbose setting to module based on what was set on the script itself 

write-verbose "ending foo" 

答えて

4

答えここで見つける:How to properly use the -verbose and -debug parameters in custom cmdlet

scaffold.ps1:

[cmdletbinding()] 
param() 

import-module Common -force 

write-verbose "starting foo" 

foo "c:\bar.txt" -Verbose:($PSBoundParameters['Verbose'] -eq $true) 

write-verbose "ending foo" 
+0

共有ありがとうございます。これが働く唯一のものと思われることに同意する;しかし、それは悪いにおい...そのような機能の提案を持っている。 MS ConnectはPowerShell atmで無効になっているので、今すぐブログを開いてください:https://developer42.wordpress.com/2017/02/04/powershell-suggestion-simplify-write-verbose-in-modules/ – JohnLBevan

+0

アップデート: PowerShellのGitHubページの問題:https://github.com/PowerShell/PowerShell/issues/3106 – JohnLBevan

5

モジュール内のコマンドレットからWrite-Verbose出力を得るために、あなたは-verbose共通パラメータを使用する必要があります。あなたのコードを使用してhttp://technet.microsoft.com/en-us/magazine/ff677563.aspx

参照してください:

>import-module R:\Common.psm1 
>foo "c:\users" 
path: c:\users 
>foo "c:\users" -verbose 
path: c:\users 
VERBOSE: verbose path: c:\users 
+0

からダウンロードすることができます。私はそれを考えていないとは信じられません... – craig

+1

-verboseトグルの存在は、.ps1ファイル内の変数として利用可能になっていますか? 'foo" c:\ bar.txt "$ verbose"またはこれに類するもの? – craig

+0

私はドキュメントからは分かりません。なぜあなたはそれをテストする必要がありますか? 'Write-Verbose'だけを使用してください。' -verbose'が使用されていると、出力を生成します。そうでなければ、静かになります。 – alroc

3
ここでの問題は、呼び出し元のスコープ内の変数にはないということです

スクリプトモジュールのコードで取り上げられます。 "。\ scaffold.ps1 -verbose"を呼び出すと、scaffold.ps1のスクリプトスコープで$ VerbosePreferenceが 'Continue'に設定されます。そのスクリプトからコンパイルされたCmdletを呼び出すと、その$ VerbosePreference値が使用されますが、スクリプトモジュールから高度な関数を呼び出すと、その関数は呼び出されません。

私は最近、$ PSCmdletと$ ExecutionContext.SessionStateの組み合わせを使用して、適切な変数スコープを取得するために、呼び出し元から設定変数をインポートできる関数を作成しました。このコマンドの呼び出しは、スクリプトモジュールのエクスポートされた関数の先頭で、次のようになります。

Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState 

は、Get-CallerPreference機能が働いていたhttp://gallery.technet.microsoft.com/scriptcenter/Inherit-Preference-82343b9d

関連する問題