コンソール出力をメモ帳に直接パイプするにはどうすればよいですか?


47

コマンドプロンプトまたはGitシェルでアプリケーションを実行しているので、後で簡単に確認して編集できるように、出力をメモ帳に入れたいと思います。

私は次のことを試しましたが、メモ帳の空のインスタンスを常に取得します。

diff file1.txt file2.txt | notepad

出力を別のファイルにリダイレクトし、そのファイルをメモ帳で開くことができることを認識しています。Windows以外のシステムではVim以下にパイプするのに慣れているだけなので、余分なステップは避けたいと思います。


2
もちろん、moreWindowsでもパイプできます。
ゲイブ14年

1
ファイルにパイプして、新しいファイルパスを単にシェル実行するのはなぜですか。OSにプレゼンテーションアプリケーションを処理させます。メモ帳にする必要がありますか?
ガスドール14年

@Gusdor問題は、主に(一時的な)ファイルの作成を避けることです。
デアホッホシュプラー14年

1
メモ帳の機能は非常に限られているため、ほとんど何もできません。に精通しているのでvim、インストールするだけではどうですか?
思源レン

@CR自分のコンピューターでそれを行うことはできましたが、自分が所有していないコンピューターで定期的に作業しています。そのため、サードパーティのソフトウェアをインストールせずに、どのオプションが存在するかを知っておくと役立ちます。
デアホッホステープラー14年

回答:


63

私の知る限り、メモ帳に直接パイプする方法はありません。

ただし、INTOパイプをすることができclip、その後、ペースト、メモ帳にそうように:

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

次に、メモ帳でCtrl+ Vを押します。


3
出力をfile3.txtにリダイレクトし、それから動作し&& notepad file3.txtますか?
コネラック14年

4
@Konerakはい、それはうまくいくでしょうし、それは私が避けようとしていたことです(質問で説明されているように);)
Der Hochstapler 14年

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 14年

1
@OliverSalzburg gvimがWindowsで利用可能であることを提案しようとしていました。私は間違っていた。
TankorSmash 14年

-は、「stdinから読み取る」という意味でよく使用されるため、厳密にはに限定されませんvim。他の編集者が使用します-i(例kate)。
バクリウ14年

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、どこからでも電話をかけることができます!

これ、最新バージョンのWindows(Vista +)を使用しており、PowerShellを無効にしたり、.NETフレームワークをアンインストールしていないことを前提としていることに注意してください。つまり、デフォルトのWindowsインストールが機能します。


長い説明と代替案

私が考えることができる最も簡単な方法は、貼り付け(Ctrl+ V)アクションを自動化することです。少なくとも他の回答の1つは既に行っていますが、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スクリプトを作成する場合は、一時ファイルフォルダーにGuid名のファイルを作成し、完了したら削除します。ペーストの自動化はもろいようです(間違ったタイミングでフォーカスを失った場合など)?
ケーシー14年

@emodendroket残念ながら、ネイティブにサポートしていないプログラムにストリーム入力を強制しようとすると、本当にきれいなものはありません。一時ファイルの作成には、独自の(軽微な)欠点があります。実際には「新しいファイル」を取得しないため、Save変更された動作の終了と終了は異なります。メモ帳自体を置き換えるか、エディットコントロールにテキストを直接挿入する以外には、他の多くのオプションはありません。もちろん、この方法には、クリップボードの内容を上書きするという欠点があります(とにかく一時的なものであるはずです)。フォーカスを失うことは大きな問題ではないと思います。それは...だ
ボブ

...非常にまれな競合状態(ShowWindowキーストロークと送信の間)。そして、この方法を使用するには、もう少しセットアップ(スクリプトファイルの作成)が必要です。
ボブ14年

5

AutoHotkeyを使用してはどうですか?

次をstdin.ahk名前を付けて保存し、AutoHotkeyディレクトリに配置します。

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
ボブ14年

恐れ入ります。古典的な意味でのオーバーエンジニアリング。このスクリプトを誰がバージョン管理していますか?オートホットキーには商用アプリケーションのライセンスが必要ですか?誰がそれを監視しますか?
ガスドール14年

7
@Gusdorインターネット全体には、バージョン管理されていないコードスニペットがいっぱいです。この投稿の改訂履歴さえ持っているという利点があります。また、商用ライセンスがこの質問とどのように関係しているかわかりませんか?AHKは多くの人々に使用されおり、この回答が役立つと思うかもしれません。
slhck

@slhck有効性ではなく、このソリューションの落とし穴に注目していました。
ガスドール14年

@slhck:このサイトのコンテンツは、クリエイティブコモンズの対象です。
ブライアン14年

4

これは完全に可能です。試したところです。私はメモ帳がデフォルトでtxtファイルを開くように設定されていると仮定しています:

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

OK、技術的にはファイルを作成していますが、保存されません。

さらに配管することもオプションです。


4
注意してください-あなたがすでにoutput.txtこれを持っている場合、これはそれを覆します。わずかに安全なのはを使用すること%temp%/somerandomstring.txtです。
ボブ14年

出力ファイルを一時ディレクトリに保存する方が安全です。この答えを見てください。
-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

この「可能性のある」機能のようなもの。

ああ、yaは、これが毎回(その音から)手動でやっていることに気づいていませんでした。プロセスをスピードアップするために、毎回何らかのマクロまたは何かを作成して、あなたのためにそれを行うことができるかもしれません。それについてはわかりません。

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

diff操作全体を読み込むためには、file.txtへのdiffの内容の書き込みを終了する必要がありますが、実行するかどうかはわかりません。その場合、パイプ操作の間に何らかの方法で一時停止する方法があるかもしれません。


5
目標は一時ファイルを作成しないことであり、構文に問題があると確信しています;)
Der Hochstapler 14年

「後で簡単にレビューと編集を行うために」私はそれがあなたが望むものだと思いましたか?そして、Rev1.0が指摘し修正したように、それは機能します。これはDOS向けですが、cygwinが同じ結果になるかどうかはわかりません。
Codezilla

3
実際、これらの呼び出し間で「パイプ」する必要はないため、&で十分だと思います。
Rev1.0

3
@ Rev1.0正しい。&&&および||は、コマンドを一緒にチェーンする演算子です。コマンドが0以外の戻り値を生成した場合、3つすべての動作は異なります。|あるプログラムから別のプログラムに出力をパイプするために使用されるため、完全に異なります。結果は望みどおりかもしれませんが、チェーン演算子のいずれかを使用すると、その例では実際の配管が不要になるため、意図が明確になります。追加の参考のために:microsoft.com/resources/documentation/windows/xp/all/proddocs/...
デアHochstapler

1
@Codezilla私の投稿のアイディアはあなたのものにかなり似ていると思いますが、有効なコマンドプロンプト構文です。
ケーシー14年

-3

私の言語は英語ではないので、間違えて申し訳ありません。

出力を開いているメモ帳に直接置くことはできないと思います。私はそれについて間違っているかもしれません。作業するには、出力を含むファイルを作成する必要があります。コマンドティーは、出力を2つにパイプすることも、同時に複数のコマンドまたはファイルにすることもできます。

マンティー

出力をファイルに再構成するときは、代わりに>>を使用することを忘れないでください。>はファイルを上書きし、>>はそのファイルに既にあるものの後に出力を追加します。


1
tee通常、Windowsでは利用できません。利用できたとしても、この問題を解決することはできません。
デアホッホステープラー14年

-4

できません、メモ帳はこれには限定的です!いっそのこと... Cygwinをインストールし、Windowsのこの「機能不足」をすべて回避してください。その後、すでに知っているコマンドを使用できます。

私の知る限り、ごく少数のWindowsプログラムがパイプラインをサポートしていますが、GUIプログラムではさらに悪いことです。

それを追加するために、「windows tail」プログラムの1つに対する機能要求を開こうとすることができます。


2
すでにcygwinを使用しています。これは本当にメモ帳とのやり取りに特有の問題です。
デアホッホステープラー


1
@emodendroket時々人々は仕事に間違ったツールを使用します...そして、ほとんどの場合、メモ帳は間違ったツールであり、とてもシンプルで限定的です:)
higuita 14年

1
@higuita私は熱心なEmacsユーザーですが、時々、メモ帳は私がやりたいことのより良いツールです。
ケーシー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.