web-dev-qa-db-ja.com

エラーメッセージを読む前にPowershellウィンドウが消えます

Powershellスクリプトを呼び出すときに、呼び出されたスクリプトがコマンドウィンドウを閉じないようにする方法を教えてください。エラーが発生しているので、エラーを読み取ることができれば修正できると確信しています。

.NETクラスを使用して添付ファイル付きの電子メールを送信するPowershellスクリプトがあります。コマンドラインからスクリプトを実行するか、Windowsスケジューラからスクリプトを呼び出すことにより、スクリプトを直接呼び出すと、正常に動作します。別のスクリプト(IronPython、それが重要な場合)内から呼び出すと、失敗します。すべてのシナリオは、開発マシンで正常に機能します。 (「Works on My Machine」ロゴを取得する必要があります!)Powershellを呼び出してコマンドウィンドウを表示し、閉じる直前に赤のちらつきを確認できます。

申し訳ありません:Powershell 1.0、IronPython 1.1

解決策:powershell -noexit d:\ script\foo.ps1

-noexitスイッチは正常に機能しました。 IronPythonから渡す引数に追加しました。私が疑ったように、それはおそらく自分で修正できるものです(実行ポリシー、私は一時的に無制限に設定しましたが効果はありませんでしたので、もっと深く調べる必要があると思います)。問題が発生した場合は、別の質問をします。

助けてくれてありがとう。 powershellスイッチをもう少し詳しく調査する必要があることを学びました。また、将来役立つと思われる多くのことがわかります。

27
jadero

-noexitスイッチ:

powershell -noexit d:\script\foo.ps1
45
Shay Levy

基本的に、PowerShellコンソールウィンドウが閉じないようにするための3つのオプションがあり、それについて説明します ブログの投稿で詳しく説明します

  1. ワンタイムフィックス:PowerShellコンソールからスクリプトを実行するか、-NoExitスイッチを使用してPowerShellプロセスを起動します。例えばPowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
  2. スクリプトごとの修正:スクリプトファイルの最後に入力のプロンプトを追加します。例えばRead-Host -Prompt "Press Enter to exit"
  3. グローバル修正:レジストリキーを変更して、スクリプトの実行が終了した後、常にPowerShellコンソールウィンドウを開いたままにします。

オプション#3用に変更するレジストリキーは次のとおりです。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\powershell.exe\Shell\open\command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit \"& \\\"%1\\\"\""

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit \"-Command\" \"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & \\\"%1\\\"\""

my blog を参照し、これらのレジストリの変更を自動的に適用する.regファイルを参照してください。

22
deadlydog

以前はこれが必要でしたが、通常はスクリプトを変更したくありませんでした(通常、タスクスケジューラから起動されるスクリプトの場合)。コンソールに吐き出されたものを見たかっただけです。

必要なのは、スクリプト呼び出しの後にRead-Hostコマンドを追加するだけです(例:

PowerShell.exe -command { .\foo.ps1; read-Host "Press enter key to continue" }

ところで、Start-Transcriptの使用に関する問題は、EXE出力をキャプチャしないことです。また、標準ホストを使用したV1およびV2でのロギングの試行は、詳細、デバッグ、進行状況、または警告ストリームをキャプチャしません。これらは、関連するホストウィンドウを表示することによってのみ表示できます。

allスクリプト出力(stdout、stderr、verbose、warning、debug)をキャプチャする簡単で効果的な方法の1つは、cmd.exeなどの別のホストを使用することです:

cmd.exe /c powershell.exe "$pwd\foo.ps1" > foo.log
6
Keith Hill

Powershellには通常のTry ... Catch構造はありません。ただし、代わりに例外をトラップして適切に対応できます。 I.E:

Function Example() {
   trap [Exception] { 
      write-Host "We have an error!"; 
      write-error $("ERROR: " + $_.Exception.Message); 
      sleep 30;
      break; 
   }

write-Host "Hello world!";
throw "Something very bad has happened!";
}

Try ... Catch構造をシミュレートすることもできます。

Function Example2() {
 ${
   write-Host "Our try clause...";
   throw "...caused an exception! It hurts!";
 }

trap [Exception] {
  write-error $_.Exception.Message;
  sleep 30;
  continue;
}

もちろん、例外をトラップするとすぐに、エラーメッセージでログに記録したり、スリープ状態にしたり、必要なものを追加したりできます。私の例はスリープ状態であり、何が起こったのかを読むことができますが、すべてのエラーを記録する方がはるかに良いです。 (最も簡単な方法は>>でリダイレクトすることです)。

以下もご覧ください: http://huddledmasses.org/trap-exception-in-powershell/

2
juckobee

私の解決策は、コンソールウィンドウからコマンドラインでスクリプトを実行するの代わりにファイルを右クリックして-> powershellで実行する

スクリプトの実行が終了しても、コンソールにはエラーメッセージが表示され続けます。

1
Franz

次の3つのオプションがあります。

1
aronchick

迅速で汚い解決策は使用することです CTRL+S ディスプレイのスクロールを停止し、 CTRL+Q それを再開します。

1
Chris Oakey

さらにいくつかのアイデア...スクリプトの最後で start-sleep コマンドレットを使用して、エラーを確認するのに十分な時間を与えることができます。

start-transcript を使用して、セッションをテキストファイルに記録することもできます。

0
Mike Pfeiffer

を含むrun_ps_script.batファイルを作成します

@PowerShell.exe -command "try { %1 } finally { read-Host 'Press ENTER...' }"

PowerShell scripsを開くデフォルトのプログラムにします。

0

Stdoutとstderrをファイルexにリダイレクトすることを考えましたか?

./ascript.ps1> logs 2>&1

注:必要なすべてのリダイレクトを使用してPowerShellスクリプトを呼び出すラッパースクリプトをPowerShellで作成できます。

0
Piotr Czapla