How do I add timestamps to individual lines of PowerShell & output?
You could use a filter:
filter timestamp {"$(Get-Date -Format o): $_"}$result = & ping 192.168.1.1 | timestamp
Sample output from $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),
For anyone that is looking for more information on filter
, here is the documentation. It was surprising difficult to find since searching any combination of the word "filter" and "powershell" will give a million examples and no documentation. Also help filter
in powershell provides no obvious help either.
The answer provided by mjolinor is the best way to do something like this, but I wanted to expand on it.
filter timestamp {"$(Get-Date): $_"}
Is a shortcut for calling this
function timestamp { Process{"$(Get-Date): $_"} }
Both of these create named functions that accept input from the pipeline. Run help pipline
in powershell to learn more. The pipeline will operate on a single object at a time, and that object can be referred to with the automatic variable $_
. So each function will iterate over every item in the pipeline that was piped to it using the |
pipe character.
This behaves differently than a normal function in that it's working on the objects as they arrive, instead of all at once. For example running
function timestamp { "$(Get-Date): $input"}$result = & ping 127.0.0.1$result | timestamp
Would dump the entire $result
object on a single line and result in a response that looks like this
03/14/2018 15:23:16: Pinging 127.0.0.1 with 32 bytes of data: Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 Ping 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, Average = 0ms
Since the function is operating on the object as a whole you would have to iterate over each line. Changing it to this
function timestampfunction { foreach ($i in $input){ "$(Get-Date): $i" }}
Would give you the nicely formatted
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=12803/14/2018 15:23:16: Reply from 127.0.0.1: bytes=32 time<1ms TTL=12803/14/2018 15:23:16: Reply from 127.0.0.1: bytes=32 time<1ms TTL=12803/14/2018 15:23:16: Reply from 127.0.0.1: bytes=32 time<1ms TTL=12803/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
Here is a nicely written article on the differences between these approaches.
You could use the Start-Transcript cmdlet in combination with a custom prompt in your profile:
# Configure PS prompt to show date and timefunction 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 " "}
This works great on my Windows 7 workstation. However, on some newer Server 2012 R2 installations Start-Transcript seems to be slightly broken. This fixes part of it: https://support.microsoft.com/en-us/help/3014136/powershell-transcript-file-doesn-t-contain-the-correct-information-in-windows-server-2012-r2
... but it does not fix the issue with the custom prompt, still.
For example, I see this on the console:
PS:02/14/17 08:28:20> hostnameserver463
And this is what's written to the log:
PS:02/14/17 08:28:20>PS>hostnameserver463