2016-07-29 5 views
4

다음 스크립트는 파일 이름이 명령 줄에 지정된 경우 제대로 작동합니다.Powershell 스트림으로 stdin 가져 오기

tail.bat는
@echo off 
set "COUNT=%1" 
set "COUNT=%COUNT:-=%" 
set "FILENAME=%~2" 
powershell "Get-Content %FILENAME% -Last %COUNT%" 

그러나, 내가 필요한 것은 파이프에 표준 입력에서 Get-Content에 텍스트 수있을 것입니다. 프로젝트에 할당 된 마지막 세 개의 Subversion 태그를 가져 오려면 다음을 작성하고 싶습니다. Get-Content의 출처를 표준으로 설정하려면 어떻게해야합니까?

svn ls svn://ahost/arepo/aproject/tags | call tail.bat -3 

NB : 외부에서 tail과 같은 유용한 도구를 설치할 수 없습니다. 이미 컴퓨터에서 사용할 수있는 프로그램으로 완료해야합니다.

답변

6

재 작성 tail.bat 다음과 같이

@echo off 

set "COUNT=%1" 
set "COUNT=%COUNT:-=%" 
set "FILENAME=%~2" 

if "%FILENAME%"=="" (
    powershell -noprofile -command "$Input | Select-Object -Last %COUNT%" 
) else (
    powershell -noprofile -command "Get-Content \"%FILENAME%\" -Last %COUNT%" 
) 

이 더 파일 이름 인수가 this answer의, 예의를 전달되지 않은 경우 PowerShell을, $Input를 통해 표준 입력 입력을 읽을 수 있도록합니다.

예 :

C:> (echo one & echo two & echo three) | tail.bat -2 
two 
three 

참고 :

  • PowerShell에서 일반적으로 파이프 라인을 통해 전송하고 어떠한의 출력 개체 동안 외부 세계의 인터페이스 변함관련 문자열.

  • 따라서 $Input외부 표준 입력 입력을 나타내는 열거임을 감안하면 매우 모든 우리가 필요로 그것을 는이 문자열로 입력 텍스트 라인 하나씩 열거 확신 할 수 을 선택하십시오. 이유는 무엇입니까? Select-Object으로 배관하면 충분합니다. PowerShell의 이름으로 파일을 읽는 반면

  • 는 (당신은 또한 -Raw를 지정하지 않는 부수적으로, 또한 파이프 라인을 통해 하나의 입력 파일의 라인 하나를 전송) Get-Content을 필요로; Get-Content 매개 변수 -Tail (및 별명 -Last)를 통해 내장 tail 기능을 가지고 있기 때문에, 모든 것을 여기에 필요하다.

  • 주의 : 문자 출력이 PowerShell을 외부 세계에 이야기 할 때 참여에 입력 및 재 인코딩 디코딩 :

    • 당신이 오직 ASCII로 인코딩 된 입력을 처리하는 경우 (0-127 범위의 코드 포인트를 갖는 1 바이트 문자), 걱정할 필요가 없습니다.

    • 그렇지 않으면 고통의 세계를 준비 ​​- 자세한 내용은 아래를 참조하십시오.


복호화/재 부호화 문제

  • 가정 PowerShell을가 입력 부호화 (아래 참조) 출력 부호화 변함 이다 인식 무엇을 콘솔 창의 할당 된 인코딩은 다음과 같습니다. 유감스럽게도 이는 불행히도 PS에 [Console]::OutputEncoding으로 반영된 OEM 코드 페이지 (예 : 미국 영어 시스템의 "DOS"코드 페이지 CP437)입니다.

    • 따라서 당신이 콘솔에 인쇄하는 경우, 제대로 인식 입력과, 상황이 OK 볼 것이다, 그러나 당신은 파일의 출력을 캡처하는 경우, 당신은 OEM-코드 페이지하게 될 겁니다 - 인코딩 된 파일, 아마도 바람직하지 않습니다.

    • 이 가능한 경우 근본적으로 선택의 코드 페이지 (입력 출력 인코딩) (chcp를 사용)를 사용하는 콘솔 창을 설정하지만,에서 인코딩 임시을 변경하려고 할 수 귀하 스크립트는 불행히도 옵션이 아닙니다.
      UTF-8 - 코드 페이지 65001을 사용하면 콘솔 창에서 TT (트루 타입) 글꼴 중 하나를 사용하도록 구성한 경우에만 작동합니다. 상기 작성된

  • 또한 OEM 코드 페이지 인 기본 입력 부호화 (에 기초하여 적절히 불행히도 이하로 제한되어 인식된다 입력 인코딩의 집합 [Console]::InputEncoding로 PS 반영; 기억 입력 것이다 재 부호화 출력)에 기본적으로이 ENC 보존한다 출력

    • ASCII 입력 (재 인코딩와)
    • UTF-16 LE 입력 을, 아버지의 부동산 PowerShell을 Unicode을 부르는있는 BOM (출력에 잠재적으로 다른 뭔가)
  • 적용하기 위해 다시 인코딩 당신 하드 - 코드 예 : 입력 인코딩 Get-Content 호출에 추가로 -Encoding <enc> (기본값으로 Windows 기본 코드 페이지 인코딩이 필요함)을 입력하고 표준 입력을 입력에 반영하십시오 (에 반영됨).)은 사소한 것입니다.

    • 예 :명시 적으로 UTF-8로 입력을 해석하고자한다면, 기본 입력 인코딩, (다시,[Console]::OutputEncoding 인코딩이 적용되는 출력 점에 유의) : powershell -noprofile -command "$Input | % { [text.encoding]::utf8.GetString([Console]::InputEncoding.GetBytes($_)) } | Select-Object -Last %COUNT%"
+0


감사합니다. 나는 '$ Input'과'Select-Object vs. Get-Content'에 대해서 배우는 법을 배웠다. – lit

+0

내 기쁨; 내 업데이트가 도움이되는지 확인하십시오. 입력 디코딩/출력 재 인코딩 경고에 주목하십시오. – mklement0

+1

추가 해줘서 고맙습니다. 유니 코드가 존재하기 전에 DOS 및 Windows 프로그램을 일본어 컴퓨터에서 실행하고 있었기 때문에 인코딩 문제에 익숙합니다. 많은 재미. – lit

관련 문제