PowerShellのtrapの例外処理について

このQ&Aのポイント
  • PowerShellのtrapを使用して例外処理を行う方法について説明します。
  • 「test1.ps1」と「test2.ps1」というスクリプトを比較して、なぜ「test1.ps1」ではtrapに遷移しないのか、また「test2.ps1」ではtrapに遷移するのかについて解説します。
  • また、「trap」はコマンドレットで発生したエラーをハンドリングするためのものであり、具体的な処理が必要ですが、関数の場合はtrapが設定されているためハンドリングされます。
回答を見る
  • ベストアンサー

PowerShellのtrapの例外処理について

初歩的な質問ですが、PowerShellのtrapの例外処理ついて教えて下さい。 以下のようなスクリプトがあります。 ------------------------------------------------- test1.ps1 trap [Exception] { echo "trap!!" } 5/0 echo "go go" ------------------------------------------------- test2.ps1 trap [Exception] { echo "trap!!" } function fun($num) { 5/$num } fun 0 echo "go go" test1.ps1はtrapに遷移しないのですが、test2.ps1はtrapに遷移します。 どうしてなのでしょうか。 コマンドレットでエラーが発生した場合ののエラーハンドリングであって 「5/0」のような処理はコマンドレットでのエラーではないのでハンドリング されないのでしょうか。 では、なぜ、関数するとハンドリングされるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • heburusu
  • ベストアンサー率85% (140/164)
回答No.1

PowerShellのコンパイル時に定数畳み込みが行われるためのようですね。 >PowerShellの処理系では定数式のたたき込みを行っていて、 >定数式はコンパイル時に1度だけ評価される。 >式「1 / 0」は定数式なのでコンパイル時に評価され、ゼロ除算の例外が発生する。 >しかしtrap文はあくまで実行時の例外を捕捉するものだ。

参考URL:
http://d.hatena.ne.jp/eel3/20130609/1370780140
abc999xyz
質問者

お礼

ありがとうございます。 説明と参考urlありがとございます。 すると、functionにするということは、 functionが呼ばれたときの実行時の例外ということで trapに遷移するということでしょうか。

関連するQ&A

  • PowerShellからPowerShellを呼び出す方法

    PowerShellからPowerShellを呼び出す方法 次のバッチファイルと同等の事をPowerShellで行う方法を教えて下さい。 下記のような非常に簡易的なバッチファイルがあるとします。 ■ aaa.bat ■ echo test ■ aaa.bat ■ ■ bbb.bat ■ aaa.bat > aaa.log ■ bbb.bat ■ ■ コマンドプロンプト ■ cmd> aaa.bat ・・・ 下に「test」と出力される test cmd> bbb.bat ・・・ ファイルaaa.logに「test」と出力される ■ コマンドプロンプト ■ 同じ事をPowerShellでするとすれば ■ aaa.ps1 ■ echo "test" ■ aaa.ps1 ■ ■ PowerShellの画面から ■ PS > ./aaa.ps1 ・・・ 下に「test」と出力される test PS > ./bbb.ps1 ・・・ ファイルaaa.logに「test」と出力される ■ PowerShellの画面から ■ この時の「bbb.ps1」はどのようになりますか?

  • PowerShellで処理を簡単にしたい

    PowerShellは、ど素人です。 PowershellであるPs1ファイルを実行するのに 現在下記の手順で行っています。 1)PowerShellを管理者権限で実行 2)以下のコマンドを最初に実行 powershell set-executionPolicy remoteSigned 3)次に以下のコマンドを実行 powershell -File C:\Users\Mic\Desktop\Keep\sample.ps1 毎回、2),3)をPowerShellの画面にコピペして処理しています。 もう少し簡単な手順になれば嬉しいのですが、 1),2),3)を一つのBATで処理するような方法はありませんか ? BATに限らず手順が減るような方法があれば教えてください。

  • phpの例外処理がエラーをトラップしてくれない。

    以下のように例外処理を記述しした場合、 try{ //ここでエラー } catch (Exception $e){ $ErrorMsg="その他エラー:".$e->getMessage(); } tryの中で、0除算によるエラーが発生してもエラーをトラップして、例外 処理のcatchに飛びません。 どのように記述すればエラーをトラップできるのでしょか?

    • ベストアンサー
    • PHP
  • シェルスクリプト trap処理につきまして

    シェルスクリプトを作成しておりますが、 正常に動作しないので、ご教授いただけますでしょうか。 以下、作成したスクリプトを記載いたします。 #!/bin/sh trap "echo 'stopped'" 1 2 3 15 echo start sleep 10 echo end 上記のようなスクリプトを作成し、trap処理のテストを 行いたいのですが、上記スクリプト実行中で 「Ctrl+C」を押して、処理を止めても trap処理の「stopped」が表示されません。 スクリプトが処理が終わり、 コマンド入力できるようになったところで、「Ctrl+C」を押すと 「stopped」が表示されます。 スクリプト内で処理を止めた場合に「stopped」を表示させることが出来ず、困っております。 どなたかご教授いただけますでしょうか。 宜しくお願い致します。

  • PowerShellのルールについて

    PowerShellのルールについて PwoerShellのコマンドレットから以下の構文を実行すると、 エラーなしで実行できますが、ISEの方から実行するとエラー となってしまいます。 この違いはなんなのでしょうか? コマンドレットから実行 >funcion test { return $input } >1..4 | test 1 2 3 4 またコマンドレットからget-chikdItem Function:を 実行すると、定義済みの関数としてtestがでてきます。 ISEから実行すると > function test {retrun $input } > 1..4 | test 用語 'retrun' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認 してから、再試行してください。 発生場所 行:1 文字:22 + function test {retrun <<<< $input } + CategoryInfo : ObjectNotFound: (retrun:String) []、CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException となります。また、ISEからget-childitem Function:で確認すると、 testという関数は出てきません。 コマンドレットとISEは一体どういう関係なのでしょうか??

  • シェルスクリプト trap処理の流れにつきまして

    シェルスクリプト作成しておりますが、 trap処理について質問がありますので、ご教授お願い致します。 以下、テストしたいと思っているスクリプトを記載いたします。 #!/bin/sh trap "echo 'stopped'" 1 2 3 15 echo start > test1.txt sleep 100 echo end > test1.txt 上記スクリプトを実行し、Ctrl+cもしくは、 kill -15 でスクリプトを削除した場合、 sleep中にスクリプト中断していると思うのですが、 end文字列がtest1.txtに書き込まれてしまいます。 trapが処理される流れというのは、どのような流れなのでしょうか。 また途中で中断しているのであれば、途中で以下処理を 行なわないようにするにはどうすればよろしいでしょうか。 宜しくお願いいたします。

  • PowerShellのスクリプト実行について

    PowerShellのスクリプト実行について PowerShellの勉強をしていますが、スクリプトを実行できません。。。 なんか、スクリプトの環境変数を設定するようですが、どこにも 設定方法がないです。。。。 もちろん、Set-ExecutionPolicy Unrestrictedは実行してあります。 以下日付と時間を表示するだけのスクリプトです。 ---------test.ps1--------- get-date get-time ---------------------------- スクリプトファイルの置き場所 ⇒ C:\script-test\test.ps1 ちなみに、スクリプトファイルを置いたディレクトリに移動して 実行しても、以下のようなメッセージが出て実行できませんでした。。 用語 'C:\script-test' は、コマンドレット、関数、スクリプト ファイル、または操作 可能なプログラムの名前として認識されません。名前が正しく記述されていることを確 認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく ださい。 発生場所 行:1 文字:15 + C:\script-test <<<< .\test.ps1 + CategoryInfo : ObjectNotFound: (C:\script-test:String) []、Comma ndNotFoundException + FullyQualifiedErrorId : CommandNotFoundException どなたかご教授下さい。

  • PHPの例外処理

    PHPの例外処理について教えてください function test() {   try{    $a = 10;    $b = 0;    $result = $a/$b;   }   catch(Exception $e){    //エラー処理   } } 上記でcatchが実行されるためにはどのようにすれば良いでしょうか?例えば if($b == 0) {   throw new Exception('例外'); } を「$result = $a/$b;」の前に書いておくなどすればcatchされるのはわかりますが、 想定されるすべての例外のthrow処理を記載するなんてことはしたくありません。 実行してエラーだったら自動的にthrowされる、なんていうことはPHPでは無理でしょうか?

    • ベストアンサー
    • PHP
  • ORACLE PL/SQLの例外処理について

    ストアドプロシージャを登録したところ、「EXCEPTION」キーワードをORACLEが 認識してくれずエラーが返ってきました。どうしてか教えて下さい。 よろしくお願いします プロシージャのコード) CREATE OR REPLACE PRCEDURE TEST_PROC( P1 OUT NUMBER, P2 OUT VARCHAR2 ) AS BEGIN UPDATE VIEW経理システム制御F SET 処理状況 = ''; COMMIT; EXCEPTION WHEN OTHERS THEN P1 := SQLCODE; P2 := SQLERRM; END; / 登録時のメッセージ) エラー行: 1: エラーが発生しました。 ORA-00922: オプション指定されていないか、または無効です 不明なコマンドです(開始"EXCEPTION ...")。行の残りは無視されました。 不明なコマンドです(開始"P1 := SQLC...")。行の残りは無視されました。 不明なコマンドです(開始"P2 := SQLE...")。行の残りは無視されました。 不明なコマンドです("END")。行の残りは無視されました。

  • Powershell プロセス二重起動

    PowerShell初心者です。 自身で起動中のスクリプトと同じコマンドで実行しているプロセスを検知し、他方のプロセスをkillしようと考えております。要は二重起動のチェックをしたいです。 現在コマンドラインで確認しているのですがどうもうまくいきません。 やろうとしている操作は以下です。 (1)ファイルにプロセス情報を出力。 PS C:\> $tempfile = "C:\pswork\servicemon\temp.log" PS C:\> Get-WmiObject win32_process ` | select Name, ProcessId, CommandLine ` | sort Name ` | Format-Table -AutoSize ` | Out-File -FilePath $tempfile -width 1000 (2)自分のPID以外のプロセス情報を取得 PS C:\> $mypid = $PID PS C:\> $killpidtmp = Get-Content $tempfile | Select-String -Pattern ".*powershell.exe.*svmon131_loop.*" |Select-String -NotMatch -Pattern "\s$mypid\s" PS C:\> echo $killpidtmp powershell.exe 2024 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command C:\pswork\servicemon\svmon131_loop.ps1 (3)splitでプロセス番号のみを取得。 PS C:\> $killpid = echo $killpidtmp |% {$($_-split(" "))[1]} PS C:\> echo $killpid ★ここがうまく取得できません。空白しか取得できていません。 (4)最終的には取得したPIDでプロセスを終了。 PS C:\pswork\servicemon> Stop-Process -ID $killpid Bシェルで同様のスクリプトがあったので、それを参考にPowerShellで書こうとしているので、 そもそも無理があるのかもしれないかと考えています。 上記の方法でなくてもよいので、二重起動のチェックと該当プロセスの停止で参考となる情報があれば教えて頂きたいです。

専門家に質問してみよう