none
自作Cmdlet のパイプライン操作について RRS feed

  • 質問

  • OleDBコネクションに対して、任意のSQL文を実行する Cmdlet の作成にチャレンジしています。

     

    テストの段階で問題が発生しました。

     

    SELECT文の結果を「foemar-table」しようとした場合にコマンドラインに直接入力した際は正常に処理されるのですが、

    スクリプトより実行した場合には次のエラーとなります。

     

    out-lineoutput : 型 "Microsoft.PowerShell.Commands.Internal.Format.FormatStartData" のオブジェクトが無効で
    あるか、または正しいシーケンスではありません。ユーザーによって指定された "format-table" コマンドが既定の書
    式と競合している可能性があります。

     

    コマンドラインから実行する場合とスクリプトで実行する場合とでは何か違いがあるのでしょうか?

     

    # 冷静に読み返すと「これだけの情報から何を回答しろと...」と言いたくなるような内容ですね。

     

    追記すると

     

    ・C# を使用して、PSCmdlet を継承した、Invoke-SQL コマンドを作成しています。

    ・コネクション(もしくは、接続文字列)とSQL文をパラメータに渡します。

    ・SELECT文の場合は実行結果のDataRowsコレクションを返します。

    ・DMLの場合は影響を受けた行数を返します。

     

    コマンドラインへの直接入力にて次のコマンドを実行した場合には正しく処理されます。

    Invoke-SQL -commandtext "SELECT * FROM AAA" -connection $cnn | format-table -auto
    # ここで、$cnn は有効なOleDbコネクションであることとします。

     

    同じ内容をスクリプトで実行した場合は上記に記述したエラーとなります。

     

    # コマンドラインに入力した内容とスクリプトの内容に誤りがあるわけではなく、スクリプトのファイルに記述した内容を

    # コピペした場合には正しく実行され、./HOGE.PS1 として実行した場合にエラーとなります。

     

    2008年2月25日 14:58

回答

  • PowerShell & Sql in Windows Powershell
    自分では試せていないので、はずしていたら申し訳ないのですが、上記URLと同じ問題では無いでしょうか?

    コンソールで実行した場合、暗黙で末尾に | Out-Host が使用されるため問題ないのですが、スクリプトとして実行されると、そうならないのでエラーになると。

    Invoke-SQL -commandtext "SELECT * FROM AAA" -connection $cnn | format-table -auto | out-string
    こうするとどうなるでしょうか?


    Why Can’t I Pipe Format-Table to Export-Csv (and get something useful)?

    こちらにも同じような問題? が出ています。Format-Tableはオブジェクトをストリームに変えちゃうので、Out-系のcmdletにつなげないと使えないですよー、みたいな。
    2008年2月26日 13:57

すべての返信

  • PowerShell & Sql in Windows Powershell
    自分では試せていないので、はずしていたら申し訳ないのですが、上記URLと同じ問題では無いでしょうか?

    コンソールで実行した場合、暗黙で末尾に | Out-Host が使用されるため問題ないのですが、スクリプトとして実行されると、そうならないのでエラーになると。

    Invoke-SQL -commandtext "SELECT * FROM AAA" -connection $cnn | format-table -auto | out-string
    こうするとどうなるでしょうか?


    Why Can’t I Pipe Format-Table to Export-Csv (and get something useful)?

    こちらにも同じような問題? が出ています。Format-Tableはオブジェクトをストリームに変えちゃうので、Out-系のcmdletにつなげないと使えないですよー、みたいな。
    2008年2月26日 13:57
  • レスありがとうございます。

     

    まさに教えていただいた内容でした。

     

    一歩前進しました。

     

    2008年2月26日 15:22
  • こんにちは!
    フォーラム オペレータの鈴木裕子です
     

    嗣永モモコーラ さん、回答ありがとうございました。

     

    saki1208 さん、フォーラムのご利用ありがとうございます。

     

    嗣永モモコーラ さんの回答が、有用な情報と思われたため、

    私のほうで回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてくださいね

     

    saki1208 さんはチェックを解除することもできますので、

    もし不適切でしたら、修正をお願いします。

     

    引き続き疑問や質問がありましたら、遠慮なく投稿してください。

    それでは!

    2008年3月5日 9:20
    モデレータ