상세 컨텐츠

본문 제목

PowerShell(파워쉘) Tail 명령어가 안될 때 해결방법

Windows/PowerShell&Command

by Hoonjo 2023. 7. 6. 19:30

본문

PowerShell(파워쉘) Tail 명령어가 안될 때 해결방법

Workarounds when PowerShell Tail commands don't work

 

 

 

 

 

Tail 사용 시 에러발생:

 A parameter cannot be found that matches parameter name 'Tail' .

 

 

아? OS버전별 스크립트 개발 중 윈도우 서버 2008에서는 파워쉘 버전이 낮아 Tail 옵션이 존재하지 않는 것이었다..

자그마치 버전이 2.0 이다... 현재 내가 사용 중인 윈도우PC만 해도 5.1 버전인데..

 

스택오버플로우에서 3.0부터는 가능하나 2.0에서는 다른 방식을 사용해야 한다고 한다.

https://stackoverflow.com/questions/55516082/powershell-tail-parameter-in-powershell-2-0

 

 

 

아래처럼 사용하면 Tail 기능을 이용할 수 있다.

 

1. 마지막 줄만 출력하기

 

명령어:

(Get-Content "파일명")[-1]

 

결과:

맨 아래 1줄만 출력된 모습

test파일 내 보면 마지막 줄이 출력 잘 된 모습이다.

 

하지만 내가 원하는 건 맨 아래부터 여러 줄을 출력하고 싶었다.

 


 

2. Tail 여러줄 출력하기

 

라인의 범위를 지정해 주면 출력할 수 있다.

배열과 같이 3줄이면 0~2까지로 표현이 되고, 2번째 라인과 3번째 라인만 출력하기 위해선

[시작 라인..끝 라인] 와 같이 표현을 해주면 된다.

 

명령어:

(Get-Content .\test.txt)[1..2]

 

결과:

2,3번째 라인이 출력된 모습

 

 


 

3. 실제 사용 사례 예제

 

기존 Tail 명령을 사용해서 파일의 라인 수가 변경이 생기면 변경된 라인부터 마지막 라인까지 출력하는 코드

더 낮은 버전의 OS에서도 동작할 수 있도록 변경하였다.

 

test.ps1 기존 코드:

$LOG_DIR = "C:\monitoring"
$LOG_NAME = "monitoringFile.txt"

$AG_HOME = "C:\agtest"

$CURRENT_LINE = (Get-Content "$LOG_DIR\$LOG_NAME").Length
$PRE_LINE = Get-Content "$AG_HOME\preLine.txt"

if($CURRENT_LINE -ne $PRE_LINE){
  $READ_START_LINE = [int]$CURRENT_LINE - [int]$PRE_LINE

  $RESULT_FILE = "monitoring_result.log"

  # 변경 전
  Get-Content "$LOG_DIR\$LOG_NAME" -Tail $READ_START_LINE >"$AG_HOME\$RESULT_FILE"
}

 

test.ps1 변경 코드:

$LOG_DIR = "C:\monitoring"
$LOG_NAME = "monitoringFile.txt"

$AG_HOME = "C:\agtest"

$CURRENT_LINE = (Get-Content "$LOG_DIR\$LOG_NAME").Length
$PRE_LINE = Get-Content "$AG_HOME\preLine.txt"

if($CURRENT_LINE -ne $PRE_LINE){
  $READ_START_LINE = [int]$CURRENT_LINE - [int]$PRE_LINE

  $RESULT_FILE = "monitoring_result.log"

  # 변경 후
  $LAST_LINE = [int]$CURRENT_LINE - 1
  (Get-Content "$LOG_DIR\$LOG_NAME")[$PRE_LINE..$LAST_LINE] >"$AG_HOME\$RESULT_FILE"
}

이전 라인 수현재 모니터링 대상 파일의 라인수가 다르면 추가된 내용이 RESULT_FILE에 저장되는 코드입니다.

 

결과:

이전 라인 수
모니터링 대상 파일
스크립트 실행 결과

 

 

✔ 이전에 알고 있던 라인 수(preLine)은 1라인만 존재

✔ 모니터링 대상파일(monitoringFile)에 2,3 번째 라인이 추가되었을 때

✔ 실행 후 결과 파일(monitoring_result) 파일에 2,3 번째 라인이 추출된 모습 🎉

 

 

 

관련글 더보기