web-dev-qa-db-ja.com

詳細な出力でPowerShellスクリプトを実行する方法は?

PowerShellスクリプトを実行して、スクリプトの各行のコマンドと出力の両方を印刷する方法があるかどうか疑問に思っています。たとえば、Bashではbash -x myscriptと書くか、スクリプトの先頭にset -xを配置します。バッチでは、従来スクリプトの上部に残っていた@echo offを省略します。 PowerShellにはこれらのコンストラクトに相当するものがありますか?

私が試したもの:powershell -? | sls verboseを実行しましたが、何も見つかりませんでした。

15
James Ko

@JamesKoを見せてください。間違った質問をすると、間違った答えが得られます:-(。(a)Linuxの露出不足と(b)用語の使用に基づいて、ここに誠実な答えを出す人がいます。 verbose。以下では、このトピックでLinuxがPowerShellとどのように関係するかを説明しますが、急いでいる場合は、最後に答えに自由にジャンプしてください:-)

背景

PowerShellでは、verboseには非常に具体的な意味があり、 PowerShellのmanページ はかなり曖昧です。

コマンドによって実行された操作に関する詳細情報を表示します。この情報は、トレースまたはトランザクションログの情報に似ています。このパラメーターは、コマンドが詳細メッセージを生成する場合にのみ機能します。

それはあなたが望むもののように聞こえます...しかし、それをset -xのLinuxドキュメントと比較してみましょう。これはあなたのLinuxのフレーバーに応じて、これかもしれません( man-pagesから事業 )...

シェルは、コマンドを展開した後、実行する前に、各コマンドのトレースを標準エラーに書き込みます。

またはこれ( gnu から)...

コマンド、ケースコマンド、選択コマンド、およびコマンドとその引数または関連するWordリストの算術演算について、展開後および実行前の単純なコマンドのトレースを出力します。

あなたの質問の最初の行はこれらに明確かつ簡潔に同意します。しかし、PowerShellの詳細は異なります。一言で言えば、冗長モードをオンにすると(-Verboseコマンドラインスイッチまたは$VerbosePreference変数を使用して)、冗長ストリームからコンソールへの出力が有効になります。 (Linuxがstdoutとstderrの2つのストリームを提供するように、PowerShellは出力ストリーム、エラーストリーム、警告ストリーム、冗長ストリーム、デバッグストリームの複数のストリームを提供します。これらのストリームはLinuxと同じように操作できます。 commands 4>&1などを使用して、たとえば詳細なストリームを標準出力にマージします(PowerShellの複数の出力ストリームの詳細については、 PowerShell One-のBasic Writing Streamsセクションを参照してください。ライナー:データへのアクセス、処理、および書き込み および適切なクイックリファレンスは、 PowerShell句読点の完全ガイド です。)

答え

Set-PSDebug コマンドは、bashと同等のトレースを提供します。 -Traceパラメーターを使用して、トレースの詳細を調整することもできます。まず、Set-PSDebugを使用する前のコントロールを示します。

PS> Get-PSDepth
0

1の値を使用すると、実行時にコードの各行が取得されます。例:

PS> Set-PSDebug -Trace 1
PS> Get-PSDepth
DEBUG:    1+  >>>> Get-PSDepth
DEBUG:  141+  >>>> {
DEBUG:  142+   >>>> $nest = -1
DEBUG:  143+   >>>> $thisId = $pid
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  145+    >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG:  146+    >>>> $nest++
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  148+   >>>> $nest
0
DEBUG:  149+  >>>> }

2の値を使用すると、変数の割り当てとコードパスも取得できます。

PS> Set-PSDebug -Trace 2
PS> Get-PSDepth
DEBUG:    1+  >>>> Get-PSDepth
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:  141+  >>>> {
DEBUG:     ! CALL function 'Get-PSDepth'  (defined in file 'C:\Users\msorens\Documents\WindowsPowerShell\profile.ps1')
DEBUG:  142+   >>>> $nest = -1
DEBUG:     ! SET $nest = '-1'.
DEBUG:  143+   >>>> $thisId = $pid
DEBUG:     ! SET $thisId = '9872'.
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  145+    >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG:     ! SET $thisId = '10548'.
DEBUG:  146+    >>>> $nest++
DEBUG:     ! SET $nest = '0'.
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  148+   >>>> $nest
0
DEBUG:  149+  >>>> }

これらは、私が書いたGet-PSDepthという簡単なコマンドレットのトレースです。 DEBUGプレフィックス付きのコマンド、割り当てなどを、実際の出力(この場合は0のみを含む単一行)と混合して出力します。

23
Michael Sorens

スクリプトでは常に以下を使用できます。

$ VerbosePreference = "Continue"

注:昇格モードでシェルを開く必要があります。

以下のスクリーンショットは参照用です。

$VerbosePreference

それが役に立てば幸い。

14
Ranadip Dutta

実際、これはすべてのPowerShell CMDLETにVerboseタグが組み込まれているため非常に簡単です。たとえば、あなたがしなければならないこと:

Test-Connection -ComputerName www.google.com -Verbose

それだ。これが役立つことを願っています

1

スクリプトで詳細な書き込みを使用している場合、これは自動的に行われますが、

ただし、関数から詳細な出力を手動で記述する必要がある場合は、各関数が詳細フラグで呼び出されることを手動で確認する必要があります。これは、関数内から$ PSCmdlet.MyInvocation.BoundParameters ["Verbose"]をチェックすることで実行できます。

0
Steve Rathbone