none
スクリプトで$errorの値を変数へと格納したい。 RRS feed

  • 質問

  • お世話になります。

    コンソール上で変数を格納する場合、
    $test = $error
    で$errorの値を$testへと格納できるのですが、.ps1ファイルに同様の記述をして
    実行しても$testに書き込まれません。

    書き込まれるためには何か条件があるのでしょうか。
    ご存知の方いらっしゃいましたらご教授お願いします。
    2009年4月2日 3:57

回答

  • どのようなスクリプトかわからないので、
    まとはずれかもですが・・・

    例外など terminating error が発生してスクリプトが途中で中断していませんか?
    trap を定義しているでしょうか。

    あるいはスクリプト終了後にスクリプト外で $test にアクセスしているとして
    変数スコープの問題でその $test は書きこまれた $test とは違う $test かもしれません。
    スクリプトはどうやって起動しているでしょう。
    すなおに起動するとスクリプト内の変数はコンソールからは見えません。
    ドットソーシングで
    . ./hoge.ps1
    などと起動するとスクリプト終了後も残存します。

    という2点が気になります。
    • 回答としてマーク 服部清次 2009年4月9日 1:37
    2009年4月2日 8:09
  • 自分の環境で、下記のようにして実験してみました。

    1)コンソール上でわざとエラーを発生させる。
      たとえば

    PS> a[Enter]<br/>
    
    用語 'a' は、コマンドレット、関数、操作可能なプログラム、またはスクリプト ファイルとして認識されません。
    
    用語を確認し、再試行してください。
    
    発生場所 行:1 文字:1
    
    + a <<<<
    
    
    
    

    この時点で 自動変数 $error には上記のエラーメッセージが格納されている。

    2) 下記スクリプトを test.ps1 として保存する
    $test = $error
    
    

    3)コンソールでスクリプトを実行する(kw-shingoさんが仰っているようにドットソーシングで実行)
    PS> . ./test.ps1
    
    

    4)$test 変数の内容を確認する
    PS> $test[Enter]
    
    

    上記手順で試したところ、$test変数にはきちんと $error の内容が代入されていました。


    kw-shingoさんが仰っているように、途中で中断しているために代入されていない可能性もありますので、可能であれば、ソースを公開してみてはいかがでしょうか?
    • 編集済み HIROsDotNetMVP 2009年4月2日 13:39 見づらかったので修正
    • 回答としてマーク 服部清次 2009年4月9日 1:37
    2009年4月2日 13:38

すべての返信

  • どのようなスクリプトかわからないので、
    まとはずれかもですが・・・

    例外など terminating error が発生してスクリプトが途中で中断していませんか?
    trap を定義しているでしょうか。

    あるいはスクリプト終了後にスクリプト外で $test にアクセスしているとして
    変数スコープの問題でその $test は書きこまれた $test とは違う $test かもしれません。
    スクリプトはどうやって起動しているでしょう。
    すなおに起動するとスクリプト内の変数はコンソールからは見えません。
    ドットソーシングで
    . ./hoge.ps1
    などと起動するとスクリプト終了後も残存します。

    という2点が気になります。
    • 回答としてマーク 服部清次 2009年4月9日 1:37
    2009年4月2日 8:09
  • 自分の環境で、下記のようにして実験してみました。

    1)コンソール上でわざとエラーを発生させる。
      たとえば

    PS> a[Enter]<br/>
    
    用語 'a' は、コマンドレット、関数、操作可能なプログラム、またはスクリプト ファイルとして認識されません。
    
    用語を確認し、再試行してください。
    
    発生場所 行:1 文字:1
    
    + a <<<<
    
    
    
    

    この時点で 自動変数 $error には上記のエラーメッセージが格納されている。

    2) 下記スクリプトを test.ps1 として保存する
    $test = $error
    
    

    3)コンソールでスクリプトを実行する(kw-shingoさんが仰っているようにドットソーシングで実行)
    PS> . ./test.ps1
    
    

    4)$test 変数の内容を確認する
    PS> $test[Enter]
    
    

    上記手順で試したところ、$test変数にはきちんと $error の内容が代入されていました。


    kw-shingoさんが仰っているように、途中で中断しているために代入されていない可能性もありますので、可能であれば、ソースを公開してみてはいかがでしょうか?
    • 編集済み HIROsDotNetMVP 2009年4月2日 13:39 見づらかったので修正
    • 回答としてマーク 服部清次 2009年4月9日 1:37
    2009年4月2日 13:38
  • kw-shingoさん、HIROsDotNetさん返信有難うございます。
    連絡が遅くなってしまい、大変申し訳ありませんでした。

    お二人の意見を参考に検証してみたところ、無事問題は解決しました。

    原因ですが、スクリプトを実行する際に「. ./test.ps1」では無く、「C:\test.ps1」で実行していたのが原因でした。
    まさにお二人の指摘どうりでした。

    曖昧な質問にもかかわらず、的確な指摘本当に有難うございました。

    2009年4月8日 5:53
  • kakiage さん、

    こんにちは!
    フォーラム オペレーターの服部 清次です。
    無事、問題が解決したとのことで何よりです!

    今回、kw-shingo さんと HIROsDotNet さんが提供してくださった情報が問題解決につながったとのことですので、私の方で、お二方の回答に [回答としてマーク] のチェックを付けさせていただきました。
    kakiage さんと同じ疑問を持たれた方がいらっしゃいましたら、ぜひこちらの情報を参照していただきたいと思いますので! (^^)

    また何か疑問や質問がありましたら、ぜひ TechNet フォーラムに投稿してください。
    これからも、よろしくお願いします。
    それでは、また! (^_^)/


    _____________________________________________
    マイクロソフト株式会社 フォーラム オペレーター 服部 清次

    2009年4月9日 1:43