none
Powershellを実行しないで実行時のエラーを検出したい。(構文チェック、文法チェック等) RRS feed

  • 質問

  • powershell dscを導入できない環境のため、powershellで、Infrastracture as Codeを導入したい、と考えています。

    powershellの文法チェックはどのようにして行えば、よいでしょうか?

    実施方法やコンパイラなどのツール等があれば教えて下さい。(OS標準機能でできればなおありがたいです。)

    なお、検証環境でサーバにログインして直接コマンドを実行して試す方法は避けたいと考えております。

    (検証環境は上記手順で実行する。本番環境はスクリプト実行する。では本番と検証で手順が異なるため。)

    つまり、ローカルPCなどでテストを実行→検証環境と本番環境でスクリプトを実行、という手順にしたいです。

    なお、pesterというツールを使ってみようとしましたが文法チェックはできないようです。

    また、フォーラム違いですが、もし同じことをバッチファイルやVBSで実施できるならその方法も教えていただけると

    ありがたいです。


    • 編集済み Hatimitu 2016年8月7日 10:50
    2016年8月6日 12:03

回答

  • チャブーンです。

    ほかの方々もおっしゃっていますが、静的解析と動的解析について、やはり峻別されたうえ複数のやり方で実現する、という方法になってしまうのではないか、と思います。

    ちょっと前提条件を把握していないのですが、まず、本番環境とほとんど同一に仕立てた検証環境でテストを走らせて、テストが通ったら本番環境にデプロイするというのが基本の流れではないでしょうか?

    ちょっとわかりづらいと思いますが、質問者さんのいう「検証環境」は本番環境へのリハーサル実施用のために用意されたもので、「エラーが起こる」こと自体が責任問題に遡及するから、ここでの実施前にエラーをつぶしたい、が背景と思っています。

    #試験環境での実施→総合試験/ローカルPCでの実施→単体試験、と考えた方がいいかもしれないですね

    これに対するひとまずの答えですが、端的にいうと「自由に調整・リストアできる『検証前環境』」をご自身で用意するのが簡単かと思います。できるだけ試験・本番環境と同じ構成の仮想マシンを用意することで、一般的に実現できます。Windows 8以降であれば、Hyper-Vクライアントで自身のコンピュータ上でサーバOS等を展開できます。

    この環境でスクリプトを実際に実行すれば、事前のエラーをつぶすことができます。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。



    2016年8月8日 5:59

すべての返信

  • 初期化されていない変数への読み込みといった最低限の機能ではありますが、Set-StrictModeコマンドを事前に行うことによりエラーとして検出することができます。

    Set-StrictMode
    https://technet.microsoft.com/ja-jp/library/hh849692.aspx?f=255&MSPPError=-2147217396

    2016年8月6日 13:08
  • やきさん。

    早々に回答ありがとうございます。

    このコマンドで動作確認は相当厳しいですし、スクリプトを引数に指定できなさそうに思えます。(違ってたらすみません。)

    つまり、スクリプトを<実行>しないと確認できないように見えます。

    いずれにしろ、難しそうですね。。。やはり無理難題なのでしょうか。

    2016年8月6日 14:41
  • 文法チェックというか、構文エラーの検出ならば、以下のような感じでできるかと思います。

    $code = Get-Content .\test.ps1
    $errors = $null
    [System.Management.Automation.PSParser]::Tokenize($code, [ref]$errors) | Out-Null
    $errors

    いわゆる静的解析であれば、PSScriptAnalyzerが使えます。

    PSScriptAnalyzerでは、ビルトインルールのほか、検証ルールの自作も可能です。ASTの理解が必要なので、最初は少し難しいですが、サンプルを見ながら作っていくとよいかと思います。


    2016年8月7日 8:12
    モデレータ
  • 牟田口大介さん

    回答いただき誠にありがとうございます。powershellのサイトよく拝見してます。(pesterがwindow10から標準機能として搭載されたことをそちらのサイトで確認させていただいたようが気がしてます。)

    運用するうえで、例えば、下記のようなプログラムの誤りは確実に検出する必要があると考えます。(タイプミスの類のものやスクリプトの権限が不足しているもの、あるいはファイルの参照のパスの誤り。できればレジストリキーの変更の場合、パスの誤りを検出したい。)

    しかしながら、下記は、回答いただきました方法で、検出できないように思われます。(もっと「高度な」誤りなどは検出できるようですが。)

    自作ルールを作れば可能なのでしょうか。(素人で申し訳ございません。認識違いがあればご指摘をお願いします。)

    あと皆様、タイトルが誤解を招く内容だったため修正しました。

    function test {
    Write-Host "Hello world"
    aaa
    }
    test
    function test {
    Write-Hosta "Hello world"
    aaa
    }
    test




    • 編集済み Hatimitu 2016年8月7日 10:51
    2016年8月7日 10:46
  • 実行権限があるか否か。指定したコマンドが存在するか否か。指定したファイルパスが存在するか否か。etcは、実際に実行してみないと分からないことなので、静的解析の範疇を超えるのではないかと個人的には思います。

    (もっともPSScriptAnalyzerのカスタムルールは柔軟に書けるので、そういったルールをかけなくはないと思います。しかし実行環境の要素を勘案した解析は、本当に「静的」解析なのかというのは疑問が残ります…)

    となると、この類のエラーや間違いを検出するには、やはりPesterなどによるテストコードでカバーすべきものではないでしょうか。

    ちょっと前提条件を把握していないのですが、まず、本番環境とほとんど同一に仕立てた検証環境でテストを走らせて、テストが通ったら本番環境にデプロイするというのが基本の流れではないでしょうか?


    2016年8月8日 0:27
    モデレータ
  • やきです。

    まず権限不足については、権限が必要かどうかは事前に知ることができないので検出はできないと思われます。
    whoami /groups コマンドなどで事前に十分な権限を確認するくらいでしょうか。

    あと上記のようなスペルミスなどは、もしかするとPowershell ISEやVisualStudioのアドオンでそういう機能を組み込んでいるものがあるかもしれません。

    たとえば、ISEのアドオン「IESteroids」はスペルミスや ls のような短縮系をGet-ChildItem に展開するよう促す機能があったと記憶しています。

    2016年8月8日 1:17
  • チャブーンです。

    ほかの方々もおっしゃっていますが、静的解析と動的解析について、やはり峻別されたうえ複数のやり方で実現する、という方法になってしまうのではないか、と思います。

    ちょっと前提条件を把握していないのですが、まず、本番環境とほとんど同一に仕立てた検証環境でテストを走らせて、テストが通ったら本番環境にデプロイするというのが基本の流れではないでしょうか?

    ちょっとわかりづらいと思いますが、質問者さんのいう「検証環境」は本番環境へのリハーサル実施用のために用意されたもので、「エラーが起こる」こと自体が責任問題に遡及するから、ここでの実施前にエラーをつぶしたい、が背景と思っています。

    #試験環境での実施→総合試験/ローカルPCでの実施→単体試験、と考えた方がいいかもしれないですね

    これに対するひとまずの答えですが、端的にいうと「自由に調整・リストアできる『検証前環境』」をご自身で用意するのが簡単かと思います。できるだけ試験・本番環境と同じ構成の仮想マシンを用意することで、一般的に実現できます。Windows 8以降であれば、Hyper-Vクライアントで自身のコンピュータ上でサーバOS等を展開できます。

    この環境でスクリプトを実際に実行すれば、事前のエラーをつぶすことができます。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。



    2016年8月8日 5:59
  • チャブーンさん。

    回答いただきありがとうございます。

    また、質問の意図もまとめてくださり誠にありがとうございます。

    有名な方から回答いただき恐縮です。

    回答につきまして了解いたしました。この質問の間、色々考えてみましたが

    評価版のOSを活用するなどして、何とかやれないか考えてみようと

    思います。


    牟田口大介さん。

    回答いただきありがとうございます。

    やはりpesterはpowershellのテストツールとして有用なものだと

    いうことが文面から伝わりました。テストにはpesterを使おうと思います。

    やきさん。

    回答いただきありがとうございます。

    あまり知らなかったので、アドオンには便利なものがあるということがわかりました。

    「困ったらアドオンを探してみる」というのもありかなと思いました。



    皆様、ご親切に対応いただき誠にありがとうございました。



    2016年8月8日 8:47