Съешь еще этих мягких французских булок, да выпей чаю.
Автор доподлинно неизвестен.
… не хочешь булок — есть плюшки. Точнее будут, ежели их испечь. Благо тесто оттенка общепитовских пельменей под названием 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]@'
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="423"
Height="370"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
Title="Butterfly">
<Path
Fill="Magenta"
Data="M204.33 139.83 C196.33 133.33 206.68 132.82 206.58 132.58
C192.33 97.08 169.35 81.41 167.58 80.58 C162.12 78.02
159.48 78.26 160.45 76.97 C161.41 75.68 167.72 79.72
168.58 80.33 C193.83 98.33 207.58 132.33 207.58 132.33
C207.58 132.33 209.33 133.33 209.58 132.58 C219.58 103.08
239.58 87.58 246.33 81.33 C253.08 75.08 256.63 74.47
247.33 81.58 C218.58 103.58 210.34 132.23 210.83 132.33
C222.33 134.83 211.33 140.33 211.83 139.83 C214.85 136.81
214.83 145.83 214.83 145.83 C214.83 145.83 231.83 110.83
298.33 66.33 C302.43 63.59 445.83 -14.67 395.83 80.83
C393.24 85.79 375.83 105.83 375.83 105.83 C375.83 105.83
377.33 114.33 371.33 121.33 C370.3 122.53 367.83 134.33
361.83 140.83 C360.14 142.67 361.81 139.25 361.83 140.83
C362.33 170.83 337.76 170.17 339.33 170.33 C348.83 171.33
350.19 183.66 350.33 183.83 C355.83 190.33 353.83 191.83
355.83 194.83 C366.63 211.02 355.24 210.05 356.83 212.83
C360.83 219.83 355.99 222.72 357.33 224.83 C360.83 230.33
354.75 233.84 354.83 235.33 C355.33 243.83 349.67 240.73
349.83 244.33 C350.33 255.33 346.33 250.83 343.83 254.83
C336.33 266.83 333.46 262.38 332.83 263.83 C329.83 270.83
325.81 269.15 324.33 270.83 C320.83 274.83 317.33 274.83
315.83 276.33 C308.83 283.33 304.86 278.39 303.83 278.83
C287.83 285.83 280.33 280.17 277.83 280.33 C270.33 280.83
271.48 279.67 269.33 277.83 C237.83 250.83 219.33 211.83
215.83 206.83 C214.4 204.79 211.35 193.12 212.33 195.83
C214.33 201.33 213.33 250.33 207.83 250.33 C202.33 250.33
201.83 204.33 205.33 195.83 C206.43 193.16 204.4 203.72
201.79 206.83 C196.33 213.33 179.5 250.83 147.59 277.83
C145.42 279.67 146.58 280.83 138.98 280.33 C136.46 280.17
128.85 285.83 112.65 278.83 C111.61 278.39 107.58 283.33
100.49 276.33 C98.97 274.83 95.43 274.83 91.88 270.83
C90.39 269.15 86.31 270.83 83.27 263.83 C82.64 262.38
79.73 266.83 72.13 254.83 C69.6 250.83 65.54 255.33 66.05
244.33 C66.22 240.73 60.48 243.83 60.99 235.33 C61.08
233.84 54.91 230.33 58.45 224.83 C59.81 222.72 54.91
219.83 58.96 212.83 C60.57 210.05 49.04 211.02 59.97
194.83 C62 191.83 59.97 190.33 65.54 183.83 C65.69 183.66
67.06 171.33 76.69 170.33 C78.28 170.17 53.39 170.83 53.9
140.83 C53.92 139.25 55.61 142.67 53.9 140.83 C47.82
134.33 45.32 122.53 44.27 121.33 C38.19 114.33 39.71
105.83 39.71 105.83 C39.71 105.83 22.08 85.79 19.46 80.83
C-31.19 -14.67 114.07 63.59 118.22 66.33 C185.58 110.83
202 145.83 202 145.83 C202 145.83 202.36 143.28 203
141.83 C203.64 140.39 204.56 140.02 204.33 139.83 z" />
</Window>
'@))).ShowDialog()
Надоело быть художником, почему бы себя не попробовать на поприще фоторедактора?
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()
Плюшки найдутся для каждого.
Автор: gregzakharov