콘솔 출력을 메모장에 직접 파이프하려면 어떻게해야합니까?


47

명령 프롬프트 또는 Git 셸에서 응용 프로그램을 실행하고 있으며 나중에 쉽게 검토하고 편집 할 수 있도록 출력을 메모장으로 가져오고 싶습니다.

다음을 시도했지만 항상 빈 메모장 인스턴스가 나타납니다.

diff file1.txt file2.txt | notepad

출력을 다른 파일로 리디렉션 한 다음 메모장에서 파일을 열 수 있음을 알고 있습니다. Windows 이외의 시스템에서 Vim 이하 로 파이핑하는 데 익숙하기 때문에 추가 단계를 피하고 싶습니다 .


2
물론 moreWindows에서도 파이프 할 수 있습니다.
Gabe

1
파일로 파이프하고 단순히 새로운 파일 경로를 쉘로 실행하지 않는 이유는 무엇입니까? 그것은 않는 메모장으로?
Gusdor

@Gusdor이 문제는 주로 (임시) 파일 생성을 피하는 것에 관한 것입니다.
Der Hochstapler

1
메모장의 기능이 너무 제한되어있어 거의 아무것도 할 수 없습니다. 에 익숙하기 때문에 vim설치하지 않으시겠습니까?
Siyuan Ren

@CR 나는 내 컴퓨터에서 그렇게 할 수 있지만, 내가 소유하지 않은 컴퓨터에서는 정기적으로 작업합니다. 따라서 타사 소프트웨어를 설치하지 않고 어떤 옵션이 있는지 알면 도움이됩니다.
Der Hochstapler 2016 년

답변:


63

내가 알 수 있듯이 메모장에 직접 파이프하는 방법은 없습니다.

그러나 clip다음 과 같이 메모장에 파이프를 넣은 다음 붙여 넣을 수 있습니다 .

 diff file1.txt file2.txt | clip && notepad

그런 다음 메모장에서 Ctrl+ V를 누르십시오 .


3
출력을 file3.txt로 리디렉션하면 작동 && notepad file3.txt합니까?
Konerak

4
예 @Konerak, 그 일 것이고 그것이 내가 (질문에 설명 된대로) 피하려고 정확히 무엇인가)
데르 Hochstapler에게

32

그래픽 환경을 선호하는 경우 Vim 또는 gVim 사용을 고려하십시오 .

그런 다음 단일 하이픈을 인수로 사용하여 표준 입력에서 읽을 수 있도록 Vim / gVim에 지시합니다.

diff file1.txt file2.txt | gvim -

1
메모장을 설치하면 실제로 사용할 수 없습니다. 휴대용 응용 프로그램에서도 사용할 수 있습니다. portableapps.com/apps/development/gvim_portable
higuita

3
vim에서이 작업을 수행 할 수도 있습니다.:%!diff file1.txt file2.txt
SlightlyCuban

@TankorSmash 나도 그래도 문제의 핵심은 아니다.) vim (또는 다른 주제)에 대한 추가 찬반 토론은 슈퍼 유저 채팅 에서 저를 찾으십시오 . 댓글 스레드는 대화를 나누는 좋은 방법이 아닙니다. :(
Der Hochstapler

1
@OliverSalzburg Windows에서 gvim을 사용할 수 있다고 제안하려고했습니다. 내가 틀렸어.
TankorSmash

-는 종종 "stdin에서 읽음"을 의미하는 데 사용되므로 엄격하게로 제한되지 않습니다 vim. 다른 편집자가 사용합니다 -i(예 :) kate.
Bakuriu

8

다음 은 클립 보드를 클로버하지 않고 올바르게 작동 하는 짧은 Windows 프로그램입니다 . PowerShell에 적합해야하며 시간이되면이 답변을 업데이트 할 수도 있지만 해당 프로그램을 직접 사용할 수도 있습니다.

그렇다면 PowerShell은 어떻습니까? 다른 응용 프로그램을 설치할 필요가 없습니다. 불행히도, 당신 어딘가에 스크립트 파일을 만들어야합니다 PATH...

사용할 수있는 짧은 버전

ShowInNotepad.bat다음 내용 으로 배치 파일 (예 :)을 만들어 PATH어딘가에 배치하면 :

@echo off
clip
powershell -Command $process = Start-Process -PassThru notepad;$SW_SHOW = 5;$sig = '[DllImport("""user32.dll""")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) ^| Out-Null;Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.SendKeys]::SendWait('^^V');

그러면 echo blah | ShowInNotepad어디서나 전화 할 수 있습니다!

이 점에 유의 않습니다 당신이 윈도우 (비스타 +)의 최근 틱 버전을 사용한다고 가정하지 장애인 PowerShell을 가지고 또는 .NET 프레임 워크를 제거. 즉, 기본 Windows 설치가 작동합니다.


긴 설명과 대안

내가 생각할 수있는 가장 쉬운 방법은 붙여 넣기 ( Ctrl+ V) 작업 을 자동화하는 것입니다 . 적어도 하나의 다른 답변이 이미 수행 중이지만 AHK를 사용하는 답변은 잠겨있는 회사 환경에서 PowerShell을 사용하는 것이 더 좋습니다.

스크립트로 시작합시다.

#start notepad, get process object (to get pid later)
$process = Start-Process -PassThru notepad;

# activate Notepad window
# based on http://stackoverflow.com/a/4994020/1030702
# SW_SHOW activates and shows a window http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx
$SW_SHOW = 5;
$sig = '[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';
Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;
[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) | Out-Null;

# send a "Ctrl+V" keystroke to the active window
# from http://stackoverflow.com/a/17851491/1030702
Add-Type -AssemblyName System.Windows.Forms;
[System.Windows.Forms.SendKeys]::SendWait('^V');

꽤 간단하므로 이미 언급 한 것보다 스크립트를 설명하는 것을 귀찮게하지 않을 것입니다.

용법

이를 사용하려면 스크립트를 .ps1파일 (예 :)에 배치하고 스크립트를 ShowInNotepad.ps1어딘가에 배치 PATH한 다음 powershell ShowInNotepad.ps1클립 보드에 표시 할 텍스트를 배치 한 후 호출 하면됩니다.

예:

echo blah | clip && powershell ShowInNotepad.ps1

불행히도 때때로 PowerShell 스크립트 실행이 어려울 수 있습니다 (실행 정책 및 모두). 따라서이 스크립트를 명령 프롬프트에서 직접 호출하거나 배치 파일에 넣을 수있는 하나의 라이너로 압축했습니다.

powershell -Command $process = Start-Process -PassThru notepad;$SW_SHOW = 5;$sig = '[DllImport("""user32.dll""")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) ^| Out-Null;Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.SendKeys]::SendWait('^^V');

ShowInNotepad.bat다음 내용 으로 배치 파일 (예 :)을 만들어 PATH어딘가에 배치하면 :

@echo off
clip
powershell -Command $process = Start-Process -PassThru notepad;$SW_SHOW = 5;$sig = '[DllImport("""user32.dll""")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) ^| Out-Null;Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.SendKeys]::SendWait('^^V');

그러면 echo blah | ShowInNotepad어디서나 전화 할 수 있습니다!


솔직히 PS 스크립트를 작성하려면 temp 파일 폴더에 Guid 이름의 파일을 만들고 완료했을 때 삭제하십시오. 페이스트를 자동화하면 너무 부서지기 쉬운 것 같습니다 (잘못된 시간에 초점을 잃어버린 경우 등)?
케이시

@emodendroket 불행히도, 스트림 입력을 기본적으로 지원하지 않는 프로그램으로 스트림 입력을 강제하려고 할 때, 실제로 아무것도 깨끗하지 않습니다. 임시 파일을 만드는 Save데는 고유 한 단점이 있습니다. 실제로 "새 파일"을 얻지 못하므로 수정 된 동작의 종료와 종료가 다릅니다. 메모장 자체를 바꾸거나 텍스트를 편집 컨트롤에 직접 삽입하는 것에는 다른 옵션이 많지 않습니다. 물론,이 방법은 클립 보드 내용을 클로버 링하는 단점이 있습니다 (어쨌든 일시적인 것으로 생각되지만). 초점을 잃는 것이 큰 문제라고 생각하지 않습니다. 그것은 ...

... 아마도 경쟁 조건이 아닐 것입니다 ( ShowWindow키 입력과 전송 사이 ). 이 방법을 사용하려면 약간 더 설정 (스크립트 파일 작성)해야합니다.

5

어떻게 사용에 대한 AutoHotkey를을 ?

다음을 다음과 같이 저장하고 stdin.ahkAutoHotkey 디렉토리에 저장하십시오 .

StdIn(max_chars=0xfff)
{
    static hStdIn=-1
    ; The following is for vanilla compatibility
    ptrtype := (A_PtrSize = 8) ? "ptr" : "uint"

    if (hStdIn = -1)
    {
        hStdIn := DllCall("GetStdHandle", "UInt", -10,  ptrtype) ; -10=STD_INPUT_HANDLE
        if ErrorLevel
            return 0
    }

    max_chars := VarSetCapacity(text, max_chars*(!!A_IsUnicode+1), 0)

    ret := DllCall("ReadFile"
        ,  ptrtype, hStdIn        ; hFile
        ,  "Str", text          ; lpBuffer
        , "UInt", max_chars*(!!A_IsUnicode+1)     ; nNumberOfBytesToRead
        , "UInt*", bytesRead    ; lpNumberOfBytesRead
        ,  ptrtype, 0)            ; lpOverlapped

    return text
}

loop 
{
    sleep 100 ;wait for data
    Buffer:=StdIn()
    PipeText:=PipeText . Buffer
    IfWinActive Untitled - Notepad
        {
        SendInput {Raw}%PipeText%
        PipeText = 
        }
}

그런 다음 명령 행 :

ping -t www.google.com | AutoHotkeyA32.exe stdin.ahk

창이 열려 있고 제목이있는 한 명령의 출력을 메모장에 파이프합니다 Untitled - Notepad. 창이 활성화되지 않은 경우에는 창이 활성화 될 때까지 백그라운드에서 유쾌하게 버퍼링됩니다. 다른 프로그램으로 이동하여 버퍼링을 한 번 더 수행 할 수 있습니다.

표준 입력으로 출력되는 프로그램이 죽을 때 죽는 것처럼 보입니다 ...

(정보를 위해 stdin () 코드는 여기 에서 뻔뻔스럽게 반 인치되었습니다 )


...와. 그 정도까지 가려면 컴파일 된 전체 프로그램을 작성하십시오! 아마도 더 효율적일 것입니다 : P 노력에 찬성합니다.

나를 두려워하지 마십시오. 고전적인 의미에서 오버 엔지니어링. 이 스크립트를 제어하는 ​​버전은 누구입니까? 오토 핫키는 상용 응용 프로그램에 대한 라이센스가 필요합니까? 누가 모니터링합니까?
Gusdor

7
@Gusdor 전체 인터넷은 비 버전 제어 코드 스 니펫으로 가득합니다. 우리는 이 게시물에 대한 개정 내역 을 가지고 있다는 이점 이 있습니다. 또한 상용 라이센스가이 질문과 어떤 관련이 있는지 보지 못합니까? AHK는 많은 사람들 이 사용하며이 답변이 유용 할 수 있습니다.
slhck 2016 년

@ slhck 나는이 솔루션의 함정에 대해 간단히 말하고 유효성이 아닙니다.
Gusdor

@slhck :이 사이트의 컨텐츠는 Creative Commons에 의해 보호됩니다.
Brian

4

이것은 완전히 가능합니다. 방금 시도했습니다. 메모장이 기본적으로 txt 파일을 열도록 설정되어 있다고 가정합니다.

diff file1.txt file2.txt > output.txt && start output.txt && timeout /T 3 && del output.txt

좋아, 기술적으로 파일을 작성하고 있지만 저장되지는 ​​않습니다.

더 파이핑하는 것도 옵션입니다.


4
조심하십시오-이미 output.txt이것을 가지고 있다면 그것을 막을 것입니다. 조금 더 안전한 것이 사용하는 것 %temp%/somerandomstring.txt입니다.
Bob

temp 디렉토리에 출력 파일을 저장하는 것이 더 안전합니다 . 답변을 살펴보십시오 .
Lu55

1

이 작업을 수행하는 추악하지만 효과적인 방법은 다음과 같습니다.

$OutputString = 'Hello World'
$WScript = New-Object -ComObject 'wscript.shell'
$WScript.Run('notepad.exe') | Out-Null
do 
    {
    Start-Sleep -Milliseconds 100
    }
until ($WScript.AppActivate('notepad'))
$WScript.SendKeys($OutputString)

텍스트 출력 만 보내야합니다. 다른 데이터는 잠재적으로 제어 문자 (CTRL, ALT, DEL 등)로 해석됩니다.


0

다음은 작동 할 수있는 몇 가지 VBScript 기반 솔루션입니다 (하지만 정시에 앱을 여는 데 약간의 의존이 있음).

pipe2key.vbs-첫 번째 인수로 지정된 응용 프로그램을 연 다음 StdIn을 키 입력으로 보냅니다. wscript는 StdIn 액세스를 제공하지 않으므로 cscript.exe와 함께 사용해야합니다. 긴 문서의 경우 상당히 느리지 만 클립 보드를 방해하지 않습니다.

Set inPipe=wScript.StdIn
Set wShell=wScript.CreateObject("wscript.shell")
wShell.Run wScript.Arguments(0), 5 ' Execute specified app, foreground it's window
wScript.Sleep 500 ' Wait for app to load
KeysToEscape="{}[]()^+%"
KeysToDrop=vbLf
While Not inPipe.AtEndOfStream
    keyChar=inPipe.Read(1)
    If InStr(KeysToDrop, keyChar) = 0 Then
        If InStr(KeysToEscape, keyChar) > 0 Then
            wShell.SendKeys "{" & keyChar & "}"
        Else
            wShell.SendKeys keyChar
        End If
    End If
Wend

사용법 예 : diff file1.txt file2.txt | cscript pipe2key.vbs notepad.exe

또는 pasteinto.vbs. 앱을 시작한 후 CTRL-V 작업을 자동화합니다 (따라서 이전 답변에서 언급 한 'clip'명령 사용). pipe2key.vbs보다 상당히 빠르고 깨끗합니다.하지만 프로세스는 클립 보드를 덮어 씁니다.

Set wShell=wScript.CreateObject("wscript.shell")
wShell.Run wScript.Arguments(0), 5 ' Execute specified app, foreground it's window
wScript.Sleep 500 ' Wait for app to load
wShell.SendKeys "^v"

사용법 예 : diff file1.txt file2.txt | clip && pasteinto notepad.exe


-1

이 "아마도"와 같은 것이 작동합니다.

아, 나중에 이것이 매번 수동으로 할 일이라는 것을 몰랐습니다 (소리에서). 프로세스 속도를 높이기 위해 매번 일종의 매크로 또는 매크로를 만들 수 있습니다. 확실하지 않습니다.

diff file1.txt file2.txt > file.txt | sleep 1 | notepad.exe file.txt | rm file.txt

diff 작업의 전체를로드하려면 diff 내용을 file.txt에 작성해야합니다. 이 경우 파이프 작동간에 어떻게 든 일시 중지 할 수있는 방법이있을 수 있습니다.


5
목표는 임시 파일을 만들지 않는 것입니다. 구문에 문제가 있다고 확신합니다.;)
Der Hochstapler

"나중에 쉽게 검토하고 편집 할 수 있도록"원하는 것이 무엇인지 알았습니다. Rev1.0이 지적하고 수정 한대로 작동합니다. 그러나 이것은 cygwin이 동일한 결과를 가질 지 확실하지 않습니다.
Codezilla

3
실제로는 이러한 호출 사이에 "piped"할 필요가 없기 때문에 &가 적당하기 때문입니다.
Rev1.0

3
@ Rev1.0 맞습니다. &, &&||함께 체인의 명령에 운영자입니다. 명령이 0이 아닌 리턴 값을 생성하는 경우 3은 모두 진행 방식에서 다르게 작동합니다. 한 프로그램에서 다른 프로그램으로 출력 |파이프 하는 데 사용되므로 완전히 다릅니다 . 결과는 원하는 결과 일 수도 있지만 체인 연산자 중 하나를 사용하면 의도에 따라 더 명확 해집니다.이 예에서는 실제 배관이 필요하지 않기 때문입니다. 추가 참조 : microsoft.com/resources/documentation/windows/xp/all/proddocs/…
Der Hochstapler

1
@ Codezilla 내 게시물의 아이디어는 귀하의 아이디어와 매우 유사하다고 생각하지만 유효한 명령 프롬프트 구문입니다.
케이시

-3

내 언어는 영어가 아니므로 실수해서 죄송합니다.

나는 열린 메모장에 출력을 직접 넣을 수 없다고 생각합니다. 내가 틀렸을 수도 있습니다. 작업하려면 출력이 포함 된 파일을 작성해야합니다. 명령 티는 출력을 두 개로 파이프하거나 동시에 더 많은 명령 또는 파일 일 수 있습니다.

남자 티

출력을 파일로 다시 작성할 때 >> 대신>를 사용하는 것을 잊지 마십시오. >는 파일을 덮어 쓰고 >>는 해당 파일에 이미있는 내용이 있으면 출력을 추가합니다.


1
tee일반적으로 Windows에서는 사용할 수 없으며이 경우에도이 문제를 해결하는 데 도움이되지 않습니다.
Der Hochstapler

-4

메모장이 너무 제한되어 있습니다! 더 나은 아직 ... Cygwin을 설치 하고 Windows 의이 "기능 부족"모두 해결 방법. 그런 다음 이미 알고있는 명령을 사용할 수 있습니다.

AFAIK, 파이프 라인을 지원하는 Windows 프로그램은 거의 없으며 GUI 프로그램의 경우 더 나쁩니다.

"windows tail"프로그램 중 하나에 기능 요청을 열어서 추가 할 수 있습니다.


2
이미 cygwin을 사용하고 있습니다. 이것은 실제로 메모장과의 상호 작용과 관련된 문제입니다.
Der Hochstapler


1
@emodendroket 가끔 사람들이 일을 위해 잘못된 도구를 사용하고 ... 거의 모든 경우에 대해 메모장은 잘못된 도구입니다. 너무 간단하고 제한적입니다 :)
higuita

1
@higuita 저는 헌신적 인 Emacs 사용자이지만 때로는 메모장이 내가하고 싶은 일에 더 좋은 도구입니다.
케이시
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.