web-dev-qa-db-ja.com

PowerShellと出力の個々の行にタイムスタンプを追加するにはどうすればよいですか?

_&_ PowerShell演算子によって生成された出力の各行にタイムスタンプを追加する方法は、あるとしてもどうですか?

例:

_PS H:\> $result = & ping 192.168.1.1
PS H:\> echo $result

Pinging 192.168.1.1 with 32 bytes of data:
Reply from 192.168.1.1: bytes=32 time=104ms TTL=250
Reply from 192.168.1.1: bytes=32 time=106ms TTL=250
Reply from 192.168.1.1: bytes=32 time=102ms TTL=250
Reply from 192.168.1.1: bytes=32 time=102ms TTL=250
Ping statistics for 192.168.1.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 102ms, Maximum = 106ms, Average = 103ms
_

望ましい結果:

_PS H:\> echo $result

2014-12-08T14:45:48.8898125+00:00:Pinging 192.168.1.1 with 32 bytes of data:
2014-12-08T14:45:48.8932661+00:00:Reply from 192.168.1.1: bytes=32 time=104ms TTL=250
2014-12-08T14:45:48.9233451+00:00:Reply from 192.168.1.1: bytes=32 time=106ms TTL=250
2014-12-08T14:45:48.9765438+00:00:Reply from 192.168.1.1: bytes=32 time=102ms TTL=250
2014-12-08T14:45:49.0233105+00:00:Reply from 192.168.1.1: bytes=32 time=102ms TTL=250
2014-12-08T14:45:49.0233201+00:00:
2014-12-08T14:45:49.0238753+00:00:Ping statistics for 192.168.1.1:
2014-12-08T14:45:49.0239210+00:00:    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
2014-12-08T14:45:49.0233318+00:00:Approximate round trip times in milli-seconds:
2014-12-08T14:45:49.0237209+00:00:    Minimum = 102ms, Maximum = 106ms, Average = 103ms
_

PowerShell配列を分割/結合する方法は知っていますが、これは_&_演算子が完了した後にのみ発生します。 &演算子の実行中に出力にタイムスタンプが追加される、よりリアルタイムに近いソリューションを探しています。

ちなみに、タイムスタンプ自体は$($(Get-Date -Format o) + ":")です

15
Piotr L

フィルターを使用できます:

filter timestamp {"$(Get-Date -Format o): $_"}
$result = & ping 192.168.1.1 | timestamp

$resultからのサンプル出力:

2014-12-08T11:42:59.2827202-05:00: 
2014-12-08T11:42:59.2857205-05:00: Pinging 192.168.1.1 with 32 bytes of data:
2014-12-08T11:43:03.1241043-05:00: Request timed out.
2014-12-08T11:43:08.1236042-05:00: Request timed out.
2014-12-08T11:43:13.1241042-05:00: Request timed out.
2014-12-08T11:43:18.1246042-05:00: Request timed out.
2014-12-08T11:43:18.1246042-05:00: 
2014-12-08T11:43:18.1246042-05:00: Ping statistics for 192.168.1.1:
2014-12-08T11:43:18.1246042-05:00:     Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
47
mjolinor

filterの詳細をお探しの方は、 ドキュメントはこちら をご覧ください。 Wordの「filter」と「powershell」の組み合わせを検索すると、100万の例が提供され、ドキュメントは表示されないため、見つけるのは驚くほど困難でした。また、powershellのhelp filterも明らかなヘルプを提供しません。

Mjolinorが提供する答えは、このようなことをする最良の方法ですが、私はそれを拡張したいと考えました。

filter timestamp {"$(Get-Date): $_"}

これを呼び出すためのショートカットです

function timestamp { Process{"$(Get-Date): $_"} }

これらは両方とも、パイプラインからの入力を受け入れる名前付き関数を作成します。詳細については、PowerShellでhelp piplineを実行してください。パイプラインは一度に1つのオブジェクトで動作し、そのオブジェクトは 自動変数$_で参照できます。したがって、各関数は、|パイプ文字を使用してパイプされたパイプライン内のすべてのアイテムを反復処理します。

これは、一度にすべてではなく、オブジェクトの到着時に動作するという点で、通常の機能とは異なります。たとえば実行中

function timestamp {
        "$(Get-Date): $input"
}
$result = & ping 127.0.0.1
$result | timestamp

$resultオブジェクト全体を1行でダンプし、このような応答を返します

03/14/2018 15:23:16:  Pinging 127.0.0.1 with 32 bytes of data: Reply from 127.0.0.1: b
ytes=32 time<1ms TTL=128 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 Reply from 12
7.0.0.1: bytes=32 time<1ms TTL=128 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128  Pi
ng statistics for 127.0.0.1:     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds:     Minimum = 0ms, Maximum = 0ms, Avera
ge = 0ms

関数はオブジェクト全体で動作しているため、各行を反復処理する必要があります。これに変更する

function timestampfunction {
    foreach ($i in $input){
        "$(Get-Date): $i"
    }
}

きれいにフォーマットされた

03/14/2018 15:23:16: 
03/14/2018 15:23:16: Pinging 127.0.0.1 with 32 bytes of data:
03/14/2018 15:23:16: Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
03/14/2018 15:23:16: Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
03/14/2018 15:23:16: Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
03/14/2018 15:23:16: Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
03/14/2018 15:23:16: 
03/14/2018 15:23:16: Ping statistics for 127.0.0.1:
03/14/2018 15:23:16:     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
03/14/2018 15:23:16: Approximate round trip times in milli-seconds:
03/14/2018 15:23:16:     Minimum = 0ms, Maximum = 0ms, Average = 0ms

ここ は、これらのアプローチの違いに関する記事です。

5

プロファイルでカスタムプロンプトと組み合わせてStart-Transcriptコマンドレットを使用できます。

# Configure PS Prompt to show date and time
function Prompt
{ 
    $promptStringStart = "PS:" + (Get-Date -format MM/dd/yy` hh:mm:ss)
    $promptStringEnd += ">"
    Write-Host $promptStringStart -NoNewline -ForegroundColor Yellow
    Write-Host $promptStringEnd -NoNewline -ForegroundColor Yellow
    return " "
}

これは、Windows 7ワークステーションでうまく機能します。ただし、一部の新しいServer 2012 R2インストールでは、Start-Transcriptがわずかに破損しているようです。これにより、その一部が修正されます。 https://support.Microsoft.com/en-us/help/3014136/powershell-transcript-file-doesn-t-contain-the-correct-information-in-windows- server-2012-r2

...しかし、それでもカスタムプロンプトの問題は解決しません。

たとえば、コンソールに次のように表示されます。

PS:02/14/17 08:28:20> hostname
server463

そして、これはログに書き込まれるものです:

PS:02/14/17 08:28:20
>

PS>hostname
server463
4
Jeff

ForEach-Objectコマンドレットを使用できます(以下の例では%エイリアスを使用)

ping 192.168.1.1 | %{ "{0:HH:mm:ss:fff}: {1}" -f (Get-Date), $_ }

結果:

23:41:51:301:
23:41:51:302: Pinging 192.168.1.1 with 32 bytes of data:
23:41:55:255: Request timed out.
23:42:00:266: Request timed out.
23:42:05:254: Request timed out.
23:42:10:253: Request timed out.
23:42:10:261:
23:42:10:263: Ping statistics for 192.168.1.1:
23:42:10:265:     Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

または、mjolinorの回答のような形式を使用します。

ping 192.168.1.1 | %{ "{0:o}: {1}" -f (Get-Date), $_ }

結果:

2019-04-23T23:45:40.5816185+02:00:
2019-04-23T23:45:40.5845856+02:00: Pinging 192.168.1.1 with 32 bytes of data:
2019-04-23T23:45:44.2560567+02:00: Request timed out.
2019-04-23T23:45:49.2549104+02:00: Request timed out.
2019-04-23T23:45:54.2547535+02:00: Request timed out.
2019-04-23T23:45:59.2547932+02:00: Request timed out.
2019-04-23T23:45:59.2577788+02:00:
2019-04-23T23:45:59.2607707+02:00: Ping statistics for 192.168.1.1:
2019-04-23T23:45:59.2627647+02:00:     Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
0