PowerShell: за гранью. Часть пятая
Съешь еще этих мягких французских булок, да выпей чаю.Автор доподлинно неизвестен.
… не хочешь булок — есть плюшки. Точнее будут, ежели их испечь. Благо тесто оттенка общепитовских пельменей под названием PowerShell согласно рецептам на упаковке является если не универсальным, то многоцелевым точно. И не беда, что под рукой не оказалось изюма с маком, в умелых руках плюшки и из синюшнего теста могут быть пышными и румяными.Хотя постойте, одна плюшка уже есть, правда за ходом времени она несколько заветрилась и почерствела, но все же не утратила своей привлекательности. PS C:\> man Write-Progress -Detailed Ладно, давайте отщипнем трошки теста и попробуем создать свое кулинарное чудо. $line = { param ( [Int32]$x, [Int32]$y, [String]$text = $null, [ConsoleColor]$fc, #цвет текста [ConsoleColor]$bc #цвет фона ) begin { $raw = $host.UI.RawUI $old = $raw.WindowPosition $con = $raw.WindowSize } process { $pos = $old $pos.X += $x $pos.Y += if ($y -lt 0) { $con.Height + $y } else { $y } switch ([String]:: IsNullOrEmpty ($text)) { $true { $text = [String][Char]32 * $con.Width } $false { $text += [String][Char]32 * ($con.Width — $text.Length) } } $row = $raw.NewBufferCellArray (@($text), $fc, $bc) } end { $raw.SetBufferContents ($pos, $row) } } Вот такая лямбда-плюшка. Распробуем на вкус? & $line 0 -3 'Awaiting orders' 'Blue' 'White' & $line 0 -2 ' [Q] Quit [C] Continue' 'Black' 'White' if (($res = Read-Host 'What I should to do?') -eq 'q') { 'Quit…' } elseif ($res -eq 'c') { 'Continue…' } Недурственно? Пожалуй, и все же чего-то не хватет. Может добавить глазури? if ($host.Runspace.ApartmentState -ne 'STA') { powershell /noprofile /sta $MyInvocation.MyCommand.Path return }
Add-Type -AssemblyName PresentationFramework
$wnd = New-Object Windows.Window $ink = New-Object Windows.Controls.InkCanvas
$ink.MinWidth = $ink.MinHeight = 100
$wnd.Content = $ink $wnd.SizeToContent = 'WidthAndHeight' $wnd.Title = 'Drawing Board' [void]$wnd.ShowDialog () Хм, а зачем, собственно, пекарю доска для рисования? Или это попытка переквалифицироваться из пекаря в художники? Почему бы и нет?!
Рисуем? if ($host.Runspace.ApartmentState -ne 'STA') { powershell /noprofile /sta $MyInvocation.MyCommand.Path return }
Add-Type -AssemblyName PresentationFramework
[void][Windows.Markup.XamlReader]:: Load (
(New-Object Xml.XmlNodeReader ([xml]@'
Add-Type -AssemblyName System.Drawing
$img = [Drawing.Image]:: FromFile ('orig.png') $bmp = New-Object Drawing.Bitmap $img
$ia = New-Object Drawing.Imaging.ImageAttributes $cm = New-Object Drawing.Imaging.ColorMatrix $cm.Matrix40 = $cm.Matrix41 = $cm.Matrix42 = 1 $cm.Matrix00 = $cm.Matrix11 = $cm.Matrix22 = -1 $ia.SetColorMatrix ($cm)
$gfx = [Drawing.Graphics]:: FromImage ($bmp) $gfx.DrawImage ( $bmp, (New-Object Drawing.Rectangle 0, 0, $bmp.Width, $bmp.Height), 0, 0, $bmp.Width, $bmp.Height, [Drawing.GraphicsUnit]:: Pixel, $ia ) $gfx.Flush ()
$bmp.Save ( ($fs = New-Object IO.FileStream ('negate.png', [IO.FileMode]:: Create)), $img.RawFormat )
$fs.Close () $img.Dispose () Плюшки найдутся для каждого.