none
まとめてファイルに出力したい RRS feed

  • 質問


  • 結果をファイルに出力したい場合、通常であればこのように書きます。

    Write-Output "Hello" | Out-File "C:\filename.txt" 
    Write-Output "World" | Out-File "C:\filename.txt" -Append

    2行程度であればこれでもいいのですが、数百行も記述があると、
    1行ごとにOut-Fileを書かないといけないのは効率が悪いし、記述ミスも出てきます。

    これをキレイにするために、以下のような書き方が可能であればこのようにしたいです。

    "C:\filename.txt" への書き込み宣言
    "C:\filename.txt" への書き込み開始(追記)
     Write-Output "Hello"
     Write-Output "World"
     ・・・
     ・・・
    "C:\filename.txt" への書き込み終了

    開始と終了の間はすべての結果がfilename.txtに書き出されます。

    2018年8月29日 6:21

すべての返信

  • ヒア文字列を使えばいいんじゃないですかね?

    https://blogs.technet.microsoft.com/heyscriptingguy/2015/12/31/powertip-use-here-strings-with-powershell/

    2018年8月29日 8:16
  • Takashi Shinoharaさん、回答ありがとうございます。

    書いてくれたURLにアクセスしました。
    今回は例題がテキスト出力だったので、これでいけるかもしれません。

    ただ、私が出した例題が悪かったかもしれません。
    本来やりたいことは、Write-Outputだけでなく、
    hostnameやGet-Volumeなどのコマンドで
    取得した結果も同じテキストに書き出したいのです。

    "C:\filename.txt" への書き込み宣言
    "C:\filename.txt" への書き込み開始(追記)
     Write-Output "Hello"
     Write-Output "World"
     hostname
     Get-Volume
    "C:\filename.txt" への書き込み終了


    2018年8月30日 0:21
  • サブシェルを使う方法はいかがでしょうか。

    powershell | Tee-Object -FilePath .\log.txt -Append
    #サブシェルを抜けるときはexit


    他に、スクリプトブロックを使う方法もあるようです。
    (参考)PowerShell: ◆リダイレクト
    http://mtgpowershell.blogspot.com/2011/09/blog-post.html


    ご参考になれば幸いです。


    • 編集済み Alfred360 2018年8月30日 21:58 -Appendを追加
    2018年8月30日 21:50
  • 以下のように出力値を配列化し、パイプを介してOut-Fileコマンドレットに渡すという方法はいかがでしょうか。

    @(
        "Hello",
        "World",
        (hostname),
        (Get-Volume)
    ) | Out-File "C:\filename.txt"

    2018年8月31日 3:37
    モデレータ
  • Alfred360さん、回答ありがとうございます。

    うまくできるかやってみます。
    2018年8月31日 5:25
  • 牟田口大介さん、回答ありがとうございます。

    これまで回答していただいた内容を応用した形で
    シンプルにまとまりましたね。
    私の要件には一番マッチしますね。
    希望通りの結果が得られました。

    もしこの構成から更に修正ができるのであれば、
    最終行のファイル書き出し命令を、
    最初の行に書けるといいですね(パイプ処理だとしょうがないところですが・・・)

    さらに私が希望する動きとしては、
    実行するコマンドは100個くらいあるので、
    1個のコマンドを実行したら、処理結果をログに書き出す。
    次のコマンドを実行したログに書き出す。
    このような動きが理想です。
    まとめて@(・・・)でまとめて書き出すとなるとバッファが足りなくなることが気になります。

    2018年8月31日 5:41
  • Start-Transcript -Path
    で出力ファイル名を指定してから各種コマンド実行、最後に
    Stop-Transcript
    ではどうでしょうか。
    2018年9月3日 2:28
  • チキンさん、回答ありがとうございます。

    試しにこのような記述で試してみました。

    start-transcript console.txt
        "Hello",
        "World",
        (hostname),
        (Get-Volume)
    Stop-Transcript

    Helloからホスト名まではログに吐かれましたが、
    Ge-Volumeの結果はログに吐かれませんでした。
    動きをみてると、Stop-Transcriptの後にGet-Volumeの結果が表示されているようでした。

    あと少しで理想の形になりそうですね。
    2018年9月4日 9:24
  • 自分もいろいろと試してみましたが、コマンドによっては「速すぎて」追いつかないことがあるようです。
    適当にWaitをいれて調整してみるしかないかもしれません。
    2018年9月5日 1:04
  • Waitの問題ではないような動きだと思います。
    一応ですが、以下の記述であればGet-Voumeも含めてテキストに書き込まれることは確認できました。
    結局パイプを付けないといけないのか・・・・

    start-transcript console.txt
        "Hello"
        "World"
        hostname
        Get-Volume| Out-Default
        "End"
    Stop-Transcript
    pause

    2018年9月6日 6:02
  • 環境によるんでしょうか。自分の環境では[Get-Volume]の結果はそのままTranscriptに記録されていました。

    サンプルとして記載いただいた
    start-transcript console.txt
        "Hello"
        "World"
        hostname
        Get-Volume| Out-Default
        "End"
    Stop-Transcript
    の実行でも記録されていたので。。。

    2018年9月6日 8:37
  • こちらはWindows10の環境で試験をしています。
    サーバや他環境だと動きが違うかもしれませんね。

    上記スクリプトで、Out-Defaultを付けないで実行すると、
    pause処理で何かキーを入れたあとにGet-Volumeの結果が
    出るという変な動きでした。

    一旦はこれで使ってみて、更に改良できるのであればお伝えしたいと思います。

    2018年9月7日 0:40