How can I pipe console output directly to Notepad?
From what I can tell, there is no way to directly pipe into Notepad.
However, you can pipe into clip
and then paste in notepad, like so:
diff file1.txt file2.txt | clip && notepad
Then just press Ctrl+V in Notepad.
Consider using Vim, or in your case gVim if you prefer a graphical environment.
You can then pipe into it with a single hyphen as an argument, which instructs Vim/gVim to read from standard input.
diff file1.txt file2.txt | gvim -
here's a short Windows program that does it properly (without clobbering the clipboard). It should be adaptable to PowerShell, and I might update this answer if I get the time, but you can also just use that program directly.
Well, how about PowerShell? No need to install another application. Unfortunately, you will need to create a script file somewhere in your PATH
...
Short version you can use
If you create a batch file (e.g. ShowInNotepad.bat
) with the following contents and place it in your PATH
somewhere:
@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');
you can then just call echo blah | ShowInNotepad
from anywhere!
Note that this does assume that you're using a recent-ish version of Windows (Vista+) and have not disabled PowerShell or uninstalled the .NET framework. In other words, a default Windows installation will work.
Lengthy explanation and alternatives
The easiest way I can think of is to automate the paste (Ctrl+V) action. Which at least one other answer is already doing, but that one uses AHK - you might have better luck getting PowerShell to work in a locked-down corporate environment.
Let's get on with the script, yea?
#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');
It's pretty straightforward, so I won't bother explaining the script more than the comments already do.
Usage
To use it, you just need to place the script in a .ps1
file (e.g. ShowInNotepad.ps1
), place it somewhere in your PATH
and then call powershell ShowInNotepad.ps1
after placing the text you want to display in the clipboard.
Example:
echo blah | clip && powershell ShowInNotepad.ps1
Unfortunately, executing PowerShell scripts can sometimes be difficult (execution policies and all). Therefore, I've condensed this script to a one-liner you can call directly from the Command Prompt, or even place into a batch file:
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');
If you create a batch file (e.g. ShowInNotepad.bat
) with the following contents and place it in your PATH
somewhere:
@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');
you can then just call echo blah | ShowInNotepad
from anywhere!