programing

PowerShell & 출력의 개별 라인에 타임스탬프를 추가하려면 어떻게 해야 합니까?

copyandpastes 2023. 7. 25. 23:17
반응형

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) + ":")

필터를 사용할 수 있습니다.

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),

에 대한 자세한 정보를 원하는 모든 사용자를 위해filter여기 설명서가 있습니다."filter"와 "powershell"이라는 단어의 조합을 검색하면 백만 개의 예를 얻을 수 있고 문서가 없기 때문에 찾기가 놀라울 정도로 어려웠습니다.또한.help filter파워셸에서는 명백한 도움도 제공하지 않습니다.

mjolinor가 제공한 답은 이와 같은 것을 하는 가장 좋은 방법이지만, 저는 그것에 대해 확장하고 싶었습니다.

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

이것을 호출하기 위한 바로 가기입니다.

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

둘 다 파이프라인에서 입력을 받는 명명된 함수를 만듭니다. 실행help pipline자세한 내용은 파워셸에서 확인하십시오.파이프라인은 한 번에 하나의 개체에서 작동하며 해당 개체는 자동 변수로 참조할 수 있습니다. $_따라서 각 기능은 다음을 사용하여 파이프라인에 연결된 모든 항목을 반복합니다.|파이프 문자

이것은 물체가 도착할 때 동시에 작동하는 것이 아니라 물체에 작용한다는 점에서 일반적인 기능과는 다르게 작동합니다.예를 들어 실행

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

전체를 덤프합니다.$result한 줄에 있는 개체로 인해 다음과 같은 응답이 발생합니다.

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

다음은 이러한 접근 방식의 차이에 대해 잘 작성된 기사입니다.

그냥 사용할 수 있습니다.ForEach-Objectcmdlet for it(사용)%아래 예제의 별칭)

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),

프로파일에서 Start-Transcript cmdlet을 사용자 지정 프롬프트와 함께 사용할 수 있습니다.

# 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(윈도우 7) 워크스테이션에서 잘 작동합니다.그러나 일부 최신 서버 2012 R2 설치에서는 Start-Transcript가 약간 손상된 것 같습니다.를 통해 일부 문제를 해결됩니다.

그러나 사용자 지정 프롬프트의 문제는 해결되지 않습니다.

예를 들어 콘솔에 다음이 표시됩니다.

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

로그에 기록된 내용은 다음과 같습니다.

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

PS>hostname
server463

언급URL : https://stackoverflow.com/questions/27361452/how-do-i-add-timestamps-to-individual-lines-of-powershell-output

반응형