Aquí hay un breve programa de Windows que lo hace correctamente (sin golpear el portapapeles). Debería ser adaptable a PowerShell, y podría actualizar esta respuesta si tengo tiempo, pero también puede usar ese programa directamente.
Bueno, ¿qué tal PowerShell? No es necesario instalar otra aplicación. Desafortunadamente, usted tendrá que crear un archivo de script en alguna parte en su PATH
...
Versión corta que puedes usar
Si crea un archivo por lotes (por ejemplo ShowInNotepad.bat
) con los siguientes contenidos y lo coloca en su PATH
lugar:
@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');
¡entonces puedes llamar echo blah | ShowInNotepad
desde cualquier lugar!
Tenga en cuenta que esto no suponerse que se está utilizando una versión reciente-ish de Windows (Vista +) y no se ha desactivado PowerShell o desinstalado el marco .NET. En otras palabras, una instalación predeterminada de Windows funcionará.
Explicación larga y alternativas
La forma más fácil que se me ocurre es automatizar la acción de pegar ( Ctrl+ V). Lo que al menos otra respuesta ya está haciendo, pero esa usa AHK: es posible que tenga más suerte al hacer que PowerShell funcione en un entorno corporativo bloqueado.
Sigamos con el guión, ¿sí?
#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');
Es bastante sencillo, por lo que no me molestaré en explicar el guión más de lo que ya lo hacen los comentarios.
Uso
Para usarlo, solo necesita colocar el script en un .ps1
archivo (por ejemplo ShowInNotepad.ps1
), colocarlo en algún lugar de su PATH
y luego llamar powershell ShowInNotepad.ps1
después de colocar el texto que desea mostrar en el portapapeles.
Ejemplo:
echo blah | clip && powershell ShowInNotepad.ps1
Desafortunadamente, ejecutar scripts de PowerShell a veces puede ser difícil (políticas de ejecución y todo). Por lo tanto, he condensado este script en una línea que puede llamar directamente desde el Símbolo del sistema, o incluso colocarlo en un archivo por lotes:
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');
Si crea un archivo por lotes (por ejemplo ShowInNotepad.bat
) con los siguientes contenidos y lo coloca en su PATH
lugar:
@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');
¡entonces puedes llamar echo blah | ShowInNotepad
desde cualquier lugar!
more
en Windows.