在前一个技能里我们演示了如何将文本发送到一个全新的记事本实例中。今天,您会获得一个增强版的 Out-Notepad
:您现在可以通过管道传输任何东西到记事本了。如果内容不是字符串,Out-Notepad
会使用内置的 PowerShell ETS 将它转换为文本并且合适地显示出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| function Out-Notepad { param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [Object] [AllowEmptyString()] $Object,
[Int] $Width = 150 )
begin { $al = New-Object System.Collections.ArrayList }
process { $null = $al.Add($Object) } end { $text = $al | Format-Table -AutoSize -Wrap | Out-String -Width $Width
$process = Start-Process notepad -PassThru $null = $process.WaitForInputIdle()
$sig = ' [DllImport("user32.dll", EntryPoint = "FindWindowEx")]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll")]public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); '
$type = Add-Type -MemberDefinition $sig -Name APISendMessage2 -PassThru $hwnd = $process.MainWindowHandle [IntPtr]$child = $type::FindWindowEx($hwnd, [IntPtr]::Zero, "Edit", $null) $null = $type::SendMessage($child, 0x000C, 0, $text) } }
|
您现在可以通过管道传输任何东西到 Out-Notepad
。它将原样显示:
PS C:\> Get-Content $env:windir\system32\drivers\etc\hosts | Out-Notepad
如果您通过管道传送对象,Out-Notepad
会将它们转换为文本并且不会截断任何东西。您可能会希望用 -Width
参数来确定页宽,以便正常显示:
PS C:\> Get-EventLog -LogName System -EntryType Error, Warning -Newest 10 | Out-Notepad -Width 130
另外您可能需要最大化记事本或禁用换行来查看正确的格式。