tomoike2023
@tomoike2023

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PythonでWindowsイベントログに改行出力する方法について

Q&A

Closed

はじめまして。Python初心者です。宜しくお願いいたします。

今Pythonを使用し、Windowsで動作するものを作成しています。
その中で以下の様にエラー発生時にWindowsのイベントログに出力するようにしております。

eCodem = 'あいうえお'
os.system("powershell -Command Write-Eventlog -LogName Application -Source Test-EventLog  -EventId " + '30000' +  " -EntryType Information -Message '" + eCodem + "'")

上記でイベントログに書き出すことは可能なのですが、
メッセージ部分を改行したいと思っていますが、その方法が判らず困っております。

eCodem = "あいう" + '``n' +"えお"
eCodem = "あいう" + '\n' +"えお"

等を試してみたのですが、文字列としてそのまま「``n」や「\n」が出力されてしまいます。

あまり知識がなく大変恐縮ですが、良い回避策があればよろしくお願いします。

0

3Answer

eCodem = 'あいう\\nえお'
os.system("powershell -Command Write-Eventlog -LogName Application -Source Test-EventLog  -EventId " + '30000' +  " -EntryType Information -Message '" + eCodem + "'")

テストはしてませんが、powershellに直接改行文字を渡すのではなく、エスケープ文字で渡してみてはいかがでしょうか?
この時にpowershellに渡される実際のコマンド内ではメッセージ内の改行文字が\nとなると思います

1Like

PowerShellもPythonもほとんど知りませんが、
eCodem = "あいう\nえお"
でいけそうな気がします。

0Like

Comments

  1. @tomoike2023

    Questioner

    albireo様
    早々のご回答有難う御座います。

    試してみましたが、以下の様な表示になってしまいました。

    image.png

  2. いったんコマンドライン文字列として展開しているのを見落としてました。

    PowerShellのコマンドラインで改行文字を入力するには `nと書けばいいようですが、エスケープ シーケンスは、二重引用符 (") 文字列に含まれている場合にのみ解釈されます。とのことなので、作成するべきコマンドライン文字列は
    powershell -Command Write-Eventlog -LogName Application -Source Test-EventLog -EventId 3000 -EntryType Information -Message "あいう`nえお"
    ということになります。
    まずはPowerShellのコマンドラインに上記の文字列を直接入力して意図した内容がイベント登録されるかを確認してください。
    それが確認できたら、後はPythonの方で同じ文字列を出力させる方法だけを考えればいいわけです。たぶん。

  3. 横から失礼します。

    powershell -Command Write-Eventlog -LogName Application -Source Test-EventLog -EventId 3000 -EntryType Information -Message "あいう`nえお"

    改行されていることを確認できました。
    私の提案より、こちらの方が簡単です。 > @tomoike2023 さん

  4. @tomoike2023

    Questioner

    albireo様 nak435様
    度々のご教示有難う御座いました。

    確かに上記方法でも動作する事が出来ました。

    本当に有難う御座いました。

  5. albireo様 nak435様

    本題から外れますが、(今後、)メンションする場合は@を付けましょう。 

    @albireo様 @nak435

    レス不要です。> @tomoike2023 さん

Comments

  1. @tomoike2023

    Questioner

    nak435様
    ご回答有難う御座います。

    早速実行した所以下のエラーが発生してしまいました。

    文字列に終端記号 ' がありません。
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
    

    また、試しに「eCodem = "あいう'\r\n'えお"」で実施した所、albireo様のご助言と同じ結果となってしまいました。

  2. ↑こちらによると、「Out-Stringを使う」とありました。

    試しに、以下のコマンドをPowerShellで実行したところ、改行されることを確認しました。

    $Msg = @"
    あいう
    えお
    "@
    
    Write-Eventlog -LogName Application -Source Test-EventLog  -EventId 30000 -EntryType Information -Message $Msg
    
  3. @tomoike2023

    Questioner

    nak435様
    度々のご連絡有難う御座います。

    上記はPowerShell上での実行でしょうか?
    Pythonコードを記載する際はどうすればお判りになりますか?
    色々為いてみましたが、上手くいかず。。。。

  4. バッチファイル化する必要があると思います。
    上のコードをpythonでファイルに出力して、そのファイルを指定してpowershellを起動することになると思います。

    以下はあくまで例ですが、

    import os
    import tempfile
    
    cmd = """
    $Msg = @"
    あいう
    えお
    "@
    
    Write-Eventlog -LogName Application -Source Test-EventLog  -EventId 30000 -EntryType Information -Message $Msg
    """
    
    fd, tmpfilename = tempfile.mkstemp(text=True)
    fp = open(tmpfilename, 'w')
    fp.write(cmd)
    fp.close()
    
    os.system('powershell -Command ' +\
              'powershell -ExecutionPolicy RemoteSigned ' + tmpfilename)
    
    os.remove(tmpfilename)
    
  5. @tomoike2023

    Questioner

    nak435様
    度々のご回答有難う御座いました。

    お陰様で無事想定している内容で出力する事が出来ました。
    直接記載するのではなく、ファイル化してShell実行する必要があるのですね。

    実際にはtempfileではなく、*.ps1を作成しそれをpowershellで呼びだす事で実現する事が出来ました。

    本当に有難う御座いました。

Your answer might help someone💌