tag:blogger.com,1999:blog-40928063901066518272024-02-20T17:09:06.688-08:00$thoughts | Out-WebMy adventures with Windows PowerShellHillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-4092806390106651827.post-86400431847976259132010-11-12T06:46:00.000-08:002010-11-12T07:54:27.288-08:00Select-MultipleWhere I work, we have a policy that before anyone on the team commits changes to the repository, a code review needs to be done. All the other member of my team use TortoiseSVN, so they just use the option to display modifications and then double-click on each file to show a diff with the base. I stubbornly insist on do everything from the command-line, so what I usually do is run this command, which uses WinMerge to show the differences for all of my modified files:
<br /><br />
<img src="http://farm5.static.flickr.com/4071/5169671214_b0930144c4_z.jpg" />
<br /><br />
This usually works just fine, but it has a couple of drawbacks. The main problem is that it shows a diff for every modified file, including project files. Sometimes, even if the majority of the files are source files, my code review really only concerns a subset of the files that I have modified, but my loop above dutifully runs WinMerge for every file, forcing my colleagues to waste precious seconds while I dismiss the files they aren't interested in.
<br /><br />
Enter the Select-Multiple script. Objects piped into Select-Multiple are displayed in a kind of selection window with a "check box" to the left of each object. The list can be navigated with the arrow keys and options can be selected with the space bar. After the list is dismissed with the enter key, the selected objects are passed through to the pipeline. Here's what it looks like in action:
<br /><br />
<img src="http://farm5.static.flickr.com/4017/5169071381_9e69dd89d8_o.png" />
<br /><br />
If you want to display a certain property of the objects passed in to Select-Multiple, you can use the Property parameter:
<br /><br />
<img src="http://farm2.static.flickr.com/1218/5169671240_de0b320e50_z.jpg" />
<br /><br />
Even if you use the Property parameter, the complete object is passed through the pipeline. The above example would stop the Internet Explorer process.
<br /><br />
There are a few keyboard shortcuts to aid in selecting objects. Page up and page down will navigate long lists a page at a time. Control-A will select everything, and Control-T will toggle the selection. Holding down shift while using the up and down arrow keys will select while moving. Escape will dismiss the window without selecting anything.
<br /><br />
Here is the complete script:
<br /><br />
<div style='width: 100%; height: 400px; overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #008000'># Select-Multiple</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># Objects piped into Select-Multiple are displayed in a kind of</span><br />
<span style='color: #008000'># selection window with a "check box" to the left of each object.</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># The list can be navigated with the arrow keys and options </span><br />
<span style='color: #008000'># can be selected with the space bar.</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># If the Property parameter is provided, the value of that</span><br />
<span style='color: #008000'># property is displayed in the list, rather than the string</span><br />
<span style='color: #008000'># representation of the object.</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># After the list is dismissed with the enter key, the selected</span><br />
<span style='color: #008000'># objects are passed through to the pipeline.</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># Keyboard operations:</span><br />
<span style='color: #008000'># Up/Down - navigate</span><br />
<span style='color: #008000'># Space - select current option</span><br />
<span style='color: #008000'># Page Up/Down - navigate long lists a page at a time</span><br />
<span style='color: #008000'># Ctrl-A - select all</span><br />
<span style='color: #008000'># Ctrl-T - toggle selection</span><br />
<span style='color: #008000'># Shift-Up/Down - select and move</span><br />
<span style='color: #008000'># Escape - exit with no objects selected</span><br />
<br />
<span style='color: #008000'># configuration </span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>ForegroundColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>ForegroundColor<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BackgroundColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>BackgroundColor<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BorderForegroundColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>BackgroundColor<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BorderBackgroundColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>ForegroundColor<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>=</span> [ConsoleColor]<span style='color: #800000'>"White"</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor <span style='color: #C86400'>=</span> [ConsoleColor]<span style='color: #800000'>"Red"</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>StatusFormatString <span style='color: #C86400'>=</span> <span style='color: #800000'>"[X]: {0}/{1}"</span><br />
<br />
<span style='color: #C86400'>function</span> Select-Multiple( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$Property</span> )<br />
{<br />
<span style='color: #C86400'>begin</span><br />
{<br />
<span style='color: #000080'>$options</span> <span style='color: #C86400'>=</span> @()<br />
<span style='color: #008000'># leave room for the border and "check box"</span><br />
<span style='color: #000080'>$maxLength</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>WindowSize<span style='color: #C86400'>.</span>Width <span style='color: #C86400'>-</span> <span style='color: #800000'>2</span> <span style='color: #C86400'>-</span> <span style='color: #800000'>6</span>;<br />
<br />
<span style='color: #C86400'>function</span> Make-Option( [object] <span style='color: #000080'>$object</span> )<br />
{<br />
<span style='color: #000080'>$object</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Select-Object</span> <span style='color: #C86400'>`</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Selected"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$false</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Object"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$object</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"String"</span>;<br />
Expression <span style='color: #C86400'>=</span> {<br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$Property</span> )<br />
{<br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> ( <span style='color: #C86400'>Invoke-Expression</span> <span style='color: #800000'>"`$object.$Property"</span> )<span style='color: #C86400'>.</span>ToString()<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$object</span><span style='color: #C86400'>.</span>ToString()<br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$string</span><span style='color: #C86400'>.</span>Length <span style='color: #C86400'>-gt</span> <span style='color: #000080'>$maxLength</span> )<br />
{<br />
<span style='color: #008000'># add elipsis...</span><br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <br />
<span style='color: #000080'>$string</span><span style='color: #C86400'>.</span>SubString( <span style='color: #800000'>0</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$maxLength</span> <span style='color: #C86400'>-</span> <span style='color: #800000'>3</span> )<span style='color: #C86400'>.</span>PadRight( <span style='color: #000080'>$maxLength</span><span style='color: #C86400'>,</span> <span style='color: #800000'>'.'</span> )<br />
}<br />
<br />
<span style='color: #000080'>$string</span><br />
} }<br />
}<br />
}<br />
<br />
<span style='color: #C86400'>process</span><br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$_</span> )<br />
{<br />
<span style='color: #000080'>$options</span> <span style='color: #C86400'>+=</span> Make-Option <span style='color: #000080'>$_</span><br />
}<br />
}<br />
<br />
<span style='color: #C86400'>end</span><br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$options</span><span style='color: #C86400'>.</span>Length <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
Show-Options <span style='color: #000080'>$options</span><br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$option</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$options</span> )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected )<br />
{<br />
<span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Object<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Show-Options( [object[]] <span style='color: #000080'>$options</span> )<br />
{<br />
<span style='color: #C86400'>begin</span><br />
{<br />
<span style='color: #C86400'>function</span> Get-KeyboardInput( <span style='color: #000080'>$state</span> )<br />
{<br />
<span style='color: #000080'>$keyOptions</span> <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Management<span style='color: #C86400'>.</span>Automation<span style='color: #C86400'>.</span>Host<span style='color: #C86400'>.</span>ReadKeyOptions] <span style='color: #C86400'>`</span><br />
<span style='color: #800000'>"NoEcho, IncludeKeyDown, IncludeKeyUp"</span><br />
<br />
<span style='color: #000080'>$done</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
<br />
<span style='color: #C86400'>while</span> ( <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>KeyAvailable )<br />
{<br />
<span style='color: #000080'>$key</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>ReadKey( <span style='color: #000080'>$keyOptions</span> )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$key</span><span style='color: #C86400'>.</span>KeyDown )<br />
{<br />
<span style='color: #000080'>$shiftPressed</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$key</span><span style='color: #C86400'>.</span>ControlKeyState<span style='color: #C86400'>.</span>ToString() <span style='color: #C86400'>-match</span> <span style='color: #800000'>"ShiftPressed"</span><br />
<span style='color: #000080'>$controlPressed</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$key</span><span style='color: #C86400'>.</span>ControlKeyState<span style='color: #C86400'>.</span>ToString() <span style='color: #C86400'>-match</span> <span style='color: #800000'>"CtrlPressed"</span><br />
<br />
<span style='color: #C86400'>switch</span> ( <span style='color: #000080'>$key</span><span style='color: #C86400'>.</span>VirtualKeyCode )<br />
{<br />
<span style='color: #800000'>38</span> { <span style='color: #008000'># up arrow</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
Move-Up <span style='color: #000080'>$state</span> <span style='color: #000080'>$shiftPressed</span><br />
}<br />
<span style='color: #C86400'>break</span><br />
}<br />
<span style='color: #800000'>40</span> { <span style='color: #008000'># down arrow</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>-lt</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>TotalOptions <span style='color: #C86400'>-</span> <span style='color: #800000'>1</span> )<br />
{<br />
Move-Down <span style='color: #000080'>$state</span> <span style='color: #000080'>$shiftPressed</span><br />
}<br />
<span style='color: #C86400'>break</span><br />
}<br />
<span style='color: #800000'>33</span> { <span style='color: #008000'># page up</span><br />
Page-Up <span style='color: #000080'>$state</span><br />
<span style='color: #C86400'>break</span><br />
}<br />
<span style='color: #800000'>34</span> { <span style='color: #008000'># page down</span><br />
Page-down <span style='color: #000080'>$state</span><br />
<span style='color: #C86400'>break</span><br />
}<br />
<span style='color: #800000'>65</span> { <span style='color: #008000'># 'a' - select all</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$controlPressed</span> )<br />
{<br />
Select-All <span style='color: #000080'>$state</span><br />
}<br />
<span style='color: #C86400'>break</span><br />
}<br />
<span style='color: #800000'>84</span> { <span style='color: #008000'># 't' - toggle selection</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$controlPressed</span> )<br />
{<br />
Toggle-Selection <span style='color: #000080'>$state</span><br />
}<br />
<span style='color: #C86400'>break</span><br />
}<br />
<span style='color: #800000'>32</span> { <span style='color: #008000'># space - toggle current option</span><br />
Select-Current <span style='color: #000080'>$state</span> <span style='color: #000080'>$true</span><br />
}<br />
<span style='color: #800000'>13</span> { <span style='color: #008000'># enter</span><br />
<span style='color: #000080'>$done</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
}<br />
<span style='color: #800000'>27</span> { <span style='color: #008000'># escape</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$option</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Options )<br />
{<br />
<span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
}<br />
<br />
<span style='color: #000080'>$done</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
}<br />
}<br />
}<br />
}<br />
<br />
<span style='color: #000080'>$done</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Move-Up( <span style='color: #000080'>$state</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$shiftPressed</span> )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$shiftPressed</span> )<br />
{<br />
Select-Current <span style='color: #000080'>$state</span> <span style='color: #000080'>$false</span><br />
}<br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>ForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BackgroundColor<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>-</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset <span style='color: #C86400'>-eq</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #C86400'>-</span><span style='color: #C86400'>-</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset<br />
Draw-Options <span style='color: #000080'>$state</span><br />
}<br />
<br />
<span style='color: #C86400'>-</span><span style='color: #C86400'>-</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex<br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$shiftPressed</span> )<br />
{<br />
Select-Current <span style='color: #000080'>$state</span> <span style='color: #000080'>$false</span><br />
}<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Move-Down( <span style='color: #000080'>$state</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$shiftPressed</span> )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$shiftPressed</span> )<br />
{<br />
Select-Current <span style='color: #000080'>$state</span> <span style='color: #000080'>$false</span><br />
}<br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>ForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BackgroundColor<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>-</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>MaxOptions )<br />
{<br />
<span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset<br />
Draw-Options <span style='color: #000080'>$state</span><br />
}<br />
<br />
<span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex<br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$shiftPressed</span> )<br />
{<br />
Select-Current <span style='color: #000080'>$state</span> <span style='color: #000080'>$false</span><br />
}<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Page-Up( <span style='color: #000080'>$state</span> )<br />
{<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>ForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BackgroundColor<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset )<br />
{<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset <span style='color: #C86400'>-=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>MaxOptions<br />
<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset <span style='color: #C86400'>=</span> [Math]<span style='color: #C86400'>::</span>Max( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset<span style='color: #C86400'>,</span> <span style='color: #800000'>0</span> )<br />
}<br />
<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset<br />
<br />
Draw-Options <span style='color: #000080'>$state</span><br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Page-Down( <span style='color: #000080'>$state</span> )<br />
{<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>ForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BackgroundColor<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>MaxOptions <span style='color: #C86400'>+</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset )<br />
{<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset <span style='color: #C86400'>+=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>MaxOptions<br />
<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset <span style='color: #C86400'>=</span> [Math]<span style='color: #C86400'>::</span>Min( <br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset<span style='color: #C86400'>,</span><br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>TotalOptions <span style='color: #C86400'>-</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>MaxOptions <span style='color: #C86400'>-</span> <span style='color: #800000'>1</span> )<br />
}<br />
<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>MaxOptions <span style='color: #C86400'>+</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset<br />
<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>=</span> [Math]<span style='color: #C86400'>::</span>Min( <br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex<span style='color: #C86400'>,</span><br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>TotalOptions <span style='color: #C86400'>-</span> <span style='color: #800000'>1</span> )<br />
<br />
Draw-Options <span style='color: #000080'>$state</span><br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Select-All( <span style='color: #000080'>$state</span> )<br />
{<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$option</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Options )<br />
{<br />
<span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
}<br />
<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedOptions <span style='color: #C86400'>=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>TotalOptions<br />
<br />
Draw-Options <span style='color: #000080'>$state</span><br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Toggle-Selection( <span style='color: #000080'>$state</span> )<br />
{<br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedOptions <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$option</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Options )<br />
{<br />
<span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected <span style='color: #C86400'>=</span> <span style='color: #C86400'>-not</span> <span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected )<br />
{<br />
<span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedOptions<br />
}<br />
}<br />
<br />
Draw-Options <span style='color: #000080'>$state</span><br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Select-Current( <span style='color: #000080'>$state</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$toggleSelection</span> )<br />
{<br />
<span style='color: #000080'>$option</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Options[ <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex ]<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$toggleSelection</span> )<br />
{<br />
<span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected <span style='color: #C86400'>=</span> <span style='color: #C86400'>-not</span> <span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected )<br />
{<br />
<span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedOptions<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #C86400'>-</span><span style='color: #C86400'>-</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedOptions<br />
}<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>-not</span> <span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected )<br />
{<br />
<span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedOptions<br />
}<br />
<br />
<span style='color: #000080'>$option</span><span style='color: #C86400'>.</span>Selected <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
}<br />
<br />
Draw-Options <span style='color: #000080'>$state</span><br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Draw-Options( <span style='color: #000080'>$state</span> )<br />
{<br />
<span style='color: #000080'>$optionStrings</span> <span style='color: #C86400'>=</span> @( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Options )[ <br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset <span style='color: #C86400'>..</span> <br />
( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>MaxOptions <span style='color: #C86400'>+</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset ) ] <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Selected )<br />
{<br />
<span style='color: #800000'>" [X] $($_.String) "</span><span style='color: #C86400'>.</span>PadRight( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Width ) <br />
}<br />
<span style='color: #C86400'>else</span><br />
{ <br />
<span style='color: #800000'>" [ ] $($_.String) "</span><span style='color: #C86400'>.</span>PadRight( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Width )<br />
}<br />
}<br />
<br />
<span style='color: #000080'>$status</span> <span style='color: #C86400'>=</span> ( <span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>StatusFormatString <span style='color: #C86400'>-f</span> <br />
<span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedOptions<span style='color: #C86400'>,</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>TotalOptions )<span style='color: #C86400'>.</span>PadRight( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Width )<br />
<br />
<span style='color: #000080'>$statusBuffer</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>NewBufferCellArray(<br />
@( <span style='color: #000080'>$status</span> )<span style='color: #C86400'>,</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BorderForegroundColor<span style='color: #C86400'>,</span> <span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BorderBackgroundColor )<br />
<br />
<span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>SetBufferContents( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>StatusPosition<span style='color: #C86400'>,</span> <span style='color: #000080'>$statusBuffer</span> )<br />
<br />
<span style='color: #000080'>$optionsBuffer</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>NewBufferCellArray(<br />
@( <span style='color: #000080'>$optionStrings</span> )<span style='color: #C86400'>,</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>ForegroundColor<span style='color: #C86400'>,</span> <span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BackgroundColor )<br />
<br />
<span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>SetBufferContents( <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>OptionsPosition<span style='color: #C86400'>,</span> <span style='color: #000080'>$optionsBuffer</span> )<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Set-SelectionColors( <span style='color: #000080'>$state</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$foregroundColor</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$backgroundColor</span> )<br />
{<br />
<span style='color: #000080'>$position</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>OptionsPosition<br />
<span style='color: #000080'>$position</span><span style='color: #C86400'>.</span>Y <span style='color: #C86400'>+=</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>SelectedIndex <span style='color: #C86400'>-</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Offset<br />
<br />
<span style='color: #000080'>$rectangle</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Management<span style='color: #C86400'>.</span>Automation<span style='color: #C86400'>.</span>Host<span style='color: #C86400'>.</span>Rectangle <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$position</span><span style='color: #C86400'>.</span>X<span style='color: #C86400'>,</span> <span style='color: #000080'>$position</span><span style='color: #C86400'>.</span>Y<span style='color: #C86400'>,</span> ( <span style='color: #000080'>$position</span><span style='color: #C86400'>.</span>X <span style='color: #C86400'>+</span> <span style='color: #000080'>$state</span><span style='color: #C86400'>.</span>Width <span style='color: #C86400'>-</span> <span style='color: #800000'>1</span> )<span style='color: #C86400'>,</span> <span style='color: #000080'>$position</span><span style='color: #C86400'>.</span>Y<br />
<br />
<span style='color: #000080'>$optionBuffer</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>GetBufferContents( <span style='color: #000080'>$rectangle</span> )<br />
<br />
<span style='color: #000080'>$contents</span> <span style='color: #C86400'>=</span> @( <span style='color: #404040'>[string]</span><span style='color: #C86400'>::</span>Join( <span style='color: #800000'>""</span><span style='color: #C86400'>,</span> <br />
( <span style='color: #000080'>$optionBuffer</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>ForEach-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Character } ) ) )<br />
<br />
<span style='color: #000080'>$optionBuffer</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>NewBufferCellArray( <br />
<span style='color: #000080'>$contents</span><span style='color: #C86400'>,</span> <br />
<span style='color: #000080'>$foregroundColor</span><span style='color: #C86400'>,</span> <br />
<span style='color: #000080'>$backgroundColor</span> )<br />
<br />
<span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>SetBufferContents( <span style='color: #000080'>$position</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$optionBuffer</span> )<br />
}<br />
}<br />
<br />
<span style='color: #C86400'>end</span><br />
{<br />
<span style='color: #000080'>$width</span> <span style='color: #C86400'>=</span> @( <span style='color: #000080'>$options</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>String } <span style='color: #C86400'>|</span><br />
<span style='color: #C86400'>Sort-Object</span> Length -Descending )[ <span style='color: #800000'>0</span> ]<span style='color: #C86400'>.</span>Length <span style='color: #C86400'>+</span> <span style='color: #800000'>4</span><br />
<br />
<span style='color: #000080'>$width</span> <span style='color: #C86400'>=</span> [Math]<span style='color: #C86400'>::</span>Max( <br />
<span style='color: #000080'>$width</span><span style='color: #C86400'>,</span> <br />
( <span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>StatusFormatString <span style='color: #C86400'>-f</span> <span style='color: #000080'>$options</span><span style='color: #C86400'>.</span>Length<span style='color: #C86400'>,</span> <span style='color: #000080'>$options</span><span style='color: #C86400'>.</span>Length )<span style='color: #C86400'>.</span>Length <span style='color: #C86400'>-</span> <span style='color: #800000'>2</span> )<br />
<br />
<span style='color: #000080'>$height</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$options</span><span style='color: #C86400'>.</span>Length<br />
<br />
<span style='color: #008000'># create border</span><br />
<span style='color: #000080'>$windowPosition</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>WindowPosition<br />
<span style='color: #000080'>$windowSize</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>WindowSize<br />
<span style='color: #000080'>$cursorPosition</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>CursorPosition<br />
<span style='color: #000080'>$center</span> <span style='color: #C86400'>=</span> [Math]<span style='color: #C86400'>::</span>Truncate( <span style='color: #404040'>[float]</span><span style='color: #000080'>$windowSize</span><span style='color: #C86400'>.</span>Height <span style='color: #C86400'>/</span> <span style='color: #800000'>2</span> )<br />
<span style='color: #000080'>$cursorOffset</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$cursorPosition</span><span style='color: #C86400'>.</span>Y <span style='color: #C86400'>-</span> <span style='color: #000080'>$windowPosition</span><span style='color: #C86400'>.</span>Y<br />
<span style='color: #000080'>$cursorOffsetBottom</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$windowSize</span><span style='color: #C86400'>.</span>Height <span style='color: #C86400'>-</span> <span style='color: #000080'>$cursorOffset</span><br />
<br />
<span style='color: #000080'>$optionsBoxWidth</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$width</span> <span style='color: #C86400'>+</span> <span style='color: #800000'>2</span><br />
<span style='color: #000080'>$optionsBoxHeight</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$height</span> <span style='color: #C86400'>+</span> <span style='color: #800000'>2</span><br />
<br />
<span style='color: #000080'>$x</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$cursor</span><span style='color: #C86400'>.</span>X<br />
<br />
<span style='color: #C86400'>if</span> ( ( <span style='color: #000080'>$cursorOffset</span> <span style='color: #C86400'>-gt</span> <span style='color: #000080'>$center</span> ) <span style='color: #C86400'>-and</span> ( <span style='color: #000080'>$height</span> <span style='color: #C86400'>-ge</span> <span style='color: #000080'>$cursorOffsetBottom</span> ) )<br />
{<br />
<span style='color: #000080'>$maxHeight</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$cursorOffset</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$maxHeight</span> <span style='color: #C86400'>-lt</span> <span style='color: #000080'>$optionsBoxHeight</span> )<br />
{<br />
<span style='color: #000080'>$optionsBoxHeight</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$maxHeight</span><br />
}<br />
<br />
<span style='color: #000080'>$y</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$cursorOffset</span> <span style='color: #C86400'>-</span> <span style='color: #000080'>$optionsBoxHeight</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$maxHeight</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$cursorOffsetBottom</span> <span style='color: #C86400'>-</span> <span style='color: #800000'>1</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$maxHeight</span> <span style='color: #C86400'>-lt</span> <span style='color: #000080'>$optionsBoxHeight</span> )<br />
{<br />
<span style='color: #000080'>$optionsBoxHeight</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$maxHeight</span><br />
}<br />
<br />
<span style='color: #000080'>$y</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$cursorOffSet</span> <span style='color: #C86400'>+</span> <span style='color: #800000'>1</span><br />
}<br />
<br />
<span style='color: #000080'>$borderStrings</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>1</span> <span style='color: #C86400'>..</span> ( <span style='color: #000080'>$optionsBoxHeight</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>ForEach-Object</span> {<br />
<span style='color: #800000'>" "</span> <span style='color: #C86400'>*</span> ( <span style='color: #000080'>$optionsBoxWidth</span> <span style='color: #C86400'>+</span> <span style='color: #800000'>2</span> )<br />
}<br />
<br />
<span style='color: #000080'>$borderBuffer</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>NewBufferCellArray( <br />
<span style='color: #000080'>$borderStrings</span><span style='color: #C86400'>,</span> <br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BorderForegroundColor<span style='color: #C86400'>,</span> <br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>BorderBackgroundColor )<br />
<br />
<span style='color: #000080'>$borderPosition</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>WindowPosition<br />
<span style='color: #000080'>$borderPosition</span><span style='color: #C86400'>.</span>X <span style='color: #C86400'>+=</span> <span style='color: #000080'>$x</span><br />
<span style='color: #000080'>$borderPosition</span><span style='color: #C86400'>.</span>Y <span style='color: #C86400'>+=</span> <span style='color: #000080'>$y</span><br />
<br />
<span style='color: #000080'>$borderTop</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$borderBottom</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$borderPosition</span><br />
<span style='color: #000080'>$borderBottom</span><span style='color: #C86400'>.</span>X <span style='color: #C86400'>+=</span> ( <span style='color: #000080'>$borderBuffer</span><span style='color: #C86400'>.</span>GetUpperBound( <span style='color: #800000'>1</span> ) )<br />
<span style='color: #000080'>$borderBottom</span><span style='color: #C86400'>.</span>Y <span style='color: #C86400'>+=</span> ( <span style='color: #000080'>$borderBuffer</span><span style='color: #C86400'>.</span>GetUpperBound( <span style='color: #800000'>0</span> ) )<br />
<br />
<span style='color: #000080'>$borderRectangle</span> <span style='color: #C86400'>=</span> <br />
<span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Management<span style='color: #C86400'>.</span>Automation<span style='color: #C86400'>.</span>Host<span style='color: #C86400'>.</span>Rectangle <span style='color: #000080'>$borderTop</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$borderBottom</span><br />
<br />
<span style='color: #000080'>$oldContents</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>GetBufferContents( <span style='color: #000080'>$borderRectangle</span> )<br />
<br />
<span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>SetBufferContents( <span style='color: #000080'>$borderTop</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$borderBuffer</span> )<br />
<br />
<span style='color: #008000'># initialize state object</span><br />
<span style='color: #000080'>$statusPosition</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$borderPosition</span><br />
<span style='color: #000080'>$statusPosition</span><span style='color: #C86400'>.</span>X <span style='color: #C86400'>+=</span> <span style='color: #800000'>1</span><br />
<span style='color: #000080'>$statusPosition</span><span style='color: #C86400'>.</span>Y <span style='color: #C86400'>+=</span> <span style='color: #000080'>$optionsBoxHeight</span> <span style='color: #C86400'>-</span> <span style='color: #800000'>1</span><br />
<br />
<span style='color: #000080'>$optionsPosition</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$borderPosition</span><br />
<span style='color: #000080'>$optionsPosition</span><span style='color: #C86400'>.</span>X <span style='color: #C86400'>+=</span> <span style='color: #800000'>1</span><br />
<span style='color: #000080'>$optionsPosition</span><span style='color: #C86400'>.</span>Y <span style='color: #C86400'>+=</span> <span style='color: #800000'>1</span><br />
<br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Select-Object</span> <span style='color: #C86400'>`</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Options"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #C86400'>,</span><span style='color: #000080'>$options</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"SelectedIndex"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #800000'>0</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Offset"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #800000'>0</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"StatusPosition"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$statusPosition</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"OptionsPosition"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$optionsPosition</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Width"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$optionsBoxWidth</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Height"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$optionsBoxHeight</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"MaxOptions"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$maxHeight</span> <span style='color: #C86400'>-</span> <span style='color: #800000'>3</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"SelectedOptions"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #800000'>0</span> } }<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"TotalOptions"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$options</span><span style='color: #C86400'>.</span>Length } }<br />
<br />
Draw-Options <span style='color: #000080'>$state</span><br />
<br />
Set-SelectionColors <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$state</span> <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedForegroundColor <span style='color: #C86400'>`</span><br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>SelectedBackgroundColor<br />
<br />
<span style='color: #000080'>$message</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>do</span><br />
{<br />
<span style='color: #000080'>$finished</span> <span style='color: #C86400'>=</span> Get-KeyboardInput <span style='color: #000080'>$state</span><br />
}<br />
<span style='color: #C86400'>while</span> ( <span style='color: #C86400'>-not</span> <span style='color: #000080'>$finished</span> )<br />
<br />
<span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>SetBufferContents( <span style='color: #000080'>$borderTop</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$oldContents</span> )<br />
}<br />
}<br />
</div>
<br /><br />
Now, when I do a code review and I don't want to show every file, I run this command, which allows me to select only the files I want (I used aliases in this example to make the command shorter):
<br /><br />
<img src="http://farm5.static.flickr.com/4019/5169096919_c9842a0aaa_o.png" />Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com0tag:blogger.com,1999:blog-4092806390106651827.post-56772074047273736652009-11-05T13:07:00.001-08:002009-11-05T14:25:43.235-08:00Google Account API<div>This post isn't directly related to PowerShell, but I figured it is better to put it here than nowhere at all. I was looking at my <a href="http://out-web.blogspot.com/2008/05/custom-cmdlets-part-three.html">Send-Email</a> and <a href="http://out-web.blogspot.com/2009/07/powershell-and-google-voice.html">Send-SMS</a> cmdlets the other day, and I figured that the ability to send email or SMS through Gmail and Google Voice might be useful in environments other than PowerShell.</div><div>
<br/>
</div><div>I created a C# class library that provides an API for sending an email through Gmail or an SMS through Google Voice. I added to it a very simple class for dealing with Google Contacts. Google's Contacts <a href="http://code.google.com/apis/contacts/docs/3.0/developers_guide.html">API</a> is much more powerful, but I didn't want to add a dependency to my project. This is also partly inspired by my genius little <a href="http://everydayscripting.blogspot.com/">brother</a>, who has developed some similar APIs for Python.</div><div>
<br/>
</div><div>All of the classes in this library use a custom HttpRequester class to make their requests to Google's services. This class keeps track of cookies between requests, handles redirection, and also provides a method for determining the MIME type of a file.</div><div>
<br/>
</div><div>The Gmail class provides a simple way to create an email message and sent it, with full attachment support. Here is the updated code from my Send-Email cmdlet, which, as you can see, is much simpler than the old code:</div><div>
</div><div>
<br/>
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<p style="margin: 0px;"><span style="color: #c86400;">private</span> <span style="color: #c86400;">void</span> SendGmailMessage()</p>
<p style="margin: 0px;">{</p>
<p style="margin: 0px;"> <span style="color: #2b91af;">IntPtr</span> bstr = <span style="color: navy;">Marshal</span>.SecureStringToBSTR( googlePassword );</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> plainGooglePassword = <span style="color: navy;">Marshal</span>.PtrToStringAuto( bstr );</p>
<p style="margin: 0px;"> <span style="color: navy;">Marshal</span>.ZeroFreeBSTR( bstr );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> GoogleAccount.<span style="color: navy;">Gmail</span> gmailMessage = <span style="color: #c86400;">new</span> GoogleAccount.<span style="color: navy;">Gmail</span>( googleUsername, plainGooglePassword );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> gmailMessage.OnStatus += <span style="color: #c86400;">new</span> GoogleAccount.<span style="color: navy;">Gmail</span>.<span style="color: #2b91af;">StatusEventHandler</span>( HandleGmailStatus );</p>
<p style="margin: 0px;"> gmailMessage.OnError += <span style="color: #c86400;">new</span> GoogleAccount.<span style="color: navy;">Gmail</span>.<span style="color: #2b91af;">ErrorEventHandler</span>( HandleGmailError );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: #c86400;">string</span> recipient <span style="color: #c86400;">in</span> toArray )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailMessage.To.Add( recipient );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: #c86400;">string</span> recipient <span style="color: #c86400;">in</span> ccArray )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailMessage.Cc.Add( recipient );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: #c86400;">string</span> recipient <span style="color: #c86400;">in</span> bccArray )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailMessage.Bcc.Add( recipient );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !<span style="color: #c86400;">string</span>.IsNullOrEmpty( subject ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailMessage.Subject = subject;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !<span style="color: #c86400;">string</span>.IsNullOrEmpty( body ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailMessage.Body = body;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> gmailMessage.BodyIsHtml = bodyIsHtml.IsPresent;</p>
<p style="margin: 0px;"> gmailMessage.Timeout = timeout;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: navy;">FileInfo</span> attachment <span style="color: #c86400;">in</span> inputAttachments )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailMessage.Attachments.Add( attachment );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( gmailMessage.Subject ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailMessage.Send();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;">}</p>
</div>
</div><div>
</div><div>
<br/>
You might notice the OnStatus and OnError event handlers being set up at the beginning of the function. These are used to report errors and status messages during the several requests necessary to send an email. These handlers are used by the Send-Email cmdlet to provide proper support for the -Verbose parameter.</div><div>
<br/>
</div><div>The SMS class is used in a very similar way. This is how I use it in my Send-SMS cmdlet:</div><div>
<br/>
</div><div>
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<p style="margin: 0px;"><span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> EndProcessing()</p>
<p style="margin: 0px;">{</p>
<p style="margin: 0px;"> <span style="color: #2b91af;">IntPtr</span> bstr = <span style="color: navy;">Marshal</span>.SecureStringToBSTR( googlePassword );</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> plainGooglePassword = <span style="color: navy;">Marshal</span>.PtrToStringAuto( bstr );</p>
<p style="margin: 0px;"> <span style="color: navy;">Marshal</span>.ZeroFreeBSTR( bstr );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> GoogleAccount.<span style="color: navy;">SMS</span> sms = <span style="color: #c86400;">new</span> GoogleAccount.<span style="color: navy;">SMS</span>( googleUsername, plainGooglePassword );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> sms.OnStatus += <span style="color: #c86400;">new</span> GoogleAccount.<span style="color: navy;">SMS</span>.<span style="color: #2b91af;">StatusEventHandler</span>( HandleGoogleVoiceStatus );</p>
<p style="margin: 0px;"> sms.OnError += <span style="color: #c86400;">new</span> GoogleAccount.<span style="color: navy;">SMS</span>.<span style="color: #2b91af;">ErrorEventHandler</span>( HandleGoogleVoiceError );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> sms.Number = <span style="color: #c86400;">this</span>.number;</p>
<p style="margin: 0px;"> sms.Text = <span style="color: #c86400;">this</span>.text;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( sms.Text ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> sms.Send();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;">}</p>
</div>
</div><div>
</div><div>
<br/>
The Contacts class provides read-only access to each of your Google contacts through a Contact class that has fields for first name, last name, email address, mobile phone, and groups. I create this list by downloading a CSV file and parsing it. Yes, I know I shouldn't parse the CSV data myself, but .NET doesn't have a built-in CSV parser, and I didn't want to add a dependency to a 3rd-party library. It seems to work just fine for its simple purpose.</div><div>
<br/>
</div><div>I wrote a small application to test the Contacts and SMS classes. It is called Mass SMS, and it allows you to choose several contacts to send one SMS message to, a service not provided on the Google Voice site. Here's how it works. First, you log in using your Google username and password:</div><div>
<br/>
<span class="Apple-style-span" style="color:#0000EE;"><span class="Apple-style-span" style="color:#000000;">
</span></span></div><div><div><span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDUcC7rARlo8R_viU5gCErF4kQFWzepL6lWuo0vwuDGglATa43_dtn43_xm91fxerFm5tFq2TfDSjyMIr5gIUmZgV5mYZwMp0o-Soo4syszJZz6Nnm1Ur4d69LGZyRVv_IgyV3QMmUoLY/s320/image1.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5400738627223463474" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 212px; height: 320px; " /></span>
</div></div><div>
</div><div>A pretty self-explanatory dialog for choosing contacts is then displayed. This dialog allows you to filter your contacts by group, such as Family:</div><div>
</div><div>
<span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis_3TphrvnxuF_H7WHd8e9T3RsYV6UFH25QxbaUeYsxhHZRu2p7Awp4qfGLEXNBjM0GLbV0EmTpQo7Z0hZNdY3H42L38l_2njXyWOGvIycrPrJJjb9_SyRpNGOwdmGxgo9WY74eSC94x0/s320/image2.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5400740038826160306" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 212px; height: 320px; " /></span>
</div><div>
</div><div>Once you have selected the contacts you want to receive your SMS, a dialog is displayed that allows you to specify the message:</div><div>
</div><div>
</div><div>
<span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4D-lPR6tlRsdOdj_3OFuNDy0UxKqaPF9HZNpHn2OgHQVXoXRdmvg8U7X6fkPdbxBt-3IWjoKziIWoxP4puO8nQuHw1dKMjQz9v515UQwwiFjNxjgVY0FzGCnU5b8bnIZjEe1jkdhazrs/s320/image3.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5400740782886819778" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 212px; height: 320px; " /></span>
</div><div>
</div><div>The final dialog displays the status of each message as it is being sent:</div><div>
</div><div>
</div><div>
<span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgREQXKOGHUiTHTNft_MkGF_4ojQuzuHziSKX_64sxWvAzSpn6vHwu9h7YZCIhTUKKLkVjE59Ng27mP0ycI4HapBafGl1ybRYke1odGbTgR8YHXt_4cqTRjV9QgdtWrNvDbCpsvuKR0IxQ/s320/image4.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5400742408582702898" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 212px; height: 320px; " /></span>
</div><div>
</div><div>Pretty simple, but it gets the job done. It was a fun little project to put together, and maybe I will actually use it someday! If you think you might be able to use it, please feel free. </div><div>
</div><div>
<br/><br/>
</div><div><a href="http://sites.google.com/site/outwebfilecabinet/file-cabinet/GoogleAccount.dll?attredirects=0&d=1">Google Account API binary</a></div><div><a href="http://sites.google.com/site/outwebfilecabinet/file-cabinet/GoogleAccount.zip?attredirects=0&d=1">Google Account API source</a></div><div><a href="http://sites.google.com/site/outwebfilecabinet/file-cabinet/MassSMS.zip?attredirects=0&d=1">Mass SMS project</a></div>Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com0tag:blogger.com,1999:blog-4092806390106651827.post-88549888608142980962009-07-17T14:30:00.001-07:002009-07-20T14:46:58.810-07:00PowerShell and Google VoiceAfter a long wait, I finally got my invitation to <a href="http://www.google.com/voice">Google Voice</a> this week. I haven't completely converted to it, but it looks very useful. My brother got his Google Voice number about a week earlier, and he posted a Python script on <a href="http://everydayscripting.blogspot.com/2009/07/google-voice-python-sms.html">his blog</a> that sends an SMS using his account.
<br /><br />
<div>I decided to create a PowerShell Cmdlet that does the same thing. It is mostly just a translation of my brother's script, but it includes code from my <a href="http://out-web.blogspot.com/2008/05/custom-cmdlets-part-three.html">Send-Email Cmdlet</a> that uses a Gmail account.</div><div>
</div><div><br />Here is the code:</div><br />
<div style="background: #dddddd; width: 100%; height: 400px; overflow: auto;font-family:Consolas;font-size:8pt;color:black;"><!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red200\green100\blue0;\red221\green221\blue221;\red0\green0\blue0;\red0\green0\blue128;\red163\green21\blue21;\red43\green145\blue175;\red0\green128\blue0;}??\fs16 \cf1\cb2\highlight2 using\cf0 System;\par ??\cf1 using\cf0 System.Text;\par ??\cf1 using\cf0 System.Management.Automation;\par ??\cf1 using\cf0 System.Net;\par ??\cf1 using\cf0 System.IO;\par ??\cf1 using\cf0 System.Web;\par ??\cf1 using\cf0 System.Text.RegularExpressions;\par ??\cf1 using\cf0 System.Runtime.InteropServices;\par ??\cf1 using\cf0 System.Security;\par ??\par ??\cf1 namespace\cf0 CustomCmdlets\par ??\{\par ?? [\cf4 Cmdlet\cf0 ( \cf4 VerbsCommunications\cf0 .Send, \cf5 "SMS"\cf0 , SupportsShouldProcess = \cf1 true\cf0 )]\par ?? \cf1 public\cf0 \cf1 class\cf0 \cf4 SendSMS\cf0 : \cf4 PSCmdlet\par ??\cf0 \{\par ?? \cf1 private\cf0 \cf1 const\cf0 \cf1 string\cf0 GOOGLE_VOICE_ADDRESS = \cf5 "https://www.google.com/voice/"\cf0 ;\par ?? \cf1 private\cf0 \cf1 const\cf0 \cf1 string\cf0 GOOGLE_VOICE_AUTHENTICATION_ADDRESS = \cf5 "https://www.google.com/accounts/ServiceLoginAuth"\cf0 ;\par ?? \cf1 private\cf0 \cf1 const\cf0 \cf1 string\cf0 GOOGLE_VOICE_SMS_ADDRESS = \cf5 "https://www.google.com/voice/sms/send/"\cf0 ;\par ?? \cf1 private\cf0 \cf4 CookieCollection\cf0 cookieCollection;\par ??\par ??\cf1 #region\cf0 Parameters\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 googleUsername;\par ??\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 GoogleUsername\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 googleUsername;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? googleUsername = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf4 SecureString\cf0 googlePassword;\par ??\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf4 SecureString\cf0 GooglePassword\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 googlePassword;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? googlePassword = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 number;\par ??\par ?? [\cf4 Parameter\cf0 ( Position = 0, Mandatory = \cf1 true\cf0 )]\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 Number\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 number;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? number = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 text;\par ??\par ?? [\cf4 Parameter\cf0 ( Position = 1, Mandatory = \cf1 true\cf0 )]\par ?? \cf1 public\cf0 \cf1 string\cf0 Text\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 text;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? text = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ??\cf1 #endregion\par ??\par ??\cf0 \cf1 protected\cf0 \cf1 override\cf0 \cf1 void\cf0 BeginProcessing()\par ?? \{\par ?? \cf1 if\cf0 ( googleUsername == \cf1 null\cf0 )\par ?? \{\par ?? googleUsername = (\cf1 string\cf0 )GetVariableValue( \cf5 "GoogleUsername"\cf0 , \cf1 null\cf0 );\par ?? \}\par ??\par ?? \cf1 if\cf0 ( googlePassword == \cf1 null\cf0 )\par ?? \{\par ?? googlePassword = (\cf4 SecureString\cf0 )GetVariableValue( \cf5 "GooglePassword"\cf0 , \cf1 null\cf0 );\par ?? \}\par ??\par ?? \cf1 if\cf0 ( \cf1 string\cf0 .IsNullOrEmpty( googleUsername ) || googlePassword == \cf1 null\cf0 )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 (\par ?? \cf1 new\cf0 \cf4 Exception\cf0 ( \cf5 "You must provide a username and password."\cf0 ),\par ?? \cf5 "Send-SMS"\cf0 , \cf6 ErrorCategory\cf0 .PermissionDenied, \cf1 this\cf0 ) );\par ?? \}\par ?? \}\par ??\par ?? \cf1 protected\cf0 \cf1 override\cf0 \cf1 void\cf0 EndProcessing()\par ?? \{\par ?? \cf6 IntPtr\cf0 bstr = \cf4 Marshal\cf0 .SecureStringToBSTR( googlePassword );\par ?? \cf1 string\cf0 plainGmailPassword = \cf4 Marshal\cf0 .PtrToStringAuto( bstr );\par ?? \cf4 Marshal\cf0 .ZeroFreeBSTR( bstr );\par ??\par ?? \cf1 string\cf0 postDataString = \cf5 "&continue="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( GOOGLE_VOICE_ADDRESS ) +\par ?? \cf5 "&Email="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( googleUsername ) +\par ?? \cf5 "&Passwd="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( plainGmailPassword );\par ??\par ?? \cf1 this\cf0 .cookieCollection = \cf1 new\cf0 \cf4 CookieCollection\cf0 ();\par ??\par ?? \cf1 this\cf0 .WriteVerbose( \cf5 "Sending Google Voice login request..."\cf0 );\par ??\par ?? MakeHttpWebRequest( GOOGLE_VOICE_AUTHENTICATION_ADDRESS, \cf1 true\cf0 , \cf4 Encoding\cf0 .UTF8.GetBytes( postDataString ) );\par ?? \par ?? \cf7 // if we don't have this cookie, something went wrong\par ??\cf0 \cf1 if\cf0 ( \cf1 this\cf0 .cookieCollection[ \cf5 "GAUSR"\cf0 ] == \cf1 null\cf0 )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 (\par ?? \cf1 new\cf0 \cf4 Exception\cf0 ( \cf5 "Could not log in to Gmail. Please check your username and password."\cf0 ),\par ?? \cf5 "Send-SMS"\cf0 , \cf6 ErrorCategory\cf0 .PermissionDenied, \cf1 this\cf0 ) );\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? \cf1 this\cf0 .WriteVerbose( \cf5 "Sending Google Voice home page request..."\cf0 );\par ??\par ?? \cf1 string\cf0 googleVoiceHomePage = MakeHttpWebRequest( GOOGLE_VOICE_ADDRESS, \cf1 false\cf0 , \cf1 null\cf0 );\par ??\par ?? \cf4 Match\cf0 rnrSeMatch = \cf4 Regex\cf0 .Match( googleVoiceHomePage, \cf5 @"name=""_rnr_se"".*?value=""(?<Value>[^""]+)"""\cf0 );\par ??\par ?? \cf1 if\cf0 ( rnrSeMatch.Success )\par ?? \{\par ?? postDataString = \cf5 "&_rnr_se="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( rnrSeMatch.Groups[ \cf5 "Value"\cf0 ].Value ) +\par ?? \cf5 "&phoneNumber="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( number ) +\par ?? \cf5 "&text="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( text );\par ??\par ?? \cf1 this\cf0 .WriteVerbose( \cf5 "Sending Google Voice SMS request..."\cf0 );\par ??\par ?? \cf1 string\cf0 sendResult = MakeHttpWebRequest( GOOGLE_VOICE_SMS_ADDRESS, \cf1 true\cf0 , \cf4 Encoding\cf0 .UTF8.GetBytes( postDataString ) );\par ??\par ?? \cf4 Match\cf0 resultMatch = \cf4 Regex\cf0 .Match( sendResult, \cf5 @"\\\{""ok"":(?<Success>[^,]+),""data"":\\\{""code"":(?<Code>\\d+)\\\}\\\}"\cf0 );\par ??\par ?? \cf1 if\cf0 ( resultMatch.Success )\par ?? \{\par ?? \cf1 if\cf0 ( \cf1 bool\cf0 .Parse( resultMatch.Groups[ \cf5 "Success"\cf0 ].Value ) )\par ?? \{\par ?? \cf1 this\cf0 .WriteObject( \cf5 "Your SMS has been sent."\cf0 );\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 (\par ?? \cf1 new\cf0 \cf4 Exception\cf0 ( \cf5 "Your SMS was not sent."\cf0 ),\par ?? \cf5 "Send-SMS"\cf0 , \cf6 ErrorCategory\cf0 .NotSpecified, \cf1 this\cf0 ) );\par ?? \}\par ?? \}\par ?? \}\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 MakeHttpWebRequest( \cf1 string\cf0 requestUrl, \cf1 bool\cf0 post, \cf1 byte\cf0 [] postData )\par ?? \{\par ?? \cf4 HttpWebRequest\cf0 webRequest = (\cf4 HttpWebRequest\cf0 )\cf4 WebRequest\cf0 .Create( \cf1 new\cf0 \cf4 Uri\cf0 ( requestUrl ) );\par ??\par ?? \cf7 // we need to do this ourselves\par ??\cf0 webRequest.AllowAutoRedirect = \cf1 false\cf0 ;\par ?? webRequest.KeepAlive = \cf1 false\cf0 ;\par ?? webRequest.Credentials = \cf4 CredentialCache\cf0 .DefaultNetworkCredentials;\par ??\par ?? webRequest.CookieContainer = \cf1 new\cf0 \cf4 CookieContainer\cf0 ();\par ?? webRequest.CookieContainer.Add( \cf1 this\cf0 .cookieCollection );\par ??\par ?? \cf1 if\cf0 ( post )\par ?? \{\par ?? webRequest.Method = \cf5 "POST"\cf0 ;\par ?? webRequest.ContentType = \cf5 "application/x-www-form-urlencoded"\cf0 ;\par ??\par ?? webRequest.ContentLength = postData.Length;\par ??\par ?? \cf4 Stream\cf0 requestStream = \cf1 null\cf0 ;\par ??\par ?? \cf1 try\par ??\cf0 \{\par ?? requestStream = webRequest.GetRequestStream();\par ?? requestStream.Write( postData, 0, postData.Length );\par ?? \}\par ?? \cf1 catch\cf0 ( \cf4 Exception\cf0 ex )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 ( ex, \cf5 "Send-SMS"\cf0 , \cf6 ErrorCategory\cf0 .InvalidData, \cf1 this\cf0 ) );\par ?? \}\par ?? \cf1 finally\par ??\cf0 \{\par ?? \cf1 if\cf0 ( requestStream != \cf1 null\cf0 )\par ?? \{\par ?? requestStream.Close();\par ?? \}\par ?? \}\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? webRequest.Method = \cf5 "GET"\cf0 ;\par ?? webRequest.ContentType = \cf5 "text/html"\cf0 ;\par ?? \}\par ??\par ?? \cf4 HttpWebResponse\cf0 webResponse = \cf1 null\cf0 ;\par ?? \cf1 string\cf0 responseString = \cf5 ""\cf0 ;\par ??\par ?? \cf1 try\par ??\cf0 \{\par ?? webResponse = (\cf4 HttpWebResponse\cf0 )webRequest.GetResponse();\par ??\par ?? cookieCollection.Add( webResponse.Cookies );\par ??\par ?? \cf4 StreamReader\cf0 streamReader = \cf1 new\cf0 \cf4 StreamReader\cf0 ( webResponse.GetResponseStream() );\par ??\par ?? responseString = streamReader.ReadToEnd();\par ??\par ?? streamReader.Close();\par ??\par ?? \cf7 // redirect if we have a Location header\par ??\cf0 \cf1 if\cf0 ( webResponse.Headers[ \cf5 "Location"\cf0 ] != \cf1 null\cf0 )\par ?? \{\par ?? responseString = MakeHttpWebRequest( webResponse.Headers[ \cf5 "Location"\cf0 ], \cf1 false\cf0 , \cf1 null\cf0 );\par ?? \}\par ?? \}\par ?? \cf1 catch\cf0 ( \cf4 Exception\cf0 ex )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 ( ex, \cf5 "Send-SMS"\cf0 , \cf6 ErrorCategory\cf0 .InvalidResult, \cf1 this\cf0 ) );\par ?? \}\par ?? \cf1 finally\par ??\cf0 \{\par ?? \cf1 if\cf0 ( webResponse != \cf1 null\cf0 )\par ?? \{\par ?? webResponse.Close();\par ?? \}\par ?? \}\par ??\par ?? \cf1 return\cf0 responseString;\par ?? \}\par ?? \}\par ??\}}
-->
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Text;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Net;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.IO;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Web;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Text.RegularExpressions;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Runtime.InteropServices;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Security;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="color: #c86400;">namespace</span> CustomCmdlets</p>
<p style="margin: 0px;">{</p>
<p style="margin: 0px;"> [<span style="color: navy;">Cmdlet</span>( <span style="color: navy;">VerbsCommunications</span>.Send, <span style="color: #a31515;">"SMS"</span>, SupportsShouldProcess = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">SendSMS</span> : <span style="color: navy;">PSCmdlet</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">const</span> <span style="color: #c86400;">string</span> GOOGLE_VOICE_ADDRESS = <span style="color: #a31515;">"https://www.google.com/voice/"</span>;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">const</span> <span style="color: #c86400;">string</span> GOOGLE_VOICE_AUTHENTICATION_ADDRESS = <span style="color: #a31515;">"https://www.google.com/accounts/ServiceLoginAuth"</span>;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">const</span> <span style="color: #c86400;">string</span> GOOGLE_VOICE_SMS_ADDRESS = <span style="color: #a31515;">"https://www.google.com/voice/sms/send/"</span>;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">CookieCollection</span> cookieCollection;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="color: #c86400;"> #region</span> Parameters</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> googleUsername;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> GoogleUsername</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> googleUsername;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> googleUsername = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">SecureString</span> googlePassword;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SecureString</span> GooglePassword</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> googlePassword;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> googlePassword = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> number;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Position = 0, Mandatory = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Number</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> number;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> number = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> text;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Position = 1, Mandatory = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Text</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> text;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> text = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="color: #c86400;"> #endregion</span></p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> BeginProcessing()</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( googleUsername == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> googleUsername = (<span style="color: #c86400;">string</span>)GetVariableValue( <span style="color: #a31515;">"GoogleUsername"</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( googlePassword == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> googlePassword = (<span style="color: navy;">SecureString</span>)GetVariableValue( <span style="color: #a31515;">"GooglePassword"</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">string</span>.IsNullOrEmpty( googleUsername ) || googlePassword == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>(</p>
<p style="margin: 0px;"> <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( <span style="color: #a31515;">"You must provide a username and password."</span> ),</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"Send-SMS"</span>, <span style="color: #2b91af;">ErrorCategory</span>.PermissionDenied, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> EndProcessing()</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #2b91af;">IntPtr</span> bstr = <span style="color: navy;">Marshal</span>.SecureStringToBSTR( googlePassword );</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> plainGmailPassword = <span style="color: navy;">Marshal</span>.PtrToStringAuto( bstr );</p>
<p style="margin: 0px;"> <span style="color: navy;">Marshal</span>.ZeroFreeBSTR( bstr );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> postDataString = <span style="color: #a31515;">"&continue="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( GOOGLE_VOICE_ADDRESS ) +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&Email="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( googleUsername ) +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&Passwd="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( plainGmailPassword );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.cookieCollection = <span style="color: #c86400;">new</span> <span style="color: navy;">CookieCollection</span>();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteVerbose( <span style="color: #a31515;">"Sending Google Voice login request..."</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> MakeHttpWebRequest( GOOGLE_VOICE_AUTHENTICATION_ADDRESS, <span style="color: #c86400;">true</span>, <span style="color: navy;">Encoding</span>.UTF8.GetBytes( postDataString ) );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// if we don't have this cookie, something went wrong</span></p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.cookieCollection[ <span style="color: #a31515;">"GAUSR"</span> ] == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>(</p>
<p style="margin: 0px;"> <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( <span style="color: #a31515;">"Could not log in to Gmail. Please check your username and password."</span> ),</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"Send-SMS"</span>, <span style="color: #2b91af;">ErrorCategory</span>.PermissionDenied, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteVerbose( <span style="color: #a31515;">"Sending Google Voice home page request..."</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> googleVoiceHomePage = MakeHttpWebRequest( GOOGLE_VOICE_ADDRESS, <span style="color: #c86400;">false</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">Match</span> rnrSeMatch = <span style="color: navy;">Regex</span>.Match( googleVoiceHomePage, <span style="color: #a31515;">@"name=""_rnr_se"".*?value=""(?<Value>[^""]+)"""</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( rnrSeMatch.Success )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> postDataString = <span style="color: #a31515;">"&_rnr_se="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( rnrSeMatch.Groups[ <span style="color: #a31515;">"Value"</span> ].Value ) +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&phoneNumber="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( number ) +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&text="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( text );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteVerbose( <span style="color: #a31515;">"Sending Google Voice SMS request..."</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> sendResult = MakeHttpWebRequest( GOOGLE_VOICE_SMS_ADDRESS, <span style="color: #c86400;">true</span>, <span style="color: navy;">Encoding</span>.UTF8.GetBytes( postDataString ) );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">Match</span> resultMatch = <span style="color: navy;">Regex</span>.Match( sendResult, <span style="color: #a31515;">@"\{""ok"":(?<Success>[^,]+),""data"":\{""code"":(?<Code>\d+)\}\}"</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( resultMatch.Success )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">bool</span>.Parse( resultMatch.Groups[ <span style="color: #a31515;">"Success"</span> ].Value ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteObject( <span style="color: #a31515;">"Your SMS has been sent."</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>(</p>
<p style="margin: 0px;"> <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( <span style="color: #a31515;">"Your SMS was not sent."</span> ),</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"Send-SMS"</span>, <span style="color: #2b91af;">ErrorCategory</span>.NotSpecified, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> MakeHttpWebRequest( <span style="color: #c86400;">string</span> requestUrl, <span style="color: #c86400;">bool</span> post, <span style="color: #c86400;">byte</span>[] postData )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: navy;">HttpWebRequest</span> webRequest = (<span style="color: navy;">HttpWebRequest</span>)<span style="color: navy;">WebRequest</span>.Create( <span style="color: #c86400;">new</span> <span style="color: navy;">Uri</span>( requestUrl ) );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// we need to do this ourselves</span></p>
<p style="margin: 0px;"> webRequest.AllowAutoRedirect = <span style="color: #c86400;">false</span>;</p>
<p style="margin: 0px;"> webRequest.KeepAlive = <span style="color: #c86400;">false</span>;</p>
<p style="margin: 0px;"> webRequest.Credentials = <span style="color: navy;">CredentialCache</span>.DefaultNetworkCredentials;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> webRequest.CookieContainer = <span style="color: #c86400;">new</span> <span style="color: navy;">CookieContainer</span>();</p>
<p style="margin: 0px;"> webRequest.CookieContainer.Add( <span style="color: #c86400;">this</span>.cookieCollection );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( post )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webRequest.Method = <span style="color: #a31515;">"POST"</span>;</p>
<p style="margin: 0px;"> webRequest.ContentType = <span style="color: #a31515;">"application/x-www-form-urlencoded"</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> webRequest.ContentLength = postData.Length;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">Stream</span> requestStream = <span style="color: #c86400;">null</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> requestStream = webRequest.GetRequestStream();</p>
<p style="margin: 0px;"> requestStream.Write( postData, 0, postData.Length );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">catch</span> ( <span style="color: navy;">Exception</span> ex )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( ex, <span style="color: #a31515;">"Send-SMS"</span>, <span style="color: #2b91af;">ErrorCategory</span>.InvalidData, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">finally</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( requestStream != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> requestStream.Close();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webRequest.Method = <span style="color: #a31515;">"GET"</span>;</p>
<p style="margin: 0px;"> webRequest.ContentType = <span style="color: #a31515;">"text/html"</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">HttpWebResponse</span> webResponse = <span style="color: #c86400;">null</span>;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> responseString = <span style="color: #a31515;">""</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webResponse = (<span style="color: navy;">HttpWebResponse</span>)webRequest.GetResponse();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> cookieCollection.Add( webResponse.Cookies );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">StreamReader</span> streamReader = <span style="color: #c86400;">new</span> <span style="color: navy;">StreamReader</span>( webResponse.GetResponseStream() );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> responseString = streamReader.ReadToEnd();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> streamReader.Close();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// redirect if we have a Location header</span></p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( webResponse.Headers[ <span style="color: #a31515;">"Location"</span> ] != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> responseString = MakeHttpWebRequest( webResponse.Headers[ <span style="color: #a31515;">"Location"</span> ], <span style="color: #c86400;">false</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">catch</span> ( <span style="color: navy;">Exception</span> ex )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( ex, <span style="color: #a31515;">"Send-SMS"</span>, <span style="color: #2b91af;">ErrorCategory</span>.InvalidResult, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">finally</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( webResponse != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webResponse.Close();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> responseString;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;">}</p>
</div>
</div>
<br />
This Cmdlet can use the Init-Gmail PowerShell function (renamed Init-Google) I wrote for the Send-Email Cmdlet, as well as a shortcut hash I created to make sending texts easier:
<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #C86400'>function</span> Init-Google<br />
{<br />
<span style='color: #404040'>[string]</span><span style='color: #000080'>$global</span><span style='color: #C86400'>:</span>GoogleUsername <span style='color: #C86400'>=</span> <span style='color: #C86400'>Read-Host</span> <span style='color: #800000'>"Google username"</span><br />
[System<span style='color: #C86400'>.</span>Security<span style='color: #C86400'>.</span>SecureString]<span style='color: #000080'>$global</span><span style='color: #C86400'>:</span>GooglePassword <span style='color: #C86400'>=</span> <span style='color: #C86400'>Read-Host</span> <span style='color: #800000'>"Google password"</span> -AsSecureString <br />
}<br />
<br />
<span style='color: #000080'>$sms</span> <span style='color: #C86400'>=</span> @{ <span style='color: #800000'>"Jeff"</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"8015551234"</span>;<br />
<span style='color: #800000'>"Mindy"</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"8015552345"</span>;<br />
<span style='color: #800000'>"Dad"</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"8015553456"</span>;<br />
<span style='color: #800000'>"Jason"</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"8015554567"</span>;<br />
<span style='color: #800000'>"Scott"</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"8015555678"</span>;<br />
<span style='color: #800000'>"Nate"</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"8015556789"</span>;<br />
<span style='color: #800000'>"Branden"</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"8015557890"</span> }
</div>
<br />
Using the Cmdlet is very easy:
<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: "Courier New", Courier, mono; font-size: 12px; background-color: #000000; color: #FFC400; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='font-weight: bold; color: white;'>C:\</span><br />
<span style='font-weight: bold;'>PSH<span style='color: red;'>$</span> send-sms $sms.jeff "PowerShell + Google = Awesome."</span><br />
<span style='font-weight: bold;'>Your SMS has been sent.</span>
</div>
<br />
This is another one that I did just for fun, but it is already turning out to be pretty useful. I can type using a real keyboard a lot faster than I can on any phone, and not having to pull my phone out of my pocket to send a quick text to my wife is very handy.
<br /><br />
Enjoy!Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com2tag:blogger.com,1999:blog-4092806390106651827.post-3489543602594100262008-10-17T19:50:00.001-07:002009-07-10T10:03:59.310-07:00PowerShell and StackOverflow.comNot long ago, I created an account on <a href="http://stackoverflow.com/">StackOverflow.com</a>, <a href="http://www.codinghorror.com/blog/">Jeff Attwood</a> and <a href="http://www.joelonsoftware.com/">Joel Spolsky</a>'s new question and answer site for programmers. Asking a good question or providing a good answer will result in the other members of the communtity responding by voting for your question or answer. Users can also vote down questions or answers they don't think are useful or correct. Each positive vote increases the user's reputation, which is used to determine how much a user is "trusted" on the site. More "trust" allows the user to have more control over what is on the site; it determines what aspects of the site they can edit, wiki-style. Currently, I only have enough reputation to edit the tags associated with a question, but it is possible for a user to have enough reputation that they can edit other user's questions and even close them.
<br />
Something that was missing from the site when I signed up was the ability to figure out where your reputation points were coming from. If you had several questions or answers, it was hard to keep track of which ones were contributing to your reputation score. Another user of the site noticed this deficiency before I did, and created a <a href="http://stackoverflow.com/questions/6936/using-what-ive-learned-from-stackoverflow-html-scraper">Python script</a> that will tell you what has changed with your account since the last time your ran the script. The script requires Python and SQLite. This seemed like something could be done pretty easily using PowerShell, so I put together a similar script that does pretty much the same thing:<div>
</div>
<br /><br />
<div style='width: 100%; height: 400px; overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #C86400'>param</span> ( <span style='color: #404040'>[int]</span> <span style='color: #000080'>$userNumber</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>3950</span> )<br />
<br />
[Reflection<span style='color: #C86400'>.</span>Assembly]<span style='color: #C86400'>::</span>LoadWithPartialName( <span style='color: #800000'>"System.Web"</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-Null</span><br />
<br />
<span style='color: #000080'>$webClient</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> Net<span style='color: #C86400'>.</span>WebClient<br />
<br />
<span style='color: #000080'>$profile</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$webClient</span><span style='color: #C86400'>.</span>DownloadString( <br />
<span style='color: #800000'>"http://stackoverflow.com/users/$userNumber/myProfile.html"</span> )<br />
<br />
<span style='color: #000080'>$userRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>'User (?<User>.*?) - Stack Overflow'</span><br />
<span style='color: #000080'>$user</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Match( <span style='color: #000080'>$profile</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$userRegex</span> )<span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"User"</span> ]<span style='color: #C86400'>.</span>Value<br />
<br />
<span style='color: #000080'>$reputationRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>'<div[^>]+class="summarycount">'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'[^\d]+(?<Reputation>[,\d]+)</div>'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'[^<]*<div[^>]+>Reputation'</span><br />
<br />
<span style='color: #000080'>$reputation</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Match( <br />
<span style='color: #000080'>$profile</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$reputationRegex</span> )<span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"Reputation"</span> ]<span style='color: #C86400'>.</span>Value <span style='color: #C86400'>-replace</span> <span style='color: #800000'>","</span><br />
<br />
<span style='color: #000080'>$badgeRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>'<div[^>]+class="summarycount"[^>]*>'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'[^\d]+(?<Badges>\d+)</div>[^<]*</td>'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'[^<]*<td[^>]*>[^<]*<h1[^>]*>Badges'</span><br />
<br />
<span style='color: #000080'>$badges</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Match( <br />
<span style='color: #000080'>$profile</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$badgeRegex</span> )<span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"Badges"</span> ]<span style='color: #C86400'>.</span>Value <span style='color: #C86400'>-replace</span> <span style='color: #800000'>","</span><br />
<br />
<span style='color: #000080'>$profileXmlPath</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Join-Path</span> ( <span style='color: #C86400'>Get-Location</span> ) <span style='color: #800000'>"Profile_$userNumber.xml"</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>!</span>( <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$profileXmlPath</span> ) )<br />
{<br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #000080'>$profileXmlPath</span> -InputObject <span style='color: #800000'>@"</span><br />
<span style='color: #800000'><Profile></span><br />
<span style='color: #800000'> <User>$user</User></span><br />
<span style='color: #800000'> <Reputation>$reputation</Reputation></span><br />
<span style='color: #800000'> <Badges>$badges</Badges></span><br />
<span style='color: #800000'> <Questions /></span><br />
<span style='color: #800000'></Profile> </span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #404040'>[xml]</span><span style='color: #000080'>$profileXml</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Content</span> <span style='color: #000080'>$profileXmlPath</span><br />
<br />
<span style='color: #000080'>$existingQuestions</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Questions<span style='color: #C86400'>.</span>Clone()<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile[ <span style='color: #800000'>"Questions"</span> ]<span style='color: #C86400'>.</span>Question )<br />
{<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Questions<span style='color: #C86400'>.</span>RemoveAll()<br />
}<br />
<br />
<span style='color: #C86400'>function</span> <span style='color: #C86400'>Process</span>-Questions( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$questionRegex</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[string]</span> <span style='color: #000080'>$questionType</span> )<br />
{<br />
<span style='color: #000080'>$questionChangeHash</span> <span style='color: #C86400'>=</span> @{}<br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$questionMatch</span> <span style='color: #C86400'>in</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Matches( <br />
<span style='color: #000080'>$profile</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$questionRegex</span><span style='color: #C86400'>,</span> <span style='color: #800000'>'SingleLine'</span> ) )<br />
{<br />
<span style='color: #000080'>$id</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$questionMatch</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"ID"</span> ]<span style='color: #C86400'>.</span>Value<br />
<span style='color: #000080'>$question</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$questionMatch</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"Question"</span> ]<span style='color: #C86400'>.</span>Value<br />
<span style='color: #000080'>$votes</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$questionMatch</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"Votes"</span> ]<span style='color: #C86400'>.</span>Value<br />
<br />
<span style='color: #000080'>$questionNode</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$existingQuestions</span><span style='color: #C86400'>.</span>Question <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Where-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>ID <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$id</span> }<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$questionNode</span> )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #404040'>[int]</span><span style='color: #000080'>$votes</span> <span style='color: #C86400'>-gt</span> <span style='color: #000080'>$questionNode</span><span style='color: #C86400'>.</span>Votes )<br />
{<br />
<span style='color: #000080'>$questionChangeHash</span>[ <span style='color: #000080'>$id</span> ] <span style='color: #C86400'>=</span> <br />
<span style='color: #800000'>"+$( [int]$votes - $questionNode.Votes )"</span><br />
}<br />
<span style='color: #C86400'>elseif</span> ( <span style='color: #404040'>[int]</span><span style='color: #000080'>$votes</span> <span style='color: #C86400'>-lt</span> <span style='color: #000080'>$questionNode</span><span style='color: #C86400'>.</span>Votes )<br />
{<br />
<span style='color: #000080'>$questionChangeHash</span>[ <span style='color: #000080'>$id</span> ] <span style='color: #C86400'>=</span> <span style='color: #404040'>[int]</span><span style='color: #000080'>$votes</span> <span style='color: #C86400'>-</span> <span style='color: #000080'>$questionNode</span><span style='color: #C86400'>.</span>Votes<br />
}<br />
<br />
<span style='color: #000080'>$questionNode</span><span style='color: #C86400'>.</span>Votes <span style='color: #C86400'>=</span> <span style='color: #000080'>$votes</span><br />
<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile[ <span style='color: #800000'>"Questions"</span> ]<span style='color: #C86400'>.</span>AppendChild( <br />
<span style='color: #000080'>$questionNode</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-Null</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #C86400'>&</span> {<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode <span style='color: #C86400'>=</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>CreateElement( <span style='color: #800000'>"Question"</span> )<br />
<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>AppendChild( <br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>CreateElement( <span style='color: #800000'>"ID"</span> ) )<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>ID <span style='color: #C86400'>=</span> <span style='color: #000080'>$id</span><br />
<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>AppendChild( <br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>CreateElement( <span style='color: #800000'>"Type"</span> ) )<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>Type <span style='color: #C86400'>=</span> <span style='color: #000080'>$questionType</span><br />
<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>AppendChild( <br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>CreateElement( <span style='color: #800000'>"Question"</span> ) )<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>Question <span style='color: #C86400'>=</span> <span style='color: #000080'>$question</span><br />
<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>AppendChild( <br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>CreateElement( <span style='color: #800000'>"Votes"</span> ) )<br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode<span style='color: #C86400'>.</span>Votes <span style='color: #C86400'>=</span> <span style='color: #000080'>$votes</span><br />
<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile[ <span style='color: #800000'>"Questions"</span> ]<span style='color: #C86400'>.</span>AppendChild( <br />
<span style='color: #000080'>$script</span><span style='color: #C86400'>:</span>questionNode )<br />
} <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-Null</span><br />
<br />
<span style='color: #000080'>$questionChangeHash</span>[ <span style='color: #000080'>$id</span> ] <span style='color: #C86400'>=</span> <span style='color: #800000'>"(New)"</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$screenWidth</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$Host</span><span style='color: #C86400'>.</span>UI<span style='color: #C86400'>.</span>RawUI<span style='color: #C86400'>.</span>WindowSize<span style='color: #C86400'>.</span>Width<br />
<span style='color: #000080'>$elipsis</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"..."</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$questionChangeHash</span><span style='color: #C86400'>.</span>Keys<span style='color: #C86400'>.</span>Count <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Questions<span style='color: #C86400'>.</span>Question <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Where-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Type <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$questionType</span> } <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Select-Object</span> <span style='color: #C86400'>`</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"$( $questionType )s"</span>; <br />
Expression <span style='color: #C86400'>=</span> {<br />
<span style='color: #000080'>$question</span> <span style='color: #C86400'>=</span> <br />
[System<span style='color: #C86400'>.</span>Web<span style='color: #C86400'>.</span>HttpUtility]<span style='color: #C86400'>::</span>HtmlDecode( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Question ) <br />
<span style='color: #000080'>$questionMaxLength</span> <span style='color: #C86400'>=</span> <br />
<span style='color: #000080'>$screenWidth</span> <span style='color: #C86400'>-</span> ( <span style='color: #800000'>" Votes Change "</span><span style='color: #C86400'>.</span>Length )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$question</span><span style='color: #C86400'>.</span>Length <span style='color: #C86400'>-gt</span> <span style='color: #000080'>$questionMaxLength</span> )<br />
{<br />
<span style='color: #000080'>$question</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"{0}$elipsis"</span> <span style='color: #C86400'>-f</span> <br />
<span style='color: #000080'>$question</span><span style='color: #C86400'>.</span>SubString( <br />
<span style='color: #800000'>0</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$questionMaxLength</span> <span style='color: #C86400'>-</span> <span style='color: #000080'>$elipsis</span><span style='color: #C86400'>.</span>Length ) <br />
}<br />
<br />
<span style='color: #000080'>$question</span><br />
} <br />
}<span style='color: #C86400'>,</span> <br />
Votes<span style='color: #C86400'>,</span> <br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Change"</span>; <br />
Expression <span style='color: #C86400'>=</span> {<br />
<span style='color: #000080'>$questionChangeHash</span>[ <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>ID ] <br />
} <br />
} <span style='color: #C86400'>|</span> <span style='color: #C86400'>Format-Table</span> -AutoSize<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Questions<span style='color: #C86400'>.</span>Question <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Where-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Type <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$questionType</span> } <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Select-Object</span> <span style='color: #C86400'>`</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"$( $questionType )s"</span>; <br />
Expression <span style='color: #C86400'>=</span> { <br />
<span style='color: #000080'>$question</span> <span style='color: #C86400'>=</span> <br />
[System<span style='color: #C86400'>.</span>Web<span style='color: #C86400'>.</span>HttpUtility]<span style='color: #C86400'>::</span>HtmlDecode( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Question ) <br />
<span style='color: #000080'>$questionMaxLength</span> <span style='color: #C86400'>=</span> <br />
<span style='color: #000080'>$screenWidth</span> <span style='color: #C86400'>-</span> ( <span style='color: #800000'>" Votes "</span><span style='color: #C86400'>.</span>Length )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$question</span><span style='color: #C86400'>.</span>Length <span style='color: #C86400'>-gt</span> <span style='color: #000080'>$questionMaxLength</span> )<br />
{<br />
<span style='color: #000080'>$question</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"{0}$elipsis"</span> <span style='color: #C86400'>-f</span> <br />
<span style='color: #000080'>$question</span><span style='color: #C86400'>.</span>SubString( <br />
<span style='color: #800000'>0</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$questionMaxLength</span> <span style='color: #C86400'>-</span> <span style='color: #000080'>$elipsis</span><span style='color: #C86400'>.</span>Length ) <br />
}<br />
<br />
<span style='color: #000080'>$question</span><br />
} <br />
}<span style='color: #C86400'>,</span> <br />
Votes <span style='color: #C86400'>|</span> <span style='color: #C86400'>Format-Table</span> -AutoSize<br />
} <br />
}<br />
<br />
<span style='color: #000080'>$questionRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>'<div class="question-summary narrow"[^>]+>'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'.*?<div class="mini-counts">(?<Votes>[\d,-]+).*?'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'<div class="summary">[^<]*<h3>[^<]*'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'<a\s*href="/questions/(?<ID>\d+)[^>]+>(?<Question>[^<]+)'</span><br />
<br />
<span style='color: #C86400'>Process</span>-Questions <span style='color: #000080'>$questionRegex</span> <span style='color: #800000'>"Question"</span><br />
<br />
<span style='color: #000080'>$answerRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>'<div class="answer-summary">'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'<a[^>]+><div class="answer-votes[^>]+>(?<Votes>[\d,-]+)'</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>'</div></a><div class="answer-link">'</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>'<a\s*href="/questions/(?<ID>\d+)[^>]+>(?<Question>[^<]+)'</span><br />
<br />
<span style='color: #C86400'>Process</span>-Questions <span style='color: #000080'>$answerRegex</span> <span style='color: #800000'>"Answer"</span><br />
<br />
<span style='color: #000080'>$reputationChange</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$badgeChange</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #404040'>[int]</span><span style='color: #000080'>$reputation</span> <span style='color: #C86400'>-gt</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Reputation )<br />
{<br />
<span style='color: #000080'>$reputationChange</span> <span style='color: #C86400'>=</span> <br />
<span style='color: #800000'>"+$( [int]$reputation - $profileXml.Profile.Reputation )"</span><br />
}<br />
<span style='color: #C86400'>elseif</span> ( <span style='color: #404040'>[int]</span><span style='color: #000080'>$reputation</span> <span style='color: #C86400'>-lt</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Reputation )<br />
{<br />
<span style='color: #000080'>$reputationChange</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$reputation</span> <span style='color: #C86400'>-</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Reputation<br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #404040'>[int]</span><span style='color: #000080'>$badges</span> <span style='color: #C86400'>-gt</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Badges )<br />
{<br />
<span style='color: #000080'>$badgeChange</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"+$( [int]$badges - $profileXml.Profile.Badges )"</span><br />
}<br />
<span style='color: #C86400'>elseif</span> ( <span style='color: #404040'>[int]</span><span style='color: #000080'>$badges</span> <span style='color: #C86400'>-lt</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Badges )<br />
{<br />
<span style='color: #000080'>$badgeChange</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[int]</span><span style='color: #000080'>$badges</span> <span style='color: #C86400'>-</span> <span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Badges<br />
}<br />
<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>User <span style='color: #C86400'>=</span> <span style='color: #000080'>$user</span><br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Reputation <span style='color: #C86400'>=</span> <span style='color: #000080'>$reputation</span><br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile<span style='color: #C86400'>.</span>Badges <span style='color: #C86400'>=</span> <span style='color: #000080'>$badges</span><br />
<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Profile <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Select-Object</span> User<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Reputation"</span>; <br />
Expression <span style='color: #C86400'>=</span> {<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$reputationChange</span> )<br />
{<br />
<span style='color: #800000'>"{0} ({1})"</span> <span style='color: #C86400'>-f</span> <br />
<span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Reputation<span style='color: #C86400'>,</span> <span style='color: #000080'>$reputationChange</span> <br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Reputation<br />
}<br />
} <br />
}<span style='color: #C86400'>,</span><br />
@{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Badges"</span>; <br />
Expression <span style='color: #C86400'>=</span> {<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$badgeChange</span> )<br />
{<br />
<span style='color: #800000'>"{0} ({1})"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Badges<span style='color: #C86400'>,</span> <span style='color: #000080'>$badgeChange</span> <br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Badges<br />
}<br />
} <br />
} <span style='color: #C86400'>|</span> <span style='color: #C86400'>Format-List</span><br />
<br />
<span style='color: #000080'>$profileXml</span><span style='color: #C86400'>.</span>Save( <span style='color: #000080'>$profileXmlPath</span> )<br />
</div>
<br /><br />
The results are displayed in the typical PowerShell way:
<br /><br />
<div style="width: 100%; /*height: 100%;*/ overflow: auto; font-family: "Courier New", Courier, mono; font-size: 12px; background-color: #000000; color: #FFC400; padding: 2px 2px 2px 2px; white-space: nowrap">
<span style="font-weight: bold;">PSH$ .\Get-StackOverflowReputation.ps1 3950</span>
<br />
<span style="font-weight: bold;"></span>
<br />
<span style="font-weight: bold;">Answers Votes</span>
<br />
<span style="font-weight: bold;">------- -----</span>
<br />
<span style="font-weight: bold;">What is the one programming skill you have always wanted to master but haven't had time? 30</span>
<br />
<span style="font-weight: bold;">Is there a meaningful correlation between spelling and programming ability? 6</span>
<br />
<span style="font-weight: bold;">Factorial Algorithms in different languages 6</span>
<br />
<span style="font-weight: bold;">Modal popups - usability 6</span>
<br />
<span style="font-weight: bold;">How can I uninstall an application using PowerShell? 5</span>
<br />
<span style="font-weight: bold;">Function pointers in C - address operator "unnecessary" 5</span>
<br />
<span style="font-weight: bold;">Getting developers fired up about development 5</span>
<br />
<span style="font-weight: bold;">Rule you know you should follow but don't 4</span>
<br />
<span style="font-weight: bold;">"Hidden Secrets" of the Visual Studio .NET debugger? 4</span>
<br />
<span style="font-weight: bold;">C++ Restrict Template Function 4</span>
<br />
<span style="font-weight: bold;">Should a novice programmer spend time learning to write "desktop" applications these days,... 4</span>
<br />
<span style="font-weight: bold;">Parsing a log file with regular expressions 3</span>
<br />
<span style="font-weight: bold;">Shortcut for commenting CSS in VS 2008 3</span>
<br />
<span style="font-weight: bold;">How do I perform string operations on variables in a for loop? 2</span>
<br />
<span style="font-weight: bold;">Expose an event handler to VBScript users of my COM object 2</span>
<br />
<span style="font-weight: bold;">Where do "pure virtual function call" crashes come from? 2</span>
<br />
<span style="font-weight: bold;">Why do C# and VB have Generics? What benefit do they provide? Generics, FTW 2</span>
<br />
<span style="font-weight: bold;">regular expression to replace two (or more) consecutive characters by only one? 2</span>
<br />
<span style="font-weight: bold;">Anyone using a third-party Windows registry editor that they would recommend to others? 2</span>
<br />
<span style="font-weight: bold;">Transparent form on the desktop 1</span>
<br />
<span style="font-weight: bold;">Test if a Font is installed 1</span>
<br />
<span style="font-weight: bold;">Using what I've learned from stackoverflow. (HTML Scraper) 1</span>
<br />
<span style="font-weight: bold;">How to detect the presence of a default recording device in the system? 1</span>
<br />
<span style="font-weight: bold;">How do I add Debug Breakpoints to lines displayed in a "Find Results" window in Visual Studio 0</span>
<br />
<span style="font-weight: bold;">Regex Question - One or more spaces outside of a quote enclosed block of text 0</span>
<br />
<span style="font-weight: bold;"></span>
<br />
<span style="font-weight: bold;"></span>
<br />
<span style="font-weight: bold;"></span>
<br />
<span style="font-weight: bold;"></span>
<br />
<span style="font-weight: bold;">User : Jeff Hillman</span>
<br />
<span style="font-weight: bold;">Reputation : 790</span>
<br />
<span style="font-weight: bold;">Badges : 9</span>
<br />
<span style="font-weight: bold;"></span>
<br />
<span style="font-weight: bold;">
</span></div>
<br />
StackOverflow.com has recently added a feature on the user account page that provides some information about how the user's reputation has changed, but it still doesn't give you the detail that these scripts provide.
<br /><br />
This is just another example to me of how easy PowerShell can make tasks like this. This isn't likely to be useful for a long time, but it was fun. PowerShell is fun.Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com0tag:blogger.com,1999:blog-4092806390106651827.post-39228785019632332152008-05-16T02:44:00.000-07:002009-03-11T06:49:18.488-07:00Custom Cmdlets - Part threeFor this last post on the Cmdlets I have written, I will talk about my Send-Email Cmdlet. There are all kinds of scripts out there that show you how to send an email using the System.Net.Mail.SmtpClient class, and <a href="http://www.codeplex.com/PowerShellCX">PowerShell Community Extensions</a> also has a Cmdlet that will send an email for you using an SMTP server.<br /><br />
I am not a system administrator, so I don't have access to an SMTP server at the office where I currently work. I still wanted to be able to send an email from the command line or from a PowerShell script, so I added the ability to send an email using a Gmail account. The ability to use an SMTP server is still there, but it isn't nearly as interesting, so I won't talk about it here.<br /><br />
When I first decided I wanted to send an email using my Gmail account, I figured I would just find a .NET class library similar to the libraries provided for Blogger and some of the other Google services. I quickly discovered that not only did Google not provide an API for Gmail, but the libraries out there (that I could find, anyway) only provided the ability to read messages, not the ability to send them. After a little more research, I found a PHP library called <a href="http://sourceforge.net/projects/gmail-lite/">libgmailer</a> that could send messages. I studied the PHP code carefully, and translated just the parts I needed to log in to Gmail and send a message.<br /><br />
The most difficult part was handling attachments. Libgmailer uses the <a href="http://uk3.php.net/curl">PHP/CURL</a> class, which takes care of the messy stuff for you. I didn't know much about content types or really much else about HTTP requests (I'm not a web developer), so it was all pretty mysterious to me. I figured it out, and I am quite happy with the results:<br /><br />
<div style=" background: #dddddd; width: 100%; height: 400px; overflow: auto;font-family:Consolas;font-size:8pt;color:black;">
<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red200\green100\blue0;\red221\green221\blue221;\red0\green0\blue0;\red0\green0\blue128;\red163\green21\blue21;\red43\green145\blue175;\red0\green128\blue0;}??\fs16 \cf1\cb2\highlight2 using\cf0 System;\par ??\cf1 using\cf0 System.Collections.Generic;\par ??\cf1 using\cf0 System.Text;\par ??\cf1 using\cf0 System.Threading;\par ??\cf1 using\cf0 System.Management.Automation;\par ??\cf1 using\cf0 System.Net.Mail;\par ??\cf1 using\cf0 System.Net;\par ??\cf1 using\cf0 System.IO;\par ??\cf1 using\cf0 System.Web;\par ??\cf1 using\cf0 Microsoft.Win32;\par ??\cf1 using\cf0 System.Text.RegularExpressions;\par ??\cf1 using\cf0 System.Runtime.InteropServices;\par ??\cf1 using\cf0 System.Security;\par ??\par ??\cf1 namespace\cf0 CustomCmdlets\par ??\{\par ?? [\cf4 Cmdlet\cf0 ( \cf4 VerbsCommunications\cf0 .Send, \cf5 "Email"\cf0 , SupportsShouldProcess = \cf1 true\cf0 , DefaultParameterSetName = \cf5 "SMTP"\cf0 )]\par ?? \cf1 public\cf0 \cf1 class\cf0 \cf4 SendEmail\cf0 : \cf4 PSCmdlet\par ??\cf0 \{\par ?? \cf1 private\cf0 \cf1 const\cf0 \cf1 int\cf0 DefaultSmtpPort = 25;\par ??\par ?? \cf1 private\cf0 \cf1 const\cf0 \cf1 string\cf0 GMAIL_ADDRESS = \cf5 "https://mail.google.com/mail/"\cf0 ;\par ?? \cf1 private\cf0 \cf1 const\cf0 \cf1 string\cf0 GMAIL_LOGIN = \cf5 "https://www.google.com/accounts/ServiceLoginAuth"\cf0 ;\par ?? \cf1 private\cf0 \cf4 CookieCollection\cf0 cookieCollection;\par ?? \cf1 private\cf0 \cf1 string\cf0 multiPartBoundary;\par ??\par ?? \cf1 private\cf0 \cf4 SmtpClient\cf0 smtpClient;\par ?? \cf1 private\cf0 \cf4 List\cf0 <\cf4 FileInfo\cf0 > inputAttachments;\par ??\par ??\cf1 #region\cf0 Parameters\par ??\par ?? \cf1 private\cf0 \cf6 SwitchParameter\cf0 gmail;\par ??\par ?? [\cf4 Parameter\cf0 ( ParameterSetName = \cf5 "Gmail"\cf0 )]\par ?? \cf1 public\cf0 \cf6 SwitchParameter\cf0 Gmail\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 gmail;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? gmail = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 gmailUsername;\par ??\par ?? [\cf4 Parameter\cf0 ( ParameterSetName = \cf5 "Gmail"\cf0 , Mandatory = \cf1 true\cf0 )]\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 GmailUsername\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 gmailUsername;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? gmailUsername = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf4 SecureString\cf0 gmailPassword;\par ??\par ?? [\cf4 Parameter\cf0 ( ParameterSetName = \cf5 "Gmail"\cf0 , Mandatory = \cf1 true\cf0 )]\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf4 SecureString\cf0 GmailPassword\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 gmailPassword;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? gmailPassword = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 smtpHost;\par ??\par ?? [\cf4 Parameter\cf0 ( ParameterSetName = \cf5 "SMTP"\cf0 )]\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 SmtpHost\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 smtpHost;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? smtpHost = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? [\cf4 Parameter\cf0 ( ParameterSetName = \cf5 "SMTP"\cf0 )]\par ?? \cf1 public\cf0 \cf1 int\cf0 PortNumber\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 portNumber ?? DefaultSmtpPort;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? portNumber = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 int\cf0 ? portNumber;\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 from;\par ??\par ?? [\cf4 Parameter\cf0 ( ParameterSetName = \cf5 "SMTP"\cf0 )]\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 From\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 from;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? from = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 [] toArray;\par ??\par ?? [\cf4 Parameter\cf0 ( Mandatory = \cf1 true\cf0 )]\par ?? [\cf4 ValidateNotNullOrEmpty\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 [] To\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 toArray;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? toArray = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 [] ccArray = \cf1 new\cf0 \cf1 string\cf0 [ 0 ];\par ??\par ?? [\cf4 Parameter\cf0 ]\par ?? [\cf4 ValidateNotNull\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 [] Cc\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 ccArray;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? ccArray = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 [] bccArray = \cf1 new\cf0 \cf1 string\cf0 [ 0 ];\par ??\par ?? [\cf4 Parameter\cf0 ]\par ?? [\cf4 ValidateNotNull\cf0 ]\par ?? \cf1 public\cf0 \cf1 string\cf0 [] Bcc\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 bccArray;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? bccArray = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 subject;\par ??\par ?? [\cf4 Parameter\cf0 ( Mandatory = \cf1 true\cf0 )]\par ?? \cf1 public\cf0 \cf1 string\cf0 Subject\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 subject;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? subject = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 body;\par ??\par ?? [\cf4 Parameter\cf0 ( Mandatory = \cf1 true\cf0 )]\par ?? \cf1 public\cf0 \cf1 string\cf0 Body\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 body;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? body = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf6 SwitchParameter\cf0 bodyIsHtml;\par ??\par ?? [\cf4 Parameter\cf0 ]\par ?? \cf1 public\cf0 \cf6 SwitchParameter\cf0 BodyIsHtml\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 bodyIsHtml;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? bodyIsHtml = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf4 FileInfo\cf0 [] attachments = \cf1 new\cf0 \cf4 FileInfo\cf0 [ 0 ];\par ??\par ?? [\cf4 Parameter\cf0 ( ValueFromPipeline = \cf1 true\cf0 )]\par ?? [\cf4 ValidateNotNull\cf0 ]\par ?? \cf1 public\cf0 \cf4 FileInfo\cf0 [] Attachment\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 attachments;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? attachments = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 int\cf0 timeout = 60 * 1000;\par ??\par ?? [\cf4 Parameter\cf0 ]\par ?? [\cf4 ValidateRange\cf0 ( 0, \cf6 Int32\cf0 .MaxValue )]\par ?? \cf1 public\cf0 \cf1 int\cf0 Timeout\par ?? \{\par ?? \cf1 get\par ??\cf0 \{\par ?? \cf1 return\cf0 timeout;\par ?? \}\par ?? \cf1 set\par ??\cf0 \{\par ?? timeout = \cf1 value\cf0 ;\par ?? \}\par ?? \}\par ??\par ??\cf1 #endregion\par ??\par ??\cf0 \cf1 protected\cf0 \cf1 override\cf0 \cf1 void\cf0 BeginProcessing()\par ?? \{\par ?? inputAttachments = \cf1 new\cf0 \cf4 List\cf0 <\cf4 FileInfo\cf0 >();\par ??\par ?? \cf1 if\cf0 ( gmail.IsPresent )\par ?? \{\par ?? \cf1 if\cf0 ( gmailUsername == \cf1 null\cf0 )\par ?? \{\par ?? gmailUsername = (\cf1 string\cf0 )GetVariableValue( \cf5 "GmailUsername"\cf0 , \cf1 null\cf0 );\par ?? \}\par ??\par ?? \cf1 if\cf0 ( gmailPassword == \cf1 null\cf0 )\par ?? \{\par ?? gmailPassword = (\cf4 SecureString\cf0 )GetVariableValue( \cf5 "GmailPassword"\cf0 , \cf1 null\cf0 );\par ?? \}\par ??\par ?? \cf1 if\cf0 ( \cf1 string\cf0 .IsNullOrEmpty( gmailUsername ) || gmailPassword == \cf1 null\cf0 )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 (\par ?? \cf1 new\cf0 \cf4 Exception\cf0 ( \cf5 "You must provide a username and password."\cf0 ),\par ?? \cf5 "Send-Email"\cf0 , \cf6 ErrorCategory\cf0 .PermissionDenied, \cf1 this\cf0 ) );\par ?? \}\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? smtpHost = (\cf1 string\cf0 )GetVariableValue( \cf5 "EmailSmtpHost"\cf0 );\par ?? portNumber = (\cf1 int\cf0 ?)( GetVariableValue( \cf5 "EmailSmtpPort"\cf0 ) ?? DefaultSmtpPort );\par ?? from = (\cf1 string\cf0 )GetVariableValue( \cf5 "EmailFrom"\cf0 );\par ??\par ?? smtpClient = \cf1 new\cf0 \cf4 SmtpClient\cf0 ( smtpHost );\par ?? smtpClient.Port = portNumber.Value;\par ?? smtpClient.Timeout = timeout;\par ??\par ?? smtpClient.Credentials = \cf4 CredentialCache\cf0 .DefaultNetworkCredentials;\par ?? \}\par ?? \}\par ??\par ?? \cf1 protected\cf0 \cf1 override\cf0 \cf1 void\cf0 ProcessRecord()\par ?? \{\par ?? \cf1 if\cf0 ( attachments != \cf1 null\cf0 )\par ?? \{\par ?? \cf1 foreach\cf0 ( \cf4 FileInfo\cf0 attachment \cf1 in\cf0 attachments )\par ?? \{\par ?? \cf1 if\cf0 ( ShouldProcess( attachment.FullName ) )\par ?? \{\par ?? inputAttachments.Add( attachment );\par ?? \}\par ?? \}\par ?? \}\par ?? \}\par ??\par ?? \cf1 protected\cf0 \cf1 override\cf0 \cf1 void\cf0 EndProcessing()\par ?? \{\par ?? \cf1 try\par ??\cf0 \{\par ?? \cf1 if\cf0 ( gmail.IsPresent )\par ?? \{\par ?? SendGmailMessage();\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? SendSmtpMessage();\par ?? \}\par ?? \}\par ?? \cf1 finally\par ??\cf0 \{\par ?? inputAttachments = \cf1 null\cf0 ;\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 void\cf0 SendGmailMessage()\par ?? \{\par ?? \cf6 IntPtr\cf0 bstr = \cf4 Marshal\cf0 .SecureStringToBSTR( gmailPassword );\par ?? \cf1 string\cf0 plainGmailPassword = \cf4 Marshal\cf0 .PtrToStringAuto( bstr );\par ?? \cf4 Marshal\cf0 .ZeroFreeBSTR( bstr );\par ??\par ?? \cf1 string\cf0 loginPostDataString = \cf5 "&continue="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( GMAIL_ADDRESS ) +\par ?? \cf5 "&service=mail"\cf0 +\par ?? \cf5 "&hl=en"\cf0 +\par ?? \cf5 "&Email="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( gmailUsername ) +\par ?? \cf5 "&Passwd="\cf0 + \cf4 HttpUtility\cf0 .UrlEncode( plainGmailPassword );\par ??\par ?? \cf1 this\cf0 .cookieCollection = \cf1 new\cf0 \cf4 CookieCollection\cf0 ();\par ??\par ?? \cf1 this\cf0 .WriteVerbose( \cf5 "Sending Gmail login request..."\cf0 );\par ??\par ?? \cf1 string\cf0 loginResponse = MakeHttpWebRequest( GMAIL_LOGIN, \cf1 true\cf0 , \cf1 false\cf0 , \cf4 Encoding\cf0 .UTF8.GetBytes( loginPostDataString ) );\par ??\par ?? \cf7 // if we don't have this cookie, something went wrong\par ??\cf0 \cf1 if\cf0 ( \cf1 this\cf0 .cookieCollection[ \cf5 "GMAIL_AT"\cf0 ] == \cf1 null\cf0 )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 (\par ?? \cf1 new\cf0 \cf4 Exception\cf0 ( \cf5 "Could not log in to Gmail. Please check your username and password."\cf0 ),\par ?? \cf5 "Send-Email"\cf0 , \cf6 ErrorCategory\cf0 .PermissionDenied, \cf1 this\cf0 ) );\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? \cf1 this\cf0 .multiPartBoundary = \cf6 DateTime\cf0 .Now.Ticks.ToString( \cf5 "x"\cf0 );\par ??\par ?? \cf1 string\cf0 messageUrl = \cf1 string\cf0 .Format( \cf5 "\{0\}\{1\}"\cf0 , GMAIL_ADDRESS, \cf5 "?ui=1"\cf0 );\par ??\par ?? \cf4 MemoryStream\cf0 postDataStream = \cf1 new\cf0 \cf4 MemoryStream\cf0 ();\par ?? \cf4 BinaryWriter\cf0 postDataWriter = \cf1 new\cf0 \cf4 BinaryWriter\cf0 ( postDataStream );\par ??\par ?? \cf4 Dictionary\cf0 <\cf1 string\cf0 , \cf1 string\cf0 > variableHash = \cf1 new\cf0 \cf4 Dictionary\cf0 <\cf1 string\cf0 , \cf1 string\cf0 >();\par ??\par ?? variableHash.Add( \cf5 "view"\cf0 , \cf5 "sm"\cf0 );\par ?? variableHash.Add( \cf5 "at"\cf0 , \cf1 this\cf0 .cookieCollection[ \cf5 "GMAIL_AT"\cf0 ].Value );\par ?? variableHash.Add( \cf5 "to"\cf0 , \cf1 string\cf0 .Join( \cf5 ", "\cf0 , toArray ) );\par ?? variableHash.Add( \cf5 "cc"\cf0 , \cf1 string\cf0 .Join( \cf5 ", "\cf0 , ccArray ) );\par ?? variableHash.Add( \cf5 "bcc"\cf0 , \cf1 string\cf0 .Join( \cf5 ", "\cf0 , bccArray ) );\par ?? variableHash.Add( \cf5 "subject"\cf0 , subject );\par ?? variableHash.Add( \cf5 "ishtml"\cf0 , bodyIsHtml.IsPresent ? \cf5 "1"\cf0 : \cf5 "0"\cf0 );\par ?? variableHash.Add( \cf5 "msgbody"\cf0 , body );\par ??\par ?? \cf1 foreach\cf0 ( \cf1 string\cf0 key \cf1 in\cf0 variableHash.Keys )\par ?? \{\par ?? postDataWriter.Write( \cf4 Encoding\cf0 .UTF8.GetBytes( \cf1 string\cf0 .Format(\par ?? \cf5 "--\{0\}\\r\\nContent-Disposition: form-data; name=\\"\{1\}\\"\\r\\n\\r\\n\{2\}\\r\\n"\cf0 ,\par ?? \cf1 this\cf0 .multiPartBoundary, key, variableHash[ key ] ) ) );\par ?? \}\par ??\par ?? \cf7 // add the attachments\par ??\cf0 \cf1 if\cf0 ( inputAttachments.Count > 0 )\par ?? \{\par ?? messageUrl = \cf1 string\cf0 .Format( \cf5 "\{0\}&newattach=\{1\}"\cf0 , messageUrl, inputAttachments.Count );\par ??\par ?? \cf1 byte\cf0 [] attachmentData = \cf1 new\cf0 \cf1 byte\cf0 [ 0 ];\par ??\par ?? \cf1 for\cf0 ( \cf1 int\cf0 i = 0; i < inputAttachments.Count; i++ )\par ?? \{\par ?? \cf4 FileInfo\cf0 attachment = inputAttachments[ i ];\par ?? \cf4 FileStream\cf0 fileStream = \cf1 null\cf0 ;\par ??\par ?? \cf1 try\par ??\cf0 \{\par ?? fileStream = \cf4 File\cf0 .OpenRead( attachment.FullName );\par ?? \cf1 byte\cf0 [] fileData = \cf1 new\cf0 \cf1 byte\cf0 [ fileStream.Length ];\par ?? fileStream.Read( fileData, 0, fileData.Length );\par ??\par ?? postDataWriter.Write( \cf4 Encoding\cf0 .UTF8.GetBytes( \cf1 string\cf0 .Format(\par ?? \cf5 "--\{0\}\\r\\nContent-Disposition: form-data; name=\\"file\{1\}\\"; filename=\\"\{2\}\\"\\r\\nContent-Type: \{3\}\\r\\n\\r\\n"\cf0 ,\par ?? \cf1 this\cf0 .multiPartBoundary, i, attachment.Name, GetMimeType( attachment ) ) ) );\par ?? postDataWriter.Write( fileData );\par ?? postDataWriter.Write( \cf4 Encoding\cf0 .UTF8.GetBytes( \cf5 "\\r\\n"\cf0 ) );\par ?? \}\par ?? \cf1 catch\cf0 ( \cf4 Exception\cf0 ex )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 ( ex, \cf5 "Send-Email"\cf0 , \cf6 ErrorCategory\cf0 .InvalidData, \cf1 this\cf0 ) );\par ?? \}\par ?? \cf1 finally\par ??\cf0 \{\par ?? \cf1 if\cf0 ( fileStream != \cf1 null\cf0 )\par ?? \{\par ?? fileStream.Close();\par ?? \}\par ?? \}\par ?? \}\par ?? \}\par ??\par ?? postDataWriter.Write( \cf4 Encoding\cf0 .UTF8.GetBytes( \cf1 string\cf0 .Format( \cf5 "--\{0\}--\\r\\n"\cf0 , \cf1 this\cf0 .multiPartBoundary ) ) );\par ?? postDataWriter.Flush();\par ??\par ?? \cf1 byte\cf0 [] messagePostData = postDataStream.ToArray();\par ??\par ?? postDataStream.Close();\par ?? postDataWriter.Close();\par ??\par ?? \cf1 this\cf0 .WriteVerbose( \cf5 "Sending Gmail message request..."\cf0 );\par ??\par ?? \cf1 string\cf0 messageResponse = MakeHttpWebRequest( messageUrl, \cf1 true\cf0 , \cf1 true\cf0 , messagePostData );\par ??\par ?? \cf7 // parse the message response\par ??\cf0 messageResponse = \cf4 Regex\cf0 .Replace( messageResponse, \cf5 "\\n"\cf0 , \cf5 ""\cf0 );\par ?? \cf4 Match\cf0 responseMatch = \cf4 Regex\cf0 .Match( messageResponse, \cf5 @"D\\(\\[(?<Data>""sr"",[^)]+)\\]\\);"\cf0 );\par ??\par ?? \cf1 if\cf0 ( responseMatch.Success )\par ?? \{\par ?? \cf1 string\cf0 [] responseParts = \cf4 Regex\cf0 .Split( responseMatch.Groups[ \cf5 "Data"\cf0 ].Value, \cf5 ","\cf0 );\par ?? \cf1 bool\cf0 sent = ( responseParts[ 2 ] == \cf5 "1"\cf0 );\par ?? \cf1 string\cf0 message = \cf4 Regex\cf0 .Unescape( responseParts[ 3 ].Substring( 1, responseParts[ 3 ].Length - 2 ) );\par ??\par ?? \cf1 if\cf0 ( sent )\par ?? \{\par ?? \cf1 this\cf0 .WriteObject( message );\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 ( \cf1 new\cf0 \cf4 Exception\cf0 ( message ), \cf5 "Send-Email"\cf0 , \cf6 ErrorCategory\cf0 .NotSpecified, \cf1 this\cf0 ) );\par ?? \}\par ?? \}\par ?? \}\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 GetMimeType( \cf4 FileInfo\cf0 file )\par ?? \{\par ?? \cf1 string\cf0 mimeType = \cf5 "application/octet-stream"\cf0 ;\par ??\par ?? \cf1 try\par ??\cf0 \{\par ?? mimeType = \cf4 Registry\cf0 .ClassesRoot.OpenSubKey( file.Extension ).GetValue( \cf5 "Content Type"\cf0 ).ToString();\par ?? \}\par ?? \cf1 catch\par ??\cf0 \{\par ?? \cf7 // default to "application/octet-stream"\par ??\cf0 \}\par ??\par ?? \cf1 return\cf0 mimeType;\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 string\cf0 MakeHttpWebRequest( \cf1 string\cf0 requestUrl, \cf1 bool\cf0 post, \cf1 bool\cf0 multiPart, \cf1 byte\cf0 [] postData )\par ?? \{\par ?? \cf4 HttpWebRequest\cf0 webRequest = (\cf4 HttpWebRequest\cf0 )\cf4 WebRequest\cf0 .Create( \cf1 new\cf0 \cf4 Uri\cf0 ( requestUrl ) );\par ??\par ?? \cf7 // we need to do this ourselves\par ??\cf0 webRequest.AllowAutoRedirect = \cf1 false\cf0 ;\par ?? webRequest.KeepAlive = \cf1 false\cf0 ;\par ?? webRequest.Credentials = \cf4 CredentialCache\cf0 .DefaultNetworkCredentials;\par ??\par ?? webRequest.Timeout = timeout;\par ??\par ?? webRequest.CookieContainer = \cf1 new\cf0 \cf4 CookieContainer\cf0 ();\par ?? webRequest.CookieContainer.Add( cookieCollection );\par ??\par ?? \cf1 if\cf0 ( post )\par ?? \{\par ?? webRequest.Method = \cf5 "POST"\cf0 ;\par ??\par ?? \cf1 if\cf0 ( multiPart )\par ?? \{\par ?? webRequest.ContentType = \cf1 string\cf0 .Format( \cf5 "multipart/form-data; boundary=\{0\}"\cf0 , multiPartBoundary );\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? webRequest.ContentType = \cf5 "application/x-www-form-urlencoded"\cf0 ;\par ?? \}\par ??\par ?? webRequest.ContentLength = postData.Length;\par ??\par ?? \cf4 Stream\cf0 requestStream = \cf1 null\cf0 ;\par ??\par ?? \cf1 try\par ??\cf0 \{\par ?? requestStream = webRequest.GetRequestStream();\par ?? requestStream.Write( postData, 0, postData.Length );\par ?? \}\par ?? \cf1 catch\cf0 ( \cf4 Exception\cf0 ex )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 ( ex, \cf5 "Send-Email"\cf0 , \cf6 ErrorCategory\cf0 .InvalidData, \cf1 this\cf0 ) );\par ?? \}\par ?? \cf1 finally\par ??\cf0 \{\par ?? \cf1 if\cf0 ( requestStream != \cf1 null\cf0 )\par ?? \{\par ?? requestStream.Close();\par ?? \}\par ?? \}\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? webRequest.Method = \cf5 "GET"\cf0 ;\par ?? webRequest.ContentType = \cf5 "text/html"\cf0 ;\par ?? \}\par ??\par ?? \cf4 HttpWebResponse\cf0 webResponse = \cf1 null\cf0 ;\par ?? \cf1 string\cf0 responseString = \cf5 ""\cf0 ;\par ??\par ?? \cf1 try\par ??\cf0 \{\par ?? webResponse = (\cf4 HttpWebResponse\cf0 )webRequest.GetResponse();\par ??\par ?? cookieCollection.Add( webResponse.Cookies );\par ??\par ?? \cf4 StreamReader\cf0 streamReader = \cf1 new\cf0 \cf4 StreamReader\cf0 ( webResponse.GetResponseStream() );\par ??\par ?? responseString = streamReader.ReadToEnd();\par ??\par ?? streamReader.Close();\par ??\par ?? \cf7 // redirect if we have a Location header or a <meta> refresh tag\par ??\cf0 \cf1 if\cf0 ( webResponse.Headers[ \cf5 "Location"\cf0 ] != \cf1 null\cf0 )\par ?? \{\par ?? responseString = MakeHttpWebRequest( webResponse.Headers[ \cf5 "Location"\cf0 ], \cf1 false\cf0 , \cf1 false\cf0 , \cf1 null\cf0 );\par ?? \}\par ?? \cf1 else\par ??\cf0 \{\par ?? \cf4 Match\cf0 urlMatch;\par ??\par ?? \cf1 if\cf0 ( ( urlMatch = \cf4 Regex\cf0 .Match( responseString, \cf5 @"<meta\\s*(http-equiv\\s*=\\s*""refresh"")?\\s*content\\s*=\\s*""\\s*0;\\s*url\\s*=\\s*&#39;(?<URL>((?!&#39;).)*)&#39;"\cf0 ) ).Success )\par ?? \{\par ?? responseString = MakeHttpWebRequest( urlMatch.Groups[ \cf5 "URL"\cf0 ].Value.Replace( \cf5 "&amp;"\cf0 , \cf5 "&"\cf0 ), \cf1 false\cf0 , \cf1 false\cf0 , \cf1 null\cf0 );\par ?? \}\par ?? \}\par ?? \}\par ?? \cf1 catch\cf0 ( \cf4 Exception\cf0 ex )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 ( ex, \cf5 "Send-Email"\cf0 , \cf6 ErrorCategory\cf0 .InvalidResult, \cf1 this\cf0 ) );\par ?? \}\par ?? \cf1 finally\par ??\cf0 \{\par ?? \cf1 if\cf0 ( webResponse != \cf1 null\cf0 )\par ?? \{\par ?? webResponse.Close();\par ?? \}\par ?? \}\par ??\par ?? \cf1 return\cf0 responseString;\par ?? \}\par ??\par ?? \cf1 private\cf0 \cf1 void\cf0 SendSmtpMessage()\par ?? \{\par ?? \cf1 try\par ??\cf0 \{\par ?? \cf4 MailMessage\cf0 message = \cf1 new\cf0 \cf4 MailMessage\cf0 ();\par ??\par ?? message.From = \cf1 new\cf0 \cf4 MailAddress\cf0 ( from );\par ??\par ?? \cf1 foreach\cf0 ( \cf1 string\cf0 recipient \cf1 in\cf0 toArray )\par ?? \{\par ?? message.To.Add( recipient );\par ?? \}\par ??\par ?? \cf1 foreach\cf0 ( \cf1 string\cf0 recipient \cf1 in\cf0 ccArray )\par ?? \{\par ?? message.CC.Add( recipient );\par ?? \}\par ??\par ?? \cf1 foreach\cf0 ( \cf1 string\cf0 recipient \cf1 in\cf0 bccArray )\par ?? \{\par ?? message.Bcc.Add( recipient );\par ?? \}\par ??\par ?? \cf1 if\cf0 ( !\cf1 string\cf0 .IsNullOrEmpty( subject ) )\par ?? \{\par ?? message.Subject = subject;\par ?? \}\par ??\par ?? \cf1 if\cf0 ( !\cf1 string\cf0 .IsNullOrEmpty( body ) )\par ?? \{\par ?? message.Body = body;\par ?? \}\par ??\par ?? message.IsBodyHtml = bodyIsHtml.IsPresent;\par ??\par ?? \cf1 foreach\cf0 ( \cf4 FileInfo\cf0 attachment \cf1 in\cf0 inputAttachments )\par ?? \{\par ?? message.Attachments.Add( \cf1 new\cf0 \cf4 Attachment\cf0 ( attachment.FullName ) );\par ?? \}\par ??\par ?? \cf1 if\cf0 ( ShouldProcess( message.Subject ) )\par ?? \{\par ?? smtpClient.Send( message );\par ?? \}\par ?? \}\par ?? \cf1 catch\cf0 ( \cf4 Exception\cf0 ex )\par ?? \{\par ?? \cf1 this\cf0 .WriteError( \cf1 new\cf0 \cf4 ErrorRecord\cf0 ( ex, \cf5 "Send-Email"\cf0 , \cf6 ErrorCategory\cf0 .InvalidOperation, \cf1 this\cf0 ) );\par ?? \}\par ?? \}\par ?? \}\par ??\}}
-->
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Collections.Generic;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Text;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Threading;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Net.Mail;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Net;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.IO;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Web;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> Microsoft.Win32;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Text.RegularExpressions;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Runtime.InteropServices;</p>
<p style="margin: 0px;"><span style="color: #c86400;">using</span> System.Security;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="color: #c86400;">namespace</span> CustomCmdlets</p>
<p style="margin: 0px;">{</p>
<p style="margin: 0px;"> [<span style="color: navy;">Cmdlet</span>( <span style="color: navy;">VerbsCommunications</span>.Send, <span style="color: #a31515;">"Email"</span>, SupportsShouldProcess = <span style="color: #c86400;">true</span>, DefaultParameterSetName = <span style="color: #a31515;">"SMTP"</span> )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">SendEmail</span> : <span style="color: navy;">PSCmdlet</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">const</span> <span style="color: #c86400;">int</span> DefaultSmtpPort = 25;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">const</span> <span style="color: #c86400;">string</span> GMAIL_ADDRESS = <span style="color: #a31515;">"https://mail.google.com/mail/"</span>;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">const</span> <span style="color: #c86400;">string</span> GMAIL_LOGIN = <span style="color: #a31515;">"https://www.google.com/accounts/ServiceLoginAuth"</span>;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">CookieCollection</span> cookieCollection;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> multiPartBoundary;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">SmtpClient</span> smtpClient;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">List</span><<span style="color: navy;">FileInfo</span>> inputAttachments;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="color: #c86400;"> #region</span> Parameters</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #2b91af;">SwitchParameter</span> gmail;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ParameterSetName = <span style="color: #a31515;">"Gmail"</span> )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #2b91af;">SwitchParameter</span> Gmail</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> gmail;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmail = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> gmailUsername;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ParameterSetName = <span style="color: #a31515;">"Gmail"</span>, Mandatory = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> GmailUsername</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> gmailUsername;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailUsername = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">SecureString</span> gmailPassword;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ParameterSetName = <span style="color: #a31515;">"Gmail"</span>, Mandatory = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SecureString</span> GmailPassword</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> gmailPassword;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailPassword = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> smtpHost;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ParameterSetName = <span style="color: #a31515;">"SMTP"</span> )]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> SmtpHost</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> smtpHost;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> smtpHost = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ParameterSetName = <span style="color: #a31515;">"SMTP"</span> )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">int</span> PortNumber</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> portNumber ?? DefaultSmtpPort;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> portNumber = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">int</span>? portNumber;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> from;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ParameterSetName = <span style="color: #a31515;">"SMTP"</span> )]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> From</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> from;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> from = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span>[] toArray;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span>[] To</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> toArray;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> toArray = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span>[] ccArray = <span style="color: #c86400;">new</span> <span style="color: #c86400;">string</span>[ 0 ];</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNull</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span>[] Cc</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> ccArray;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> ccArray = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span>[] bccArray = <span style="color: #c86400;">new</span> <span style="color: #c86400;">string</span>[ 0 ];</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNull</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span>[] Bcc</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> bccArray;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> bccArray = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> subject;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Subject</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> subject;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> subject = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> body;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Body</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> body;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> body = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #2b91af;">SwitchParameter</span> bodyIsHtml;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #2b91af;">SwitchParameter</span> BodyIsHtml</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> bodyIsHtml;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> bodyIsHtml = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">FileInfo</span>[] attachments = <span style="color: #c86400;">new</span> <span style="color: navy;">FileInfo</span>[ 0 ];</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ValueFromPipeline = <span style="color: #c86400;">true</span> )]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateNotNull</span>]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">FileInfo</span>[] Attachment</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> attachments;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> attachments = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">int</span> timeout = 60 * 1000;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</p>
<p style="margin: 0px;"> [<span style="color: navy;">ValidateRange</span>( 0, <span style="color: #2b91af;">Int32</span>.MaxValue )]</p>
<p style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">int</span> Timeout</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">get</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> timeout;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">set</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> timeout = <span style="color: #c86400;">value</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="color: #c86400;"> #endregion</span></p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> BeginProcessing()</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> inputAttachments = <span style="color: #c86400;">new</span> <span style="color: navy;">List</span><<span style="color: navy;">FileInfo</span>>();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( gmail.IsPresent )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( gmailUsername == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailUsername = (<span style="color: #c86400;">string</span>)GetVariableValue( <span style="color: #a31515;">"GmailUsername"</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( gmailPassword == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> gmailPassword = (<span style="color: navy;">SecureString</span>)GetVariableValue( <span style="color: #a31515;">"GmailPassword"</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">string</span>.IsNullOrEmpty( gmailUsername ) || gmailPassword == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>(</p>
<p style="margin: 0px;"> <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( <span style="color: #a31515;">"You must provide a username and password."</span> ),</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"Send-Email"</span>, <span style="color: #2b91af;">ErrorCategory</span>.PermissionDenied, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> smtpHost = (<span style="color: #c86400;">string</span>)GetVariableValue( <span style="color: #a31515;">"EmailSmtpHost"</span> );</p>
<p style="margin: 0px;"> portNumber = (<span style="color: #c86400;">int</span>?)( GetVariableValue( <span style="color: #a31515;">"EmailSmtpPort"</span> ) ?? DefaultSmtpPort );</p>
<p style="margin: 0px;"> from = (<span style="color: #c86400;">string</span>)GetVariableValue( <span style="color: #a31515;">"EmailFrom"</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> smtpClient = <span style="color: #c86400;">new</span> <span style="color: navy;">SmtpClient</span>( smtpHost );</p>
<p style="margin: 0px;"> smtpClient.Port = portNumber.Value;</p>
<p style="margin: 0px;"> smtpClient.Timeout = timeout;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> smtpClient.Credentials = <span style="color: navy;">CredentialCache</span>.DefaultNetworkCredentials;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> ProcessRecord()</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( attachments != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: navy;">FileInfo</span> attachment <span style="color: #c86400;">in</span> attachments )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( attachment.FullName ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> inputAttachments.Add( attachment );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> EndProcessing()</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( gmail.IsPresent )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> SendGmailMessage();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> SendSmtpMessage();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">finally</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> inputAttachments = <span style="color: #c86400;">null</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">void</span> SendGmailMessage()</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #2b91af;">IntPtr</span> bstr = <span style="color: navy;">Marshal</span>.SecureStringToBSTR( gmailPassword );</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> plainGmailPassword = <span style="color: navy;">Marshal</span>.PtrToStringAuto( bstr );</p>
<p style="margin: 0px;"> <span style="color: navy;">Marshal</span>.ZeroFreeBSTR( bstr );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> loginPostDataString = <span style="color: #a31515;">"&continue="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( GMAIL_ADDRESS ) +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&service=mail"</span> +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&hl=en"</span> +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&Email="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( gmailUsername ) +</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"&Passwd="</span> + <span style="color: navy;">HttpUtility</span>.UrlEncode( plainGmailPassword );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.cookieCollection = <span style="color: #c86400;">new</span> <span style="color: navy;">CookieCollection</span>();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteVerbose( <span style="color: #a31515;">"Sending Gmail login request..."</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> loginResponse = MakeHttpWebRequest( GMAIL_LOGIN, <span style="color: #c86400;">true</span>, <span style="color: #c86400;">false</span>, <span style="color: navy;">Encoding</span>.UTF8.GetBytes( loginPostDataString ) );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// if we don't have this cookie, something went wrong</span></p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.cookieCollection[ <span style="color: #a31515;">"GMAIL_AT"</span> ] == <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>(</p>
<p style="margin: 0px;"> <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( <span style="color: #a31515;">"Could not log in to Gmail. Please check your username and password."</span> ),</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"Send-Email"</span>, <span style="color: #2b91af;">ErrorCategory</span>.PermissionDenied, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.multiPartBoundary = <span style="color: #2b91af;">DateTime</span>.Now.Ticks.ToString( <span style="color: #a31515;">"x"</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> messageUrl = <span style="color: #c86400;">string</span>.Format( <span style="color: #a31515;">"{0}{1}"</span>, GMAIL_ADDRESS, <span style="color: #a31515;">"?ui=1"</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">MemoryStream</span> postDataStream = <span style="color: #c86400;">new</span> <span style="color: navy;">MemoryStream</span>();</p>
<p style="margin: 0px;"> <span style="color: navy;">BinaryWriter</span> postDataWriter = <span style="color: #c86400;">new</span> <span style="color: navy;">BinaryWriter</span>( postDataStream );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">Dictionary</span><<span style="color: #c86400;">string</span>, <span style="color: #c86400;">string</span>> variableHash = <span style="color: #c86400;">new</span> <span style="color: navy;">Dictionary</span><<span style="color: #c86400;">string</span>, <span style="color: #c86400;">string</span>>();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"view"</span>, <span style="color: #a31515;">"sm"</span> );</p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"at"</span>, <span style="color: #c86400;">this</span>.cookieCollection[ <span style="color: #a31515;">"GMAIL_AT"</span> ].Value );</p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"to"</span>, <span style="color: #c86400;">string</span>.Join( <span style="color: #a31515;">", "</span>, toArray ) );</p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"cc"</span>, <span style="color: #c86400;">string</span>.Join( <span style="color: #a31515;">", "</span>, ccArray ) );</p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"bcc"</span>, <span style="color: #c86400;">string</span>.Join( <span style="color: #a31515;">", "</span>, bccArray ) );</p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"subject"</span>, subject );</p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"ishtml"</span>, bodyIsHtml.IsPresent ? <span style="color: #a31515;">"1"</span> : <span style="color: #a31515;">"0"</span> );</p>
<p style="margin: 0px;"> variableHash.Add( <span style="color: #a31515;">"msgbody"</span>, body );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: #c86400;">string</span> key <span style="color: #c86400;">in</span> variableHash.Keys )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> postDataWriter.Write( <span style="color: navy;">Encoding</span>.UTF8.GetBytes( <span style="color: #c86400;">string</span>.Format(</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n"</span>,</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.multiPartBoundary, key, variableHash[ key ] ) ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// add the attachments</span></p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( inputAttachments.Count > 0 )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> messageUrl = <span style="color: #c86400;">string</span>.Format( <span style="color: #a31515;">"{0}&newattach={1}"</span>, messageUrl, inputAttachments.Count );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">byte</span>[] attachmentData = <span style="color: #c86400;">new</span> <span style="color: #c86400;">byte</span>[ 0 ];</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">for</span> ( <span style="color: #c86400;">int</span> i = 0; i < inputAttachments.Count; i++ )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: navy;">FileInfo</span> attachment = inputAttachments[ i ];</p>
<p style="margin: 0px;"> <span style="color: navy;">FileStream</span> fileStream = <span style="color: #c86400;">null</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> fileStream = <span style="color: navy;">File</span>.OpenRead( attachment.FullName );</p>
<p style="margin: 0px;"> <span style="color: #c86400;">byte</span>[] fileData = <span style="color: #c86400;">new</span> <span style="color: #c86400;">byte</span>[ fileStream.Length ];</p>
<p style="margin: 0px;"> fileStream.Read( fileData, 0, fileData.Length );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> postDataWriter.Write( <span style="color: navy;">Encoding</span>.UTF8.GetBytes( <span style="color: #c86400;">string</span>.Format(</p>
<p style="margin: 0px;"> <span style="color: #a31515;">"--{0}\r\nContent-Disposition: form-data; name=\"file{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n"</span>,</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.multiPartBoundary, i, attachment.Name, GetMimeType( attachment ) ) ) );</p>
<p style="margin: 0px;"> postDataWriter.Write( fileData );</p>
<p style="margin: 0px;"> postDataWriter.Write( <span style="color: navy;">Encoding</span>.UTF8.GetBytes( <span style="color: #a31515;">"\r\n"</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">catch</span> ( <span style="color: navy;">Exception</span> ex )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( ex, <span style="color: #a31515;">"Send-Email"</span>, <span style="color: #2b91af;">ErrorCategory</span>.InvalidData, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">finally</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( fileStream != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> fileStream.Close();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> postDataWriter.Write( <span style="color: navy;">Encoding</span>.UTF8.GetBytes( <span style="color: #c86400;">string</span>.Format( <span style="color: #a31515;">"--{0}--\r\n"</span>, <span style="color: #c86400;">this</span>.multiPartBoundary ) ) );</p>
<p style="margin: 0px;"> postDataWriter.Flush();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">byte</span>[] messagePostData = postDataStream.ToArray();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> postDataStream.Close();</p>
<p style="margin: 0px;"> postDataWriter.Close();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteVerbose( <span style="color: #a31515;">"Sending Gmail message request..."</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> messageResponse = MakeHttpWebRequest( messageUrl, <span style="color: #c86400;">true</span>, <span style="color: #c86400;">true</span>, messagePostData );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// parse the message response</span></p>
<p style="margin: 0px;"> messageResponse = <span style="color: navy;">Regex</span>.Replace( messageResponse, <span style="color: #a31515;">"\n"</span>, <span style="color: #a31515;">""</span> );</p>
<p style="margin: 0px;"> <span style="color: navy;">Match</span> responseMatch = <span style="color: navy;">Regex</span>.Match( messageResponse, <span style="color: #a31515;">@"D\(\[(?<Data>""sr"",[^)]+)\]\);"</span> );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( responseMatch.Success )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span>[] responseParts = <span style="color: navy;">Regex</span>.Split( responseMatch.Groups[ <span style="color: #a31515;">"Data"</span> ].Value, <span style="color: #a31515;">","</span> );</p>
<p style="margin: 0px;"> <span style="color: #c86400;">bool</span> sent = ( responseParts[ 2 ] == <span style="color: #a31515;">"1"</span> );</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> message = <span style="color: navy;">Regex</span>.Unescape( responseParts[ 3 ].Substring( 1, responseParts[ 3 ].Length - 2 ) );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( sent )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteObject( message );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( message ), <span style="color: #a31515;">"Send-Email"</span>, <span style="color: #2b91af;">ErrorCategory</span>.NotSpecified, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> GetMimeType( <span style="color: navy;">FileInfo</span> file )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> mimeType = <span style="color: #a31515;">"application/octet-stream"</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> mimeType = <span style="color: navy;">Registry</span>.ClassesRoot.OpenSubKey( file.Extension ).GetValue( <span style="color: #a31515;">"Content Type"</span> ).ToString();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">catch</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: green;">// default to "application/octet-stream"</span></p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> mimeType;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> MakeHttpWebRequest( <span style="color: #c86400;">string</span> requestUrl, <span style="color: #c86400;">bool</span> post, <span style="color: #c86400;">bool</span> multiPart, <span style="color: #c86400;">byte</span>[] postData )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: navy;">HttpWebRequest</span> webRequest = (<span style="color: navy;">HttpWebRequest</span>)<span style="color: navy;">WebRequest</span>.Create( <span style="color: #c86400;">new</span> <span style="color: navy;">Uri</span>( requestUrl ) );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// we need to do this ourselves</span></p>
<p style="margin: 0px;"> webRequest.AllowAutoRedirect = <span style="color: #c86400;">false</span>;</p>
<p style="margin: 0px;"> webRequest.KeepAlive = <span style="color: #c86400;">false</span>;</p>
<p style="margin: 0px;"> webRequest.Credentials = <span style="color: navy;">CredentialCache</span>.DefaultNetworkCredentials;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> webRequest.Timeout = timeout;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> webRequest.CookieContainer = <span style="color: #c86400;">new</span> <span style="color: navy;">CookieContainer</span>();</p>
<p style="margin: 0px;"> webRequest.CookieContainer.Add( cookieCollection );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( post )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webRequest.Method = <span style="color: #a31515;">"POST"</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( multiPart )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webRequest.ContentType = <span style="color: #c86400;">string</span>.Format( <span style="color: #a31515;">"multipart/form-data; boundary={0}"</span>, multiPartBoundary );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webRequest.ContentType = <span style="color: #a31515;">"application/x-www-form-urlencoded"</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> webRequest.ContentLength = postData.Length;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">Stream</span> requestStream = <span style="color: #c86400;">null</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> requestStream = webRequest.GetRequestStream();</p>
<p style="margin: 0px;"> requestStream.Write( postData, 0, postData.Length );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">catch</span> ( <span style="color: navy;">Exception</span> ex )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( ex, <span style="color: #a31515;">"Send-Email"</span>, <span style="color: #2b91af;">ErrorCategory</span>.InvalidData, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">finally</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( requestStream != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> requestStream.Close();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webRequest.Method = <span style="color: #a31515;">"GET"</span>;</p>
<p style="margin: 0px;"> webRequest.ContentType = <span style="color: #a31515;">"text/html"</span>;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">HttpWebResponse</span> webResponse = <span style="color: #c86400;">null</span>;</p>
<p style="margin: 0px;"> <span style="color: #c86400;">string</span> responseString = <span style="color: #a31515;">""</span>;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webResponse = (<span style="color: navy;">HttpWebResponse</span>)webRequest.GetResponse();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> cookieCollection.Add( webResponse.Cookies );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: navy;">StreamReader</span> streamReader = <span style="color: #c86400;">new</span> <span style="color: navy;">StreamReader</span>( webResponse.GetResponseStream() );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> responseString = streamReader.ReadToEnd();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> streamReader.Close();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: green;">// redirect if we have a Location header or a <meta> refresh tag</span></p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( webResponse.Headers[ <span style="color: #a31515;">"Location"</span> ] != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> responseString = MakeHttpWebRequest( webResponse.Headers[ <span style="color: #a31515;">"Location"</span> ], <span style="color: #c86400;">false</span>, <span style="color: #c86400;">false</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">else</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: navy;">Match</span> urlMatch;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ( urlMatch = <span style="color: navy;">Regex</span>.Match( responseString, <span style="color: #a31515;">@"<meta\s*(http-equiv\s*=\s*""refresh"")?\s*content\s*=\s*""\s*0;\s*url\s*=\s*&#39;(?<URL>((?!&#39;).)*)&#39;"</span> ) ).Success )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> responseString = MakeHttpWebRequest( urlMatch.Groups[ <span style="color: #a31515;">"URL"</span> ].Value.Replace( <span style="color: #a31515;">"&amp;"</span>, <span style="color: #a31515;">"&"</span> ), <span style="color: #c86400;">false</span>, <span style="color: #c86400;">false</span>, <span style="color: #c86400;">null</span> );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">catch</span> ( <span style="color: navy;">Exception</span> ex )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( ex, <span style="color: #a31515;">"Send-Email"</span>, <span style="color: #2b91af;">ErrorCategory</span>.InvalidResult, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">finally</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( webResponse != <span style="color: #c86400;">null</span> )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> webResponse.Close();</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">return</span> responseString;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">void</span> SendSmtpMessage()</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">try</span></p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: navy;">MailMessage</span> message = <span style="color: #c86400;">new</span> <span style="color: navy;">MailMessage</span>();</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> message.From = <span style="color: #c86400;">new</span> <span style="color: navy;">MailAddress</span>( from );</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: #c86400;">string</span> recipient <span style="color: #c86400;">in</span> toArray )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> message.To.Add( recipient );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: #c86400;">string</span> recipient <span style="color: #c86400;">in</span> ccArray )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> message.CC.Add( recipient );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: #c86400;">string</span> recipient <span style="color: #c86400;">in</span> bccArray )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> message.Bcc.Add( recipient );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !<span style="color: #c86400;">string</span>.IsNullOrEmpty( subject ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> message.Subject = subject;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !<span style="color: #c86400;">string</span>.IsNullOrEmpty( body ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> message.Body = body;</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> message.IsBodyHtml = bodyIsHtml.IsPresent;</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: navy;">FileInfo</span> attachment <span style="color: #c86400;">in</span> inputAttachments )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> message.Attachments.Add( <span style="color: #c86400;">new</span> <span style="color: navy;">Attachment</span>( attachment.FullName ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( message.Subject ) )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> smtpClient.Send( message );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> <span style="color: #c86400;">catch</span> ( <span style="color: navy;">Exception</span> ex )</p>
<p style="margin: 0px;"> {</p>
<p style="margin: 0px;"> <span style="color: #c86400;">this</span>.WriteError( <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( ex, <span style="color: #a31515;">"Send-Email"</span>, <span style="color: #2b91af;">ErrorCategory</span>.InvalidOperation, <span style="color: #c86400;">this</span> ) );</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;"> }</p>
<p style="margin: 0px;">}</p>
</div>
</div>
<br />
The Send-Email Cmdlet has one ParameterSet for Gmail messages and one for messages sent via SMTP. A Gmail SwitchParameter must be specified if a Gmail account is to be used. Just as the <a href="http://out-web.blogspot.com/2008/05/custom-cmdlets-part-two.html">Post-Flickr</a> authentication token can be stored in a variable in the user's profile, the Gmail username and password can also be stored in variables so they don't have to be typed in manually every time. The password must be stored in a SecureString. I wrote the following function to initialize these values:<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #C86400'>function</span> Init-Gmail<br />
{<br />
<span style='color: #404040'>[string]</span><span style='color: #000080'>$global</span><span style='color: #C86400'>:</span>GmailUsername <span style='color: #C86400'>=</span> <span style='color: #C86400'>Read-Host</span> <span style='color: #800000'>"Gmail username"</span><br />
[System<span style='color: #C86400'>.</span>Security<span style='color: #C86400'>.</span>SecureString]<span style='color: #000080'>$global</span><span style='color: #C86400'>:</span>GmailPassword <span style='color: #C86400'>=</span> <span style='color: #C86400'>Read-Host</span> -AsSecureString <span style='color: #800000'>"Gmail password"</span><br />
}
</div>
<br />
Because they are marked as mandatory, if the username and password are not specified, PowerShell will ask for them:<br /><br />
<div style="width: 100%; /*height: 100%;*/ overflow: auto; font-family: "Courier New", Courier, mono; font-size: 12px; background-color: #000000; color: #FFC400; padding: 2px 2px 2px 2px; white-space: nowrap">
<span style="font-weight: bold;">PSH$ Send-Email -Gmail -To some.address@host.com -Subject "Email with PowerShell" -Body @"</span><br />
<span style="font-weight: bold;">>> I like PowerShell.</span><br />
<span style="font-weight: bold;">>></span><br />
<span style="font-weight: bold;">>> Sincerely,</span><br />
<span style="font-weight: bold;">>> Jeff</span><br />
<span style="font-weight: bold;">>> "@</span><br />
<span style="font-weight: bold;">>></span><br />
<span style="font-weight: bold;"></span><br />
<span style="font-weight: bold; color:white;">cmdlet Send-Email at command pipeline position 1</span><br />
<span style="font-weight: bold;">Supply values for the following parameters:</span><br />
<span style="font-weight: bold;">GmailUsername: user.name</span><br />
<span style="font-weight: bold;">GmailPassword: *************</span><br />
<span style="font-weight: bold;">Your message has been sent.</span><br />
</div>
<br />
And there you have it. This ends (for now) my series on the Cmdlets I have written. I realize that there really isn't a huge need for these Cmdlets out there, but that isn't really the point, is it? I wrote these to make my life easier and to have a little fun in the process. To me, that is the point of PowerShell.<br /><br />
Here is the XML help for Send-Email:<br /><br />
<div face="Consolas" size="8pt" color="black" style=" background: #dddddd; width: 100%; height: 400px; overflow: auto;">
<!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Consolas;}}{\colortbl;??\red0\green0\blue128;\red221\green221\blue221;\red200\green100\blue0;\red128\green0\blue0;\red0\green0\blue0;}??\fs16 \cf1\cb2\highlight2 <?\cf3 xml\cf1 version=\cf4 "1.0"\cf1 encoding=\cf4 "utf-8"\cf1 ?>\par ??<\cf3 helpItems\cf1 xmlns=\cf4 "http://msh"\cf1 schema=\cf4 "maml"\cf1 >\par ?? <\cf3 command:command\cf1 xmlns:maml=\cf4 "http://schemas.microsoft.com/maml/2004/10"\cf1 xmlns:command=\cf4 "http://schemas.microsoft.com/maml/dev/command/2004/10"\cf1 xmlns:dev=\cf4 "http://schemas.microsoft.com/maml/dev/2004/10"\cf1 >\par ?? <\cf3 command:details\cf1 >\par ?? <\cf3 command:name\cf1 >\cf0 Send-Email\cf1 </\cf3 command:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The Send-Email Cmdlet uses the System.Net.Mail.MailMessage class or a Gmail account to send an email message.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:verb\cf1 >\cf0 Send\cf1 </\cf3 command:verb\cf1 >\par ?? <\cf3 command:noun\cf1 >\cf0 Email\cf1 </\cf3 command:noun\cf1 >\par ?? </\cf3 command:details\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\par ??\cf0 The Send-Email Cmdlet uses the System.Net.Mail.MailMessage class or a Gmail account to send an email message. Preferences for SMTP host name, port number, and from email address can be specified in your PowerShell profile by creating the following variables in the global scope:\par ??\par ?? $EmailSmtpHost = "smtphost"\par ?? $EmailSmtpPort = 527\par ?? $EmailFrom = "name@email.com"\par ??\par ?? When using the -Gmail switch parameter, it may be helpful to create these variables:\par ??\par ?? $GmailUsername = "username"\par ?? $Gmailpassword = \cf1 &lt;\cf0 SecureString password\cf1 &gt;\par ?? </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:syntax\cf1 >\par ?? <\cf3 command:syntaxItem\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Send-Email\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 gmail\cf1 </\cf3 maml:name\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 gmailUsername\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 gmailPassword\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 SecureString\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 smtpHost\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 portNumber\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 int\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 from\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 to\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 cc\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 bcc\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 subject\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 body\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 bodyIsHtml\cf1 </\cf3 maml:name\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 attachment\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 FileInfo []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 timeout\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 int\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? </\cf3 command:syntaxItem\cf1 >\par ?? </\cf3 command:syntax\cf1 >\par ?? <\cf3 command:parameters\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Gmail\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 Indicates whether a Gmail account will be used to send the email message.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 SwitchParameter\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 GmailUsername\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The Gmail username.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 GmailPassword\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The Gmail password.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 SecureString\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 SmtpHost\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The SMTP host to use to send the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 PortNumber\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The port to use on the SMTP host.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 int\cf1 </\cf3 command:parameterValue\cf1 >\par ?? <\cf3 dev:defaultValue\cf1 >\cf0 25\cf1 </\cf3 dev:defaultValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 From\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The sender of the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 To\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The recipient(s) of the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Cc\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The carbon copy recipient(s) of the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Bcc\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The blind carbon copy recipient(s) of the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Subject\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The subject of the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "true"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Body\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The body of the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 string\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 BodyIsHtml\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 Indicates if the body of the email is HTML.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 SwitchParameter\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "true"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Attachment\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The attachment(s) for the email.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 FileInfo []\cf1 </\cf3 command:parameterValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? <\cf3 command:parameter\cf1 required=\cf4 "false"\cf1 position=\cf4 "named"\cf1 globbing=\cf4 "false"\cf1 pipelineInput=\cf4 "false"\cf1 >\par ?? <\cf3 maml:name\cf1 >\cf0 Timeout\cf1 </\cf3 maml:name\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? <\cf3 maml:para\cf1 >\cf0 The timeout value for the SMTP server.\cf1 </\cf3 maml:para\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? <\cf3 command:parameterValue\cf1 required=\cf4 "true"\cf1 >\cf0 int\cf1 </\cf3 command:parameterValue\cf1 >\par ?? <\cf3 dev:defaultValue\cf1 >\cf0 60 seconds\cf1 </\cf3 dev:defaultValue\cf1 >\par ?? </\cf3 command:parameter\cf1 >\par ?? </\cf3 command:parameters\cf1 >\par ?? \tab <\cf3 command:inputTypes\cf1 >\par ?? \tab \tab <\cf3 command:inputType\cf1 >\par ?? \tab \tab \tab <\cf3 dev:type\cf1 >\par ?? \tab \tab \tab \tab <\cf3 maml:name\cf1 >\cf0 FileInfo []\cf1 </\cf3 maml:name\cf1 >\par ?? \tab \tab \tab \tab <\cf3 maml:uri\cf1 />\par ?? \tab \tab \tab \tab <\cf3 maml:description\cf1 >\par ?? \tab \tab \tab \tab \tab <\cf3 maml:para\cf1 >\par ??\cf0 \tab \tab \tab \tab \tab \tab Files to be added as attachments to the email.\par ??\cf1 \tab \tab \tab \tab \tab </\cf3 maml:para\cf1 >\par ?? \tab \tab \tab \tab </\cf3 maml:description\cf1 >\par ?? \tab \tab \tab </\cf3 dev:type\cf1 >\par ?? <\cf3 maml:description\cf1 >\par ?? </\cf3 maml:description\cf1 >\par ?? \tab \tab </\cf3 command:inputType\cf1 >\par ?? \tab </\cf3 command:inputTypes\cf1 >\par ?? </\cf3 command:command\cf1 >\par ??</\cf3 helpItems\cf1 >\par ??}
-->
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<p style="margin: 0px;"><span style="color: navy;"><?</span><span style="color: #c86400;">xml</span><span style="color: navy;"> version=</span><span style="color: maroon;">"1.0"</span><span style="color: navy;"> encoding=</span><span style="color: maroon;">"utf-8"</span><span style="color: navy;"> ?></span></p>
<p style="margin: 0px;"><span style="color: navy;"><</span><span style="color: #c86400;">helpItems</span><span style="color: navy;"> xmlns=</span><span style="color: maroon;">"http://msh"</span><span style="color: navy;"> schema=</span><span style="color: maroon;">"maml"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:command</span><span style="color: navy;"> xmlns:maml=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/2004/10"</span><span style="color: navy;"> xmlns:command=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/command/2004/10"</span><span style="color: navy;"> xmlns:dev=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/2004/10"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span>Send-Email<span style="color: navy;"></</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Send-Email Cmdlet uses the System.Net.Mail.MailMessage class or a Gmail account to send an email message.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span>Send<span style="color: navy;"></</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span>Email<span style="color: navy;"></</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"> The Send-Email Cmdlet uses the System.Net.Mail.MailMessage class or a Gmail account to send an email message. Preferences for SMTP host name, port number, and from email address can be specified in your PowerShell profile by creating the following variables in the global scope:</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> $EmailSmtpHost = "smtphost"</p>
<p style="margin: 0px;"> $EmailSmtpPort = 527</p>
<p style="margin: 0px;"> $EmailFrom = "name@email.com"</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> When using the -Gmail switch parameter, it may be helpful to create these variables:</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> $GmailUsername = "username"</p>
<p style="margin: 0px;"> $Gmailpassword = <span style="color: navy;">&lt;</span>SecureString password<span style="color: navy;">&gt;</span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Send-Email<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>gmail<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>gmailUsername<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>gmailPassword<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>SecureString<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>smtpHost<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>portNumber<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>int<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>from<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>to<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>cc<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>bcc<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>subject<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>body<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>bodyIsHtml<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>attachment<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>FileInfo []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>timeout<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>int<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Gmail<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Indicates whether a Gmail account will be used to send the email message.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>GmailUsername<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Gmail username.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>GmailPassword<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Gmail password.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>SecureString<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>SmtpHost<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The SMTP host to use to send the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>PortNumber<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The port to use on the SMTP host.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>int<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:defaultValue</span><span style="color: navy;">></span>25<span style="color: navy;"></</span><span style="color: #c86400;">dev:defaultValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>From<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The sender of the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>To<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The recipient(s) of the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Cc<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The carbon copy recipient(s) of the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Bcc<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The blind carbon copy recipient(s) of the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Subject<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The subject of the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Body<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The body of the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>BodyIsHtml<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Indicates if the body of the email is HTML.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Attachment<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The attachment(s) for the email.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>FileInfo []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Timeout<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The timeout value for the SMTP server.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>int<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:defaultValue</span><span style="color: navy;">></span>60 seconds<span style="color: navy;"></</span><span style="color: #c86400;">dev:defaultValue</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>FileInfo []<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;">/></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"> Files to be added as attachments to the email.</p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:command</span><span style="color: navy;">></span></p>
<p style="margin: 0px;"><span style="color: navy;"></</span><span style="color: #c86400;">helpItems</span><span style="color: navy;">></span></p>
</div>
</div>
<br />
If you end up building more than one of the Cmdlets I discussed in these posts, you will want to combine the help files into one.Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com0tag:blogger.com,1999:blog-4092806390106651827.post-11935324155555617542008-05-15T00:47:00.000-07:002008-05-15T03:05:38.863-07:00Custom Cmdlets - Part twoIn this second installment, I am going to introduce a couple of Cmdlets that I didn't write for myself. I have mentioned in the past that I am on a two-year assignment in Bangkok, Thailand. In order to keep our family and friends up to speed with our exciting lives on the other side of the world, I created a blog on Blogger that my wife posts to every week.<br /><br />
Like the typical family blog, the posts to <a href="http://thailand-hillmans.blogspot.com/">The Hillmans in Thailand</a> primarily consist of that week's photos along with a description of each one. One Sunday night, I walked into the office while my wife was painstakingly uploading each photo, one by one, using Blogger's "Add Image" dialog. I asked her if she would be interested in a better way. She was hesitant, but said yes.<br /><br />
I wanted to create one Cmdlet that would upload pictures to Blogger and create a draft of a post that could be edited later. I used the excellent <a href="http://code.google.com/apis/blogger/">Blogger Data API</a> to create a Blogger Cmdlet, but, unfortunately, this API doesn't have a method for uploading photos. I turned to Flickr and the <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=FlickrNet">FlickrNeT API</a> to fill that need. I ended up with two new Cmdlets, Upload-Flickr and Post-Blogger.<br /><br />
I'll start with Upload-Flickr:
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd; width: 100%; height: 400px; overflow: auto;">
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Collections.Generic;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Text;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.ComponentModel;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation.Runspaces;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.IO;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Net;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> FlickrNet;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Diagnostics;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;">namespace</span> CustomCmdlets</pre>
<pre style="margin: 0px;">{</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Cmdlet</span>( <span style="color: #a31515;">"Upload"</span>, <span style="color: #a31515;">"Flickr"</span>, SupportsShouldProcess = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">UploadFlickr</span> : <span style="color: navy;">PSCmdlet</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">List</span><<span style="color: navy;">FileInfo</span>> imageList;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #region</span> Parameters</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">FileInfo</span>[] images = <span style="color: #c86400;">new</span> <span style="color: navy;">FileInfo</span>[ 0 ];</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ValueFromPipeline = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">FileInfo</span>[] Images</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> images;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> images = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span>[] tags;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span>[] Tags</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> tags;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> tags = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> getToken;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> GetToken</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> getToken;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> getToken = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #endregion</span></pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> BeginProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> imageList = <span style="color: #c86400;">new</span> <span style="color: navy;">List</span><<span style="color: navy;">FileInfo</span>>();</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> ProcessRecord()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( images != <span style="color: #c86400;">null</span> )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: navy;">FileInfo</span> image <span style="color: #c86400;">in</span> images )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> imageList.Add( (<span style="color: navy;">FileInfo</span>)image );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> EndProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">try</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: green;">// obtain an API key and shared secret here:</span></pre>
<pre style="margin: 0px;"> <span style="color: green;">// http://www.flickr.com/services/api/misc.api_keys.html</span></pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> flickrApiKey = <span style="color: #a31515;">"<API key>"</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> flickrApiSharedSecret = <span style="color: #a31515;">"shared secret"</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> flickrAuthenticationToken = (<span style="color: #c86400;">string</span>)GetVariableValue( <span style="color: #a31515;">"FlickrToken"</span> );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: navy;">Flickr</span> flickr = <span style="color: #c86400;">new</span> <span style="color: navy;">Flickr</span>( flickrApiKey, flickrApiSharedSecret );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">string</span>.IsNullOrEmpty( flickrAuthenticationToken ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> frob = flickr.AuthGetFrob();</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> flickrUrl = flickr.AuthCalcUrl( frob, <span style="color: navy;">AuthLevel</span>.Write );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: navy;">Process</span> browserProcess = <span style="color: navy;">Process</span>.Start( <span style="color: #a31515;">"iexplore.exe"</span>, flickrUrl );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> browserProcess.WaitForExit();</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: navy;">Auth</span> authentication = flickr.AuthGetToken( frob );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> flickrAuthenticationToken = authentication.Token;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( getToken )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> WriteObject( flickrAuthenticationToken );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> flickr.AuthToken = flickrAuthenticationToken;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> tagString = <span style="color: #a31515;">""</span>;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( tags != <span style="color: #c86400;">null</span> )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> tagString = <span style="color: #c86400;">string</span>.Join( <span style="color: #a31515;">", "</span>, tags );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">foreach</span> ( <span style="color: navy;">FileInfo</span> image <span style="color: #c86400;">in</span> imageList )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( image.Name ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> photoId = flickr.UploadPicture(</pre>
<pre style="margin: 0px;"> image.FullName, image.Name, image.Name, tagString );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> WriteObject( flickr.PhotosGetInfo( photoId ) );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">finally</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> images = <span style="color: #c86400;">null</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;">}</pre>
</div><br /><br />
This Cmdlet obviously requires an account with Flickr, as well as an API Key and Shared Secret that can be obtained <a href="http://www.flickr.com/services/api/misc.api_keys.htm">here</a>. Using these two strings, a FlickrNet.Flickr object is created, which can then be used to upload photos. An authentication token is also necessary, and Upload-Flickr requires that this token is in a global PowerShell variable called "$FlickrToken". I did this so the token could be stored in that variable in a profile or other dot-sourced script. The Upload-Flickr Cmdlet can also be used to obtain the token, with the GetToken parameter:<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: "Courier New", Courier, mono; font-size: 12px; background-color: #000000; color: #FFC400; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='font-weight: bold;'>PSH$ $FlickrToken = Upload-Flickr -GetToken
</div><br />
When the GetToken parameter is specified, the user is directed to a Flickr website where they must log in. The token is returned after a successful login. No images are processed when this parameter is used. Upload-Flickr takes FileInfo objects as input, as well as an optional array of tags to associate with each image:<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: "Courier New", Courier, mono; font-size: 12px; background-color: #000000; color: #FFC400; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='font-weight: bold;'>PSH$ Get-ChildItem *.png | Upload-Flickr -Tags "vacation", "moon"
</div><br />
For each image that is processed by Upload-Flickr, a FlickrNet.PhotoInfo object is written to the pipeline. The FlickrNet.PhotoInfo object has all kinds of useful information associated with it, including URLs to small, medium, and large versions of the photo.<br /><br />
The next weapon I created for my wife's post-creating arsenal is Post-Blogger:<br /><br />
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd; width: 100%; height: 400px; overflow: auto;">
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Collections.Generic;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Text;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.ComponentModel;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation.Runspaces;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.IO;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Net;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Security;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> Google.GData.Client;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;">namespace</span> CustomCmdlets</pre>
<pre style="margin: 0px;">{</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Cmdlet</span>( <span style="color: #a31515;">"Post"</span>, <span style="color: #a31515;">"Blogger"</span>, SupportsShouldProcess = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">PostBlogger</span> : <span style="color: navy;">PSCmdlet</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">StringBuilder</span> contentStringBuilder;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #region</span> Parameters</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> input;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( ValueFromPipeline = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">AllowNull</span>]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">AllowEmptyString</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Input</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> input;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> input = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> username;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Username</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> username;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> username = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> password;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Password</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> password;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> password = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> blogName;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> BlogName</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> blogName;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> blogName = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> title;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Title</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> title;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> title = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> content;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">ValidateNotNullOrEmpty</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Content</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> content;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> content = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> draft = <span style="color: #c86400;">false</span>;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> Draft</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> draft;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> draft = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #endregion</span></pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> BeginProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> contentStringBuilder = <span style="color: #c86400;">new</span> <span style="color: navy;">StringBuilder</span>( content );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( contentStringBuilder.Length > 0 )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> contentStringBuilder.Append( <span style="color: navy;">Environment</span>.NewLine );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> ProcessRecord()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !<span style="color: #c86400;">string</span>.IsNullOrEmpty( input ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> line = ( input ).TrimEnd( <span style="color: #c86400;">null</span> );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( line ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> contentStringBuilder.AppendLine( line );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> EndProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">try</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">Service</span> service = <span style="color: #c86400;">new</span> <span style="color: navy;">Service</span>( <span style="color: #a31515;">"blogger"</span>, <span style="color: #a31515;">"BloggerCmdlet"</span> );</pre>
<pre style="margin: 0px;"> <span style="color: navy;">NetworkCredential</span> credentials = <span style="color: #c86400;">new</span> <span style="color: navy;">NetworkCredential</span>( username, password );</pre>
<pre style="margin: 0px;"> service.Credentials = <span style="color: #c86400;">new</span> <span style="color: navy;">GDataCredentials</span>( username, password );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: navy;">FeedQuery</span> query = <span style="color: #c86400;">new</span> <span style="color: navy;">FeedQuery</span>();</pre>
<pre style="margin: 0px;"> query.Uri = <span style="color: #c86400;">new</span> <span style="color: navy;">Uri</span>( <span style="color: #a31515;">"http://www.blogger.com/feeds/default/blogs"</span> );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: navy;">AtomFeed</span> bloggerFeed = service.Query( query );</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> feedUri = <span style="color: #c86400;">null</span>;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: green;">// if a blog name is provided, find the appropriate feed</span></pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( bloggerFeed != <span style="color: #c86400;">null</span> && <span style="color: #c86400;">this</span>.BlogName != <span style="color: #c86400;">null</span> && bloggerFeed.Entries.Count > 0 )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">for</span> ( <span style="color: #c86400;">int</span> i = 0; feedUri == <span style="color: #c86400;">null</span> && i < bloggerFeed.Entries.Count; i++ )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( bloggerFeed.Entries[ i ].Title.Text == <span style="color: #c86400;">this</span>.BlogName )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> feedUri = bloggerFeed.Entries[ i ].FeedUri;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( feedUri == <span style="color: #c86400;">null</span> )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> WriteError( </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">new</span> <span style="color: navy;">ErrorRecord</span>( <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( <span style="color: #c86400;">string</span>.Format( <span style="color: #a31515;">"No blog found named \"{0}\"."</span>, <span style="color: #c86400;">this</span>.BlogName ) ), </pre>
<pre style="margin: 0px;"> <span style="color: #a31515;">"Post-Blogger"</span>, <span style="color: navy;">ErrorCategory</span>.InvalidArgument, bloggerFeed ) );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> feedUri = bloggerFeed.Entries[ 0 ].FeedUri;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( feedUri != <span style="color: #c86400;">null</span> )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">AtomEntry</span> post = <span style="color: #c86400;">new</span> <span style="color: navy;">AtomEntry</span>();</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> post.Title = <span style="color: #c86400;">new</span> <span style="color: navy;">AtomTextConstruct</span>( <span style="color: navy;">AtomTextConstructElementType</span>.Title, title );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> post.Content = <span style="color: #c86400;">new</span> <span style="color: navy;">AtomContent</span>();</pre>
<pre style="margin: 0px;"> post.Content.Type = <span style="color: #a31515;">"html"</span>;</pre>
<pre style="margin: 0px;"> post.Content.Content = contentStringBuilder.ToString();</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> post.IsDraft = draft;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: navy;">AtomEntry</span> createdPost = service.Insert( <span style="color: #c86400;">new</span> <span style="color: navy;">Uri</span>( feedUri ), post );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">finally</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> contentStringBuilder = <span style="color: #c86400;">null</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;">}</pre>
</div><br /><br />
Post-Blogger is also quite simple. It obviously requires an account with Blogger as well as at least one blog. If you have more than one blog, the BlogName parameter can be used to specify which blog to use; the first blog is used if no name is specified, or if there is only one blog. Nothing too exciting here.<br /><br />
At this point in the project, these Cmdlets worked well, but if I expected my wife to take advantage of them, I needed to make them easy (read: no command line) to use. I put together a PowerShell script that displays a Windows Forms dialog with fields for everything needed to create a Blogger post as well as a path to an image directory. I created a shortcut in the Quick Launch bar that starts the script, and the rest is history. My wife now uses the script and these Cmdlets every Sunday night, and she loves every minute of it. Here is the script:<br /><br />
<div style='width: 100%; height: 400px; overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
[System<span style='color: #C86400'>.</span>Reflection<span style='color: #C86400'>.</span>Assembly]<span style='color: #C86400'>::</span>LoadWithPartialName( <span style='color: #800000'>"System.Windows.Forms"</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-Null</span><br />
[System<span style='color: #C86400'>.</span>Reflection<span style='color: #C86400'>.</span>Assembly]<span style='color: #C86400'>::</span>LoadWithPartialName( <span style='color: #800000'>"System.Drawing"</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-Null</span><br />
<br />
[System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Application]<span style='color: #C86400'>::</span>EnableVisualStyles()<br />
<br />
<span style='color: #000080'>$username</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$password</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$title</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$content</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$draft</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$imageDirectory</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #000080'>$postForm</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Form<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"New Blogger Post"</span><br />
<br />
<span style='color: #000080'>$usernameLabel</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Label<br />
<span style='color: #000080'>$usernameLabel</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"Blogger &Username:"</span><br />
<span style='color: #000080'>$usernameLabel</span><span style='color: #C86400'>.</span>AutoSize <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$usernameLabel</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>4</span><span style='color: #C86400'>,</span> <span style='color: #800000'>8</span> )<br />
<span style='color: #000080'>$usernameLabel</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>97</span><span style='color: #C86400'>,</span> <span style='color: #800000'>13</span> )<br />
<span style='color: #000080'>$usernameLabel</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<br />
<span style='color: #000080'>$usernameTextBox</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>TextBox<br />
<span style='color: #000080'>$usernameTextBox</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>104</span><span style='color: #C86400'>,</span> <span style='color: #800000'>4</span> )<br />
<span style='color: #000080'>$usernameTextBox</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>184</span><span style='color: #C86400'>,</span> <span style='color: #800000'>20</span> )<br />
<span style='color: #000080'>$usernameTextBox</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>1</span><br />
<br />
<span style='color: #000080'>$passwordLabel</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Label<br />
<span style='color: #000080'>$passwordLabel</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"Blogger &Password:"</span><br />
<span style='color: #000080'>$passwordLabel</span><span style='color: #C86400'>.</span>AutoSize <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$passwordLabel</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>4</span><span style='color: #C86400'>,</span> <span style='color: #800000'>32</span> )<br />
<span style='color: #000080'>$passwordLabel</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>95</span><span style='color: #C86400'>,</span> <span style='color: #800000'>13</span> )<br />
<span style='color: #000080'>$passwordLabel</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>2</span><br />
<br />
<span style='color: #000080'>$passwordTextBox</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>TextBox<br />
<span style='color: #000080'>$passwordTextBox</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>104</span><span style='color: #C86400'>,</span> <span style='color: #800000'>28</span> )<br />
<span style='color: #000080'>$passwordTextBox</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>184</span><span style='color: #C86400'>,</span> <span style='color: #800000'>20</span> )<br />
<span style='color: #000080'>$passwordTextBox</span><span style='color: #C86400'>.</span>UseSystemPasswordChar <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$passwordTextBox</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>3</span><br />
<br />
<span style='color: #000080'>$titleLabel</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Label<br />
<span style='color: #000080'>$titleLabel</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"Post &Title:"</span><br />
<span style='color: #000080'>$titleLabel</span><span style='color: #C86400'>.</span>AutoSize <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$titleLabel</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>4</span><span style='color: #C86400'>,</span> <span style='color: #800000'>56</span> )<br />
<span style='color: #000080'>$titleLabel</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>54</span><span style='color: #C86400'>,</span> <span style='color: #800000'>13</span> )<br />
<span style='color: #000080'>$titleLabel</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>4</span><br />
<br />
<span style='color: #000080'>$titleTextBox</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>TextBox<br />
<span style='color: #000080'>$titleTextBox</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>104</span><span style='color: #C86400'>,</span> <span style='color: #800000'>52</span> )<br />
<span style='color: #000080'>$titleTextBox</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>184</span><span style='color: #C86400'>,</span> <span style='color: #800000'>20</span> )<br />
<span style='color: #000080'>$titleTextBox</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>5</span><br />
<br />
<span style='color: #000080'>$draftCheckBox</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>CheckBox<br />
<span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"&Draft"</span><br />
<span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>Checked <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>UseVisualStyleBackColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>AutoSize <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>240</span><span style='color: #C86400'>,</span> <span style='color: #800000'>80</span> )<br />
<span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>49</span><span style='color: #C86400'>,</span> <span style='color: #800000'>15</span> )<br />
<span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>6</span><br />
<br />
<span style='color: #000080'>$contentLabel</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Label<br />
<span style='color: #000080'>$contentLabel</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"Post &Content:"</span><br />
<span style='color: #000080'>$contentLabel</span><span style='color: #C86400'>.</span>AutoSize <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$contentLabel</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>4</span><span style='color: #C86400'>,</span> <span style='color: #800000'>80</span> )<br />
<span style='color: #000080'>$contentLabel</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>71</span><span style='color: #C86400'>,</span> <span style='color: #800000'>13</span> )<br />
<span style='color: #000080'>$contentLabel</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>7</span><br />
<br />
<span style='color: #000080'>$contentTextBox</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>TextBox<br />
<span style='color: #000080'>$contentTextBox</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"Pictures..."</span><br />
<span style='color: #000080'>$contentTextBox</span><span style='color: #C86400'>.</span>Multiline <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$contentTextBox</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>4</span><span style='color: #C86400'>,</span> <span style='color: #800000'>96</span> )<br />
<span style='color: #000080'>$contentTextBox</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>284</span><span style='color: #C86400'>,</span> <span style='color: #800000'>76</span> )<br />
<span style='color: #000080'>$contentTextBox</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>8</span><br />
<br />
<span style='color: #000080'>$imagesLabel</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Label<br />
<span style='color: #000080'>$imagesLabel</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"&Image Directory:"</span><br />
<span style='color: #000080'>$imagesLabel</span><span style='color: #C86400'>.</span>AutoSize <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$imagesLabel</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>4</span><span style='color: #C86400'>,</span> <span style='color: #800000'>180</span> )<br />
<span style='color: #000080'>$imagesLabel</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>84</span><span style='color: #C86400'>,</span> <span style='color: #800000'>13</span> )<br />
<span style='color: #000080'>$imagesLabel</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>9</span><br />
<br />
<span style='color: #000080'>$imagesTextBox</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>TextBox<br />
<span style='color: #000080'>$imagesTextBox</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>104</span><span style='color: #C86400'>,</span> <span style='color: #800000'>176</span> )<br />
<span style='color: #000080'>$imagesTextBox</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>120</span><span style='color: #C86400'>,</span> <span style='color: #800000'>20</span> )<br />
<span style='color: #000080'>$imagesTextBox</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>10</span><br />
<br />
<span style='color: #000080'>$browseButton</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Button<br />
<span style='color: #000080'>$browseButton</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"&Browse..."</span><br />
<span style='color: #000080'>$browseButton</span><span style='color: #C86400'>.</span>UseVisualStyleBackColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$browseButton</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>228</span><span style='color: #C86400'>,</span> <span style='color: #800000'>176</span> )<br />
<span style='color: #000080'>$browseButton</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>60</span><span style='color: #C86400'>,</span> <span style='color: #800000'>20</span> )<br />
<span style='color: #000080'>$browseButton</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>11</span><br />
<span style='color: #000080'>$browseButton</span><span style='color: #C86400'>.</span>add_Click( [System<span style='color: #C86400'>.</span>EventHandler]{<br />
<span style='color: #000080'>$shell</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> -Com Shell<span style='color: #C86400'>.</span>Application<br />
<br />
<span style='color: #000080'>$desktop</span> <span style='color: #C86400'>=</span> [Environment]<span style='color: #C86400'>::</span>GetFolderPath( [System<span style='color: #C86400'>.</span>Environment+SpecialFolder]<span style='color: #C86400'>::</span>Desktop )<br />
<br />
<span style='color: #000080'>$imageFolder</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$shell</span><span style='color: #C86400'>.</span>BrowseForFolder( <span style='color: #800000'>0</span><span style='color: #C86400'>,</span> <br />
<span style='color: #800000'>"Browse to the location of the images you want in this post."</span><span style='color: #C86400'>,</span> <span style='color: #800000'>0</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$desktop</span> )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$imageFolder</span> <span style='color: #C86400'>-ne</span> <span style='color: #000080'>$null</span> )<br />
{<br />
<span style='color: #000080'>$imagesTextBox</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #000080'>$imageFolder</span><span style='color: #C86400'>.</span>Self<span style='color: #C86400'>.</span>Path<br />
}<br />
} )<br />
<br />
<span style='color: #000080'>$postButton</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Button<br />
<span style='color: #000080'>$postButton</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"P&ost!"</span><br />
<span style='color: #000080'>$postButton</span><span style='color: #C86400'>.</span>UseVisualStyleBackColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$postButton</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>164</span><span style='color: #C86400'>,</span> <span style='color: #800000'>204</span> )<br />
<span style='color: #000080'>$postButton</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>60</span><span style='color: #C86400'>,</span> <span style='color: #800000'>20</span> )<br />
<span style='color: #000080'>$postButton</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>12</span><br />
<span style='color: #000080'>$postButton</span><span style='color: #C86400'>.</span>add_Click( [System<span style='color: #C86400'>.</span>EventHandler]{<br />
<span style='color: #000080'>$username</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$usernameTextBox</span><span style='color: #C86400'>.</span>Text<br />
<span style='color: #000080'>$password</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$passwordTextBox</span><span style='color: #C86400'>.</span>Text<br />
<span style='color: #000080'>$title</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$titleTextBox</span><span style='color: #C86400'>.</span>Text<br />
<span style='color: #000080'>$content</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$contentTextBox</span><span style='color: #C86400'>.</span>Text<br />
<span style='color: #000080'>$draft</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$draftCheckBox</span><span style='color: #C86400'>.</span>Checked<br />
<span style='color: #000080'>$imageDirectory</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$imagesTextBox</span><span style='color: #C86400'>.</span>Text<br />
<br />
<span style='color: #000080'>$message</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$username</span> <span style='color: #C86400'>-eq</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$message</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"You must supply a Blogger username.`n"</span><br />
}<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$password</span> <span style='color: #C86400'>-eq</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$message</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"You must supply a Blogger password.`n"</span><br />
}<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$title</span> <span style='color: #C86400'>-eq</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$message</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"You must supply a post title.`n"</span><br />
}<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$content</span> <span style='color: #C86400'>-eq</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$message</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"You must supply some post content."</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$message</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
[System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>MessageBox]<span style='color: #C86400'>::</span>Show( <span style='color: #000080'>$message</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"Error!"</span> )<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>DialogResult <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>DialogResult]<span style='color: #C86400'>::</span>OK<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Close()<br />
}<br />
} )<br />
<br />
<span style='color: #000080'>$closeButton</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>Button<br />
<span style='color: #000080'>$closeButton</span><span style='color: #C86400'>.</span>Text <span style='color: #C86400'>=</span> <span style='color: #800000'>"C&lose"</span><br />
<span style='color: #000080'>$closeButton</span><span style='color: #C86400'>.</span>UseVisualStyleBackColor <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
<span style='color: #000080'>$closeButton</span><span style='color: #C86400'>.</span>Location <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Point( <span style='color: #800000'>228</span><span style='color: #C86400'>,</span> <span style='color: #800000'>204</span> )<br />
<span style='color: #000080'>$closeButton</span><span style='color: #C86400'>.</span>Size <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>60</span><span style='color: #C86400'>,</span> <span style='color: #800000'>20</span> )<br />
<span style='color: #000080'>$closeButton</span><span style='color: #C86400'>.</span>TabIndex <span style='color: #C86400'>=</span> <span style='color: #800000'>13</span><br />
<span style='color: #000080'>$closeButton</span><span style='color: #C86400'>.</span>add_Click( [System<span style='color: #C86400'>.</span>EventHandler]{<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>DialogResult <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>DialogResult]<span style='color: #C86400'>::</span>Cancel<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Close()<br />
} )<br />
<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>AutoScaleDimensions <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>SizeF( <span style='color: #800000'>6</span><span style='color: #C86400'>,</span> <span style='color: #800000'>13</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>AutoScaleMode <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>AutoScaleMode]<span style='color: #C86400'>::</span>Font<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>ClientSize <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>300</span><span style='color: #C86400'>,</span> <span style='color: #800000'>236</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>MinimumSize <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>308</span><span style='color: #C86400'>,</span> <span style='color: #800000'>263</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>MaximumSize <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>Drawing<span style='color: #C86400'>.</span>Size( <span style='color: #800000'>308</span><span style='color: #C86400'>,</span> <span style='color: #800000'>263</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>SizeGripStyle <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>SizeGripStyle]<span style='color: #C86400'>::</span>Hide<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>StartPosition <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>FormStartPosition]<span style='color: #C86400'>::</span>CenterScreen<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$closeButton</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$postButton</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$browseButton</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$imagesTextBox</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$imagesLabel</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$contentTextBox</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$contentLabel</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$draftCheckBox</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$titleTextBox</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$titleLabel</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$passwordTextBox</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$passwordLabel</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$usernameTextBox</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>Controls<span style='color: #C86400'>.</span>Add( <span style='color: #000080'>$usernameLabel</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>MaximizeBox <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>MinimizeBox <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>ResumeLayout( <span style='color: #000080'>$false</span> )<br />
<span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>PerformLayout()<br />
<br />
<span style='color: #000080'>$imageHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$blogName</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"<blog name>"</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$postForm</span><span style='color: #C86400'>.</span>ShowDialog() <span style='color: #C86400'>-eq</span> [System<span style='color: #C86400'>.</span>Windows<span style='color: #C86400'>.</span>Forms<span style='color: #C86400'>.</span>DialogResult]<span style='color: #C86400'>::</span>OK )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$imageDirectory</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$imageHTML</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-ChildItem</span> <span style='color: #000080'>$imageDirectory</span> <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Where-Object</span> { <span style='color: #C86400'>!</span><span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>PSIsContainer } <span style='color: #C86400'>|</span><br />
<span style='color: #C86400'>Upload-Flickr</span> -Tags ( [datetime]<span style='color: #C86400'>::</span>Now<span style='color: #C86400'>.</span>ToString( <span style='color: #800000'>"dd-MM-yyyy"</span> ) ) -Verbose <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #800000'>"<div style=`"text-align: center;`"><a href=`"{0}`"><img src=`"{1}`" /></a></div><br><br>"</span> <span style='color: #C86400'>`</span><br />
<span style='color: #C86400'>-f</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>LargeUrl<span style='color: #C86400'>,</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>MediumUrl<br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$draft</span> )<br />
{<br />
<span style='color: #000080'>$imageHTML</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Post-Blogger</span> -Username <span style='color: #000080'>$username</span> -Password <span style='color: #000080'>$password</span> <span style='color: #C86400'>`</span><br />
-BlogName <span style='color: #000080'>$blogName</span> -Title <span style='color: #000080'>$title</span> -Content <span style='color: #000080'>$content</span> -Draft<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$imageHTML</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Post-Blogger</span> -Username <span style='color: #000080'>$username</span> -Password <span style='color: #000080'>$password</span> <span style='color: #C86400'>`</span><br />
-BlogName <span style='color: #000080'>$blogName</span> -Title <span style='color: #000080'>$title</span> -Content <span style='color: #000080'>$content</span><br />
}<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$draft</span> )<br />
{<br />
<span style='color: #C86400'>Post-Blogger</span> -Username <span style='color: #000080'>$username</span> -Password <span style='color: #000080'>$password</span> <span style='color: #C86400'>`</span><br />
-BlogName <span style='color: #000080'>$blogName</span> -Title <span style='color: #000080'>$title</span> -Content <span style='color: #000080'>$content</span> -Draft<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #C86400'>Post-Blogger</span> -Username <span style='color: #000080'>$username</span> -Password <span style='color: #000080'>$password</span> <span style='color: #C86400'>`</span><br />
-BlogName <span style='color: #000080'>$blogName</span> -Title <span style='color: #000080'>$title</span> -Content <span style='color: #000080'>$content</span><br />
}<br />
}<br />
}<br />
</div><br /><br />
Now, this script and these Cmdlets are probably the most likely to not be used by anyone else, but I think I am the most pleased with them, since they made my wife's life so much easier. I benefit from PowerShell every day, so it was fun to see my non-technical wife gain a little respect for the lowly command line. I'll finish this post as I did the last one: with the XML help for these two Cmdlets:<br /><br />
<div style="font-family: Consolas; font-size: 8pt; color: black; background: #dddddd; width: 100%; height: 400px; overflow: auto;">
<pre style="margin: 0px;"><span style="color: navy;"><?</span><span style="color: #c86400;">xml</span><span style="color: navy;"> version=</span><span style="color: maroon;">"1.0"</span><span style="color: navy;"> encoding=</span><span style="color: maroon;">"utf-8"</span><span style="color: navy;"> ?></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"><</span><span style="color: #c86400;">helpItems</span><span style="color: navy;"> xmlns=</span><span style="color: maroon;">"http://msh"</span><span style="color: navy;"> schema=</span><span style="color: maroon;">"maml"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:command</span><span style="color: navy;"> xmlns:maml=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/2004/10"</span><span style="color: navy;"> xmlns:command=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/command/2004/10"</span><span style="color: navy;"> xmlns:dev=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/2004/10"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span>Upload-Flickr<span style="color: navy;"></</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Upload-Flickr Cmdlet uses the FlickrNet library to upload images to a Flickr account.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span>Upload<span style="color: navy;"></</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span>Flickr<span style="color: navy;"></</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"> The Upload-Flickr Cmdlet uses the FlickrNet library to upload images to a Flickr account. Flickr authentication will be performed each time the Cmdlet is run. To avoid manual authentication, the Flickr token can be specified in your PowerShell profile by creating the following variable in the global scope:</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> $FlickrToken = "Flickr token"</pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Upload-Flickr<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>images<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>FileInfo []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>tags<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>getToken<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Images<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The image(s) to upload to Flickr.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>FileInfo []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Tags<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The tag(s) to associate with the images.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>string []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>GetToken<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Retrieves an authentication token. No images will be processed if this option is specified.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>FileInfo []<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;">/></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"> The image(s) to upload to Flickr.</pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:returnValues</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:returnValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>FlickrNet.PhotoInfo []<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;"> /></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"> Each PhotoInfo object contains information about an uploaded image.</pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">> </span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">> </span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:returnValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:returnValues</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:command</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:command</span><span style="color: navy;"> xmlns:maml=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/2004/10"</span><span style="color: navy;"> xmlns:command=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/command/2004/10"</span><span style="color: navy;"> xmlns:dev=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/2004/10"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span>Post-Blogger<span style="color: navy;"></</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Post-Bloger Cmdlet uses the Google.GData.Client library to post to Blogger.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span>Post<span style="color: navy;"></</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span>Blogger<span style="color: navy;"></</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Post-Blogger Cmdlet uses the Google.GData.Client library to post to Blogger.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Post-Blogger<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>username<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>password<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>blogName<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>title<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>content<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>input<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>draft<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Username<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Blogger account username.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Password<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Blogger account password.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>BlogName<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The name of the blog. This parameter is only necessary if the Blogger account being used has more than one blog.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Title<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The title of the post.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Content<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The content of the post.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Input<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Pipeline input that will be added to the content of the post.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineInput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Draft<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>If specified, the post will be marked as a draft.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>String []<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;">/></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"> Text to be added to the content of the post.</pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:command</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"></</span><span style="color: #c86400;">helpItems</span><span style="color: navy;">></span></pre>
</div><br /><br />
Enjoy.Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com0tag:blogger.com,1999:blog-4092806390106651827.post-14413522413273776212008-05-13T22:07:00.000-07:002008-05-14T01:13:14.152-07:00Custom Cmdlets - Part oneAs I have mentioned in the past, I use PowerShell every day, but not for system administration tasks, as most of the PowerShell community does. I am a software engineer, so I use PowerShell to automate tasks I personally deal with on a daily basis. Much of what I do at the command line has to do with Subversion commands, which I have simplified by writing a library of <a href="http://out-web.blogspot.com/2007/11/powershell-and-subversion.html">Subversion-themed PowerShell functions</a>.<br /><br />
The purpose of this post, and the next few posts, is to introduce some Cmdlets I have written. I won't spend time on how to write a Cmdlet, as this topic has already been covered by other authors. A couple of the Cmdlets I have written have equivalents in <a href="http://www.codeplex.com/PowerShellCX"><span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel">PowerShell Community Extensions</span></a>, so users of that snap-in probably won't find them useful, but I am going to talk about them anyway.<br /><br />
I'll start with the first Cmdlets I wrote, which are also the simplest: Get-Clipboard and Set-Clipboard:<br /><br />
<div style="padding: 2px; overflow: auto; width: 100%; height: 400px; font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Text;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Threading;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Windows.Forms;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Collections.Specialized;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.IO;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;">namespace</span> CustomCmdlets</pre>
<pre style="margin: 0px;">{</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">ClipboardCmdlet</span> : <span style="color: navy;">Cmdlet</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: navy;">StringBuilder</span> clipboardStringBuilder = <span style="color: #c86400;">new</span> <span style="color: navy;">StringBuilder</span>();</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: navy;">StringCollection</span> clipboardFileList = <span style="color: #c86400;">new</span> <span style="color: navy;">StringCollection</span>();</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #region</span> Parameters</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">bool</span> files;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> Files</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> files;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> files = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #endregion</span></pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">internal</span> <span style="color: #c86400;">void</span> GetClipboard()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">Thread</span> thread = <span style="color: #c86400;">new</span> <span style="color: navy;">Thread</span>( <span style="color: #c86400;">new</span> <span style="color: navy;">ThreadStart</span>( <span style="color: #c86400;">delegate</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !<span style="color: #c86400;">this</span>.files && <span style="color: navy;">Clipboard</span>.ContainsText() )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> clipboardStringBuilder = <span style="color: #c86400;">new</span> <span style="color: navy;">StringBuilder</span>( <span style="color: navy;">Clipboard</span>.GetText() );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span> <span style="color: #c86400;">if</span> ( <span style="color: navy;">Clipboard</span>.ContainsFileDropList() )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> clipboardFileList = <span style="color: navy;">Clipboard</span>.GetFileDropList();</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> } ) );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> thread.SetApartmentState( <span style="color: navy;">ApartmentState</span>.STA );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> thread.Start();</pre>
<pre style="margin: 0px;"> thread.Join();</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">internal</span> <span style="color: #c86400;">void</span> SetClipboard()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">Thread</span> thread = <span style="color: #c86400;">new</span> <span style="color: navy;">Thread</span>( <span style="color: #c86400;">new</span> <span style="color: navy;">ThreadStart</span>( <span style="color: #c86400;">delegate</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.files )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.clipboardFileList.Count > 0 )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">Clipboard</span>.SetFileDropList( clipboardFileList );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !<span style="color: #c86400;">string</span>.IsNullOrEmpty( clipboardStringBuilder.ToString() ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">Clipboard</span>.SetText( clipboardStringBuilder.ToString() );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> } ) );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> thread.SetApartmentState( <span style="color: navy;">ApartmentState</span>.STA );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> thread.Start();</pre>
<pre style="margin: 0px;"> thread.Join();</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Cmdlet</span>( <span style="color: navy;">VerbsCommon</span>.Get, <span style="color: #a31515;">"Clipboard"</span> )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">GetClipboard</span> : <span style="color: navy;">ClipboardCmdlet</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> BeginProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> GetClipboard();</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.files )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">for</span> ( <span style="color: #c86400;">int</span> i = 0; i < <span style="color: #c86400;">this</span>.clipboardFileList.Count; i++ )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> WriteVerbose( <span style="color: #c86400;">this</span>.clipboardFileList[ i ] );</pre>
<pre style="margin: 0px;"> WriteObject( <span style="color: #c86400;">new</span> <span style="color: navy;">FileInfo</span>( <span style="color: #c86400;">this</span>.clipboardFileList[ i ] ) );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> WriteVerbose( <span style="color: #c86400;">this</span>.clipboardStringBuilder.ToString() );</pre>
<pre style="margin: 0px;"> WriteObject( <span style="color: #c86400;">this</span>.clipboardStringBuilder.ToString() );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Cmdlet</span>( <span style="color: navy;">VerbsCommon</span>.Set, <span style="color: #a31515;">"Clipboard"</span>, SupportsShouldProcess = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">SetClipboard</span> : <span style="color: navy;">ClipboardCmdlet</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #region</span> Parameters</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">object</span>[] dataArray;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Mandatory = <span style="color: #c86400;">true</span>, Position = 0, ValueFromPipeline = <span style="color: #c86400;">true</span>, ValueFromPipelineByPropertyName = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">object</span>[] Data</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> dataArray;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> dataArray = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> append;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> Append</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> append;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> append = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> trimWhiteSpace;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> TrimWhiteSpace</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> trimWhiteSpace;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> trimWhiteSpace = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> passThru;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> PassThru</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> passThru;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> passThru = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #endregion</span></pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> BeginProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( append )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> GetClipboard();</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> ProcessRecord()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( dataArray != <span style="color: #c86400;">null</span> )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">for</span> ( <span style="color: #c86400;">int</span> i = 0; i < dataArray.Length; i++ )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.Files )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( ( (<span style="color: navy;">FileInfo</span>)dataArray[ i ] ).FullName ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.passThru )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> WriteObject( ( (<span style="color: navy;">FileInfo</span>)dataArray[ i ] ).FullName );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> clipboardFileList.Add( ( (<span style="color: navy;">FileInfo</span>)dataArray[ i ] ).FullName );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( ShouldProcess( dataArray[ i ].ToString() ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.passThru )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> WriteObject( dataArray[ i ].ToString() );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> clipboardStringBuilder.AppendLine( dataArray[ i ].ToString() );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> EndProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( trimWhiteSpace )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> clipboardStringBuilder = <span style="color: #c86400;">new</span> <span style="color: navy;">StringBuilder</span>( clipboardStringBuilder.ToString().Trim() );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> SetClipboard();</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;">}</pre>
</div><br /><br />
I think the source is pretty straightforward, so I won't bore you by talking about it. Get-Clipboard really doesn't do anything special; it just dumps the contents of the clipboard into the pipeline. If the Files SwitchParameter is set, and the file drop list isn't empty, each path is converted to a FileInfo object before it is written to the pipeline.<br /><br />
The Set-Clipboard Cmdlet is slightly more interesting. It has SwitchParameters that let you specify if you want to append to the current contents of the clipboard, and if you want to trim whitespace from the text that is being added to the clipboard. A PassThru parameter is also provided if the objects should be written to the pipeline as well as to the clipboard.<br /><br />
Thats about it for the Clipboard Cmdlets. Not too exciting, but I do tend to use them often. I have created the aliases "gcb" and "scb" in my profile, to allow for terseness at the command line.<br /><br />
The next Cmdlet is a little more original, but I haven't found it as useful. It is the Get-ScreenShot Cmdlet:<br /><br />
<div style="padding: 2px; overflow: auto; width: 100%; height: 400px; font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Windows.Forms;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Drawing;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Drawing.Imaging;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.IO;</pre>
<pre style="margin: 0px;"><span style="color: #c86400;">using</span> System.Management.Automation; </pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;">namespace</span> CustomCmdlets</pre>
<pre style="margin: 0px;">{</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">enum</span> <span style="color: navy;">ImageFormat</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> Bmp,</pre>
<pre style="margin: 0px;"> Emf,</pre>
<pre style="margin: 0px;"> Gif,</pre>
<pre style="margin: 0px;"> Jpg,</pre>
<pre style="margin: 0px;"> Png,</pre>
<pre style="margin: 0px;"> Tif,</pre>
<pre style="margin: 0px;"> Wmf</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Cmdlet</span>( <span style="color: navy;">VerbsCommon</span>.Get, <span style="color: #a31515;">"ScreenShot"</span> )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">class</span> <span style="color: navy;">GetScreenShot</span> : <span style="color: navy;">PSCmdlet</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #region</span> Parameters </pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">string</span> path;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>( Position = 0, ValueFromPipeline = <span style="color: #c86400;">true</span>, ValueFromPipelineByPropertyName = <span style="color: #c86400;">true</span> )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">string</span> Path</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">string</span>.IsNullOrEmpty( path ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> path = System.IO.<span style="color: navy;">Path</span>.Combine( SessionState.Path.CurrentFileSystemLocation.Path, </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span>.Format( <span style="color: #a31515;">"ScreenShot.{0}"</span>, <span style="color: #c86400;">this</span>.ImageFormat.ToString().ToLower() ) );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span> <span style="color: #c86400;">if</span> ( !System.IO.<span style="color: navy;">Path</span>.IsPathRooted( path ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: green;">// the specified path is relative; make it relative to the current working directory</span></pre>
<pre style="margin: 0px;"> path = System.IO.<span style="color: navy;">Path</span>.Combine( SessionState.Path.CurrentFileSystemLocation.Path, path );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> path;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> path = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> noClobber;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> NoClobber</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> noClobber;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> noClobber = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> all;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> All</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> all;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> all = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">int</span>? screenIndex;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> [<span style="color: navy;">ValidateRange</span>( 0, <span style="color: navy;">Int32</span>.MaxValue )]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: #c86400;">int</span> ScreenIndex</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !screenIndex.HasValue )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: navy;">Screen</span>.AllScreens.Length > 1 )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: green;">// get the primary monitor</span></pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">for</span> ( <span style="color: #c86400;">int</span> i = 0; !screenIndex.HasValue && i < <span style="color: navy;">Screen</span>.AllScreens.Length; i++ )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: navy;">Screen</span>.AllScreens[ i ].Primary )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> screenIndex = i;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> screenIndex = 0;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> screenIndex.Value;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> screenIndex = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: navy;">ImageFormat</span>? imageFormat = <span style="color: #c86400;">null</span>;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">ImageFormat</span> ImageFormat</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( !imageFormat.HasValue && <span style="color: #c86400;">this</span>.path != <span style="color: #c86400;">null</span> )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> imageFormat = (<span style="color: navy;">ImageFormat</span>)<span style="color: navy;">Enum</span>.Parse( <span style="color: #c86400;">typeof</span>( <span style="color: navy;">ImageFormat</span> ), </pre>
<pre style="margin: 0px;"> ( <span style="color: #c86400;">new</span> <span style="color: navy;">FileInfo</span>( <span style="color: #c86400;">this</span>.path ) ).Extension.Substring( 1 ), <span style="color: #c86400;">true</span> );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> imageFormat.GetValueOrDefault( <span style="color: navy;">ImageFormat</span>.Jpg );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> imageFormat = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> <span style="color: #c86400;">bool</span> passThru;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> [<span style="color: navy;">Parameter</span>]</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">public</span> <span style="color: navy;">SwitchParameter</span> PassThru</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">get</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> passThru;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">set</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> passThru = <span style="color: #c86400;">value</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"><span style="color: #c86400;"> #endregion</span></pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> BeginProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: green;">// make sure our file format and file extension match</span></pre>
<pre style="margin: 0px;"> <span style="color: green;">// use the Path property this time to be sure the path is initialized properly</span></pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.ImageFormat.ToString().ToLower() != ( <span style="color: #c86400;">new</span> <span style="color: navy;">FileInfo</span>( <span style="color: #c86400;">this</span>.Path ) ).Extension.Substring( 1 ).ToLower() )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">throw</span> <span style="color: #c86400;">new</span> <span style="color: navy;">Exception</span>( <span style="color: #a31515;">"The specified file format and the extention of the specified path do not match."</span> );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">protected</span> <span style="color: #c86400;">override</span> <span style="color: #c86400;">void</span> EndProcessing()</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">Bitmap</span> screenBitmap;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">int</span> sourceX = <span style="color: navy;">Int32</span>.MaxValue;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">int</span> sourceY = <span style="color: navy;">Int32</span>.MaxValue;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">int</span> width = 0;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">int</span> bottom = 0;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.all )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">for</span> ( <span style="color: #c86400;">int</span> i = 0; i < <span style="color: navy;">Screen</span>.AllScreens.Length; i++ )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: navy;">Screen</span> screen = <span style="color: navy;">Screen</span>.AllScreens[ i ];</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> sourceX = <span style="color: navy;">Math</span>.Min( sourceX, screen.Bounds.X );</pre>
<pre style="margin: 0px;"> sourceY = <span style="color: navy;">Math</span>.Min( sourceY, screen.Bounds.Y );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> width += screen.Bounds.Width;</pre>
<pre style="margin: 0px;"> bottom = <span style="color: navy;">Math</span>.Max( bottom, screen.Bounds.Bottom );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">else</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: green;">// the ScreenIndex property will be initialized with the appropriate value if it has not been specified.</span></pre>
<pre style="margin: 0px;"> <span style="color: navy;">Screen</span> screen = <span style="color: navy;">Screen</span>.AllScreens[ <span style="color: #c86400;">this</span>.ScreenIndex ];</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> sourceX = screen.Bounds.X;</pre>
<pre style="margin: 0px;"> sourceY = screen.Bounds.Y;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> width = screen.Bounds.Width;</pre>
<pre style="margin: 0px;"> bottom = screen.Bounds.Bottom;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> screenBitmap = <span style="color: #c86400;">new</span> <span style="color: navy;">Bitmap</span>( width, bottom - sourceY, <span style="color: navy;">PixelFormat</span>.Format32bppArgb );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">using</span> ( <span style="color: navy;">Graphics</span> screenGraphics = <span style="color: navy;">Graphics</span>.FromImage( screenBitmap ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> screenGraphics.CopyFromScreen( sourceX, sourceY, 0, 0, <span style="color: #c86400;">new</span> <span style="color: navy;">Size</span>( width, bottom - sourceY ), <span style="color: navy;">CopyPixelOperation</span>.SourceCopy );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: #c86400;">this</span>.noClobber )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( <span style="color: navy;">File</span>.Exists( <span style="color: #c86400;">this</span>.path ) )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">int</span> fileNumber = 1;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: navy;">FileInfo</span> fileInfo = <span style="color: #c86400;">new</span> <span style="color: navy;">FileInfo</span>( <span style="color: #c86400;">this</span>.path );</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span> name = System.IO.<span style="color: navy;">Path</span>.GetFileNameWithoutExtension( <span style="color: #c86400;">this</span>.path );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">do</span></pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">this</span>.path = System.IO.<span style="color: navy;">Path</span>.Combine( fileInfo.DirectoryName,</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">string</span>.Format( <span style="color: #a31515;">"{0}{1}{2}"</span>, name, fileNumber++, fileInfo.Extension ) );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">while</span> ( <span style="color: navy;">File</span>.Exists( <span style="color: #c86400;">this</span>.path ) );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> screenBitmap.Save( <span style="color: #c86400;">this</span>.path, ImageFormatEnumToImageFormat( <span style="color: #c86400;">this</span>.ImageFormat ) );</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">if</span> ( passThru )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> WriteObject( <span style="color: #c86400;">new</span> <span style="color: navy;">FileInfo</span>( <span style="color: #c86400;">this</span>.path ) );</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">private</span> System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span> ImageFormatEnumToImageFormat( <span style="color: navy;">ImageFormat</span> imageFileFormat )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Jpeg;</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">switch</span> ( imageFileFormat )</pre>
<pre style="margin: 0px;"> {</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">case</span> <span style="color: navy;">ImageFormat</span>.Bmp:</pre>
<pre style="margin: 0px;"> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Bmp;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">break</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">case</span> <span style="color: navy;">ImageFormat</span>.Emf:</pre>
<pre style="margin: 0px;"> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Emf;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">break</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">case</span> <span style="color: navy;">ImageFormat</span>.Gif:</pre>
<pre style="margin: 0px;"> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Gif;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">break</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">case</span> <span style="color: navy;">ImageFormat</span>.Jpg:</pre>
<pre style="margin: 0px;"> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Jpeg;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">break</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">case</span> <span style="color: navy;">ImageFormat</span>.Png:</pre>
<pre style="margin: 0px;"> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Png;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">break</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">case</span> <span style="color: navy;">ImageFormat</span>.Tif:</pre>
<pre style="margin: 0px;"> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Tiff;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">break</span>;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">case</span> <span style="color: navy;">ImageFormat</span>.Wmf:</pre>
<pre style="margin: 0px;"> imageFormat = System.Drawing.Imaging.<span style="color: navy;">ImageFormat</span>.Wmf;</pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">break</span>;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> </pre>
<pre style="margin: 0px;"> <span style="color: #c86400;">return</span> imageFormat;</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;"> }</pre>
<pre style="margin: 0px;">}</pre>
</div><br /><br />
This Cmdlet provides several parameters that allow you to customize how a screenshot is taken. A relative or absolute path to an image file may be specified; if no path is specified, the file is saved in the current working directory. The NoClobber SwitchParameter is used to specify that existing image files will not be overwritten; each new screenshot file is given a unique number, e.g. ScreenShot1.jpg, ScreenShot2.jpg, etc. With a multiple monitor setup, the ScreenIndex parameter can be used to specify the monitor to use for the screenshot. The primary monitor is used by default, and the All parameter can be used to capture all monitors at once. The ImageFormat parameter is used to specify the type of image file that will be created; Jpg is the default. The PassThru parameter indicates if the path to the image file will be written to the pipeline as a FileInfo object.<br /><br />
Well that's it for today. I have enough Cmdlets for two more posts like this one. To finish up, the following is the XML help for these three Cmdlets.<br /><br />
<div style="padding: 2px; overflow: auto; width: 100%; height: 400px; font-family: Consolas; font-size: 8pt; color: black; background: #dddddd;">
<pre style="margin: 0px;"><span style="color: navy;"><?</span><span style="color: #c86400;">xml</span><span style="color: navy;"> version=</span><span style="color: maroon;">"1.0"</span><span style="color: navy;"> encoding=</span><span style="color: maroon;">"utf-8"</span><span style="color: navy;"> ?></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"><</span><span style="color: #c86400;">helpItems</span><span style="color: navy;"> xmlns=</span><span style="color: maroon;">"http://msh"</span><span style="color: navy;"> schema=</span><span style="color: maroon;">"maml"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:command</span><span style="color: navy;"> xmlns:maml=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/2004/10"</span><span style="color: navy;"> xmlns:command=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/command/2004/10"</span><span style="color: navy;"> xmlns:dev=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/2004/10"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span>Get-Clipboard<span style="color: navy;"></</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Get-Clipboard Cmdlet returns the contents of the system clipboard.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:copyright</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:copyright</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span>Get<span style="color: navy;"></</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span>Clipboard<span style="color: navy;"></</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:version</span><span style="color: navy;">></</span><span style="color: #c86400;">dev:version</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Get-Clipboard Cmdlet returns the contents of the system clipboard. By default, only text is returned. If file drop list data is available, and the Files parameter is specified, the files in the list are returned.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Get-Clipboard<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>files<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Files<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Retrieves FileInfo objects from the file drop list on the clipboard.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>None<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;">/></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;"> /></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:returnValues</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:returnValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>object []<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;"> /></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"> The contents of the system clipboard.</pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">> </span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">> </span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:returnValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:returnValues</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:command</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:command</span><span style="color: navy;"> xmlns:maml=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/2004/10"</span><span style="color: navy;"> xmlns:command=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/command/2004/10"</span><span style="color: navy;"> xmlns:dev=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/2004/10"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span>Set-Clipboard<span style="color: navy;"></</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Set-Clipboard Cmdlet puts its input on the system clipboard.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:copyright</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:copyright</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span>Set<span style="color: navy;"></</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span>Clipboard<span style="color: navy;"></</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:version</span><span style="color: navy;">></</span><span style="color: #c86400;">dev:version</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Set-Clipboard Cmdlet puts its input on the system clipboard. By default, only text is accepted. FileInfo objects can be added the file drop list on the clipboard by specifying the Files parameter.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Set-Clipboard<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"1"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>data<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>object []<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>files<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>append<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>trimWhiteSpace<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>passThru<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"1"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Data<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The data to be added to the clipboard. Strings and FileInfo objects are accepted. The Files parameter must be specified when working with FileInfo objects.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Files<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Adds incoming FileInfo objects to the file drop list on the clipboard.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Append<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Appends incoming data to the end of the current contents of the clipboard. Text will be concatenated, and FileInfo objects will be added to the end of the file drop list.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>TrimWhiteSpace<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Trims trailing whitespace from text data. This parameter does not apply when working with FileInfo objects.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>PassThru<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Passes the objects added to the clipboard through the pipeline. By default, this Cmdlet does not pass any objects through the pipeline.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>object []<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;">/></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"> Data to be added to the clipboard.</pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputType</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:inputTypes</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:command</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:command</span><span style="color: navy;"> xmlns:maml=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/2004/10"</span><span style="color: navy;"> xmlns:command=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/command/2004/10"</span><span style="color: navy;"> xmlns:dev=</span><span style="color: maroon;">"http://schemas.microsoft.com/maml/dev/2004/10"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span>Get-ScreenShot<span style="color: navy;"></</span><span style="color: #c86400;">command:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Get-ScreenShot Cmdlet creates a file containing a screen shot.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:copyright</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:copyright</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span>Get<span style="color: navy;"></</span><span style="color: #c86400;">command:verb</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span>ScreenShot<span style="color: navy;"></</span><span style="color: #c86400;">command:noun</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:version</span><span style="color: navy;">></</span><span style="color: #c86400;">dev:version</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:details</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The Get-ScreenShot Cmdlet creates a file containing a screen shot. By default, the screen shot is of the primary monitor. For multiple-monitor setups, the All and ScreenIndex parmeters can be used to customize the result of the command.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Get-ScreenShot<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"1"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>path<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>noClobber<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>all<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>screenIndex<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>int<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>imageFormat<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>ImageFormat<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>passThru<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntaxItem</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:syntax</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"true"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>Path<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The path to the image file that will be created. If not specified, a default name of "ScreenShot" will be used.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>string<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>NoClobber<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Ensures that the cmdlet cannot overwrite an existing file. If the NoClobber parameter is not specified, Get-ScreenShot overwrites the file at the specified path, or the at the default path. If the NoClobber parameter is specified, a unique filename will be created by sequentially adding numbers to the end of the filename until a unique name is found.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>All<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Creates a screenshot of all of the monitors on a multiple-monitor system.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>ScreenIndex<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Used to specify the index of a specific monitor in a multiple-monitor system. If the ScreenIndex parameter is not specifed with a multiple-monitor system, the primary monitor will be used.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>ImageFormat<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Sets the format of the image file created by Get-ScreenShot. This parameter is not necessary if the Path parameter is specified; the format of the image will be determined based on the extension of the filename.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>The following lists the acceptable values for this parameter:<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">> </span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>ImageFormat<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>ImageFormat<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:uri</span><span style="color: navy;">/></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:type</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:defaultValue</span><span style="color: navy;">></span>Jpg<span style="color: navy;"></</span><span style="color: #c86400;">dev:defaultValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValues</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span>Bmp<span style="color: navy;"></</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span>Emf<span style="color: navy;"></</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span>Gif<span style="color: navy;"></</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span>Jpg<span style="color: navy;"></</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span>Png<span style="color: navy;"></</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span>Tif<span style="color: navy;"></</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span>Wmf<span style="color: navy;"></</span><span style="color: #c86400;">dev:value</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">dev:possibleValues</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;"> required=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> position=</span><span style="color: maroon;">"named"</span><span style="color: navy;"> globbing=</span><span style="color: maroon;">"false"</span><span style="color: navy;"> pipelineinput=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span>PassThru<span style="color: navy;"></</span><span style="color: #c86400;">maml:name</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span>Passes the image file created by Get-ScreenShot through the pipeline. By default, this Cmdlet does not pass any objects through the pipeline.<span style="color: navy;"></</span><span style="color: #c86400;">maml:para</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">maml:description</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> <</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;"> required=</span><span style="color: maroon;">"true"</span><span style="color: navy;"> variableLength=</span><span style="color: maroon;">"false"</span><span style="color: navy;">></span>SwitchParameter<span style="color: navy;"></</span><span style="color: #c86400;">command:parameterValue</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameter</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:parameters</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"> </</span><span style="color: #c86400;">command:command</span><span style="color: navy;">></span></pre>
<pre style="margin: 0px;"><span style="color: navy;"></</span><span style="color: #c86400;">helpItems</span><span style="color: navy;">></span></pre>
</div><br />Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com0tag:blogger.com,1999:blog-4092806390106651827.post-58148980893563803482007-11-09T23:07:00.000-08:002007-11-10T23:34:08.306-08:00PowerShell syntax highlighting with HTMLWhen I decided to start this blog, I thought it would be nice to be able to display PowerShell code examples with nice formatting and syntax highlighting. I tried a few freely available tools out there that advertised PowerShell syntax support, but they all seemed to fall short in a category or two. None of them correctly handled multiple line strings or here-strings, and none of them correctly highlighted PowerShell variables enclosed in curly braces e.g. "${this is a variable}".<br /><br />
I thought it would be fun to try to write my own syntax highlighting tool with PowerShell. It was a little more difficult than I originally thought it would be, but it really was fun.<br /><br />
The script takes a string parameter that can be a code snippet or a path to a PowerShell script file. A switch parameter can be provided if line numbers are wanted in the output. The script highlights strings, comments, operators, numbers, keywords (including things kind of like keywords), types (specifically the shortcut types available in PowerShell, like [string] and [regex]), variables, and Cmdlet names. The colors used to highlight each of these items, along with the background color, default foreground color, and line number color can be customized by changing the values of the variables declared at the top of the script.<br /><br />
Here is the script (highlighted with itself):<br /><br />
<div style='width: 100%; height: 400px; overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #008000'># Highlight-Syntax.ps1</span><br />
<span style='color: #008000'># version 1.0</span><br />
<span style='color: #008000'># by Jeff Hillman</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># this script uses regular expressions to highlight PowerShell</span><br />
<span style='color: #008000'># syntax with HTML.</span><br />
<br />
<span style='color: #C86400'>param</span>( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$code</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$LineNumbers</span> )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$code</span> -ErrorAction SilentlyContinue )<br />
{<br />
<span style='color: #000080'>$code</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Content</span> <span style='color: #000080'>$code</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-String</span><br />
}<br />
<br />
<span style='color: #000080'>$backgroundColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#DDDDDD"</span><br />
<span style='color: #000080'>$foregroundColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#000000"</span><br />
<span style='color: #000080'>$stringColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#800000"</span><br />
<span style='color: #000080'>$commentColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#008000"</span><br />
<span style='color: #000080'>$operatorColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><br />
<span style='color: #000080'>$numberColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#800000"</span><br />
<span style='color: #000080'>$keywordColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><br />
<span style='color: #000080'>$typeColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#404040"</span><br />
<span style='color: #000080'>$variableColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#000080"</span><br />
<span style='color: #000080'>$cmdletColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><br />
<span style='color: #000080'>$lineNumberColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#404040"</span><br />
<br />
<span style='color: #C86400'>filter</span> Html-Encode( <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$Regex</span> )<br />
{<br />
<span style='color: #008000'># some regular expressions operate on strings that have already</span><br />
<span style='color: #008000'># been through this filter, so the patterns need to be updated</span><br />
<span style='color: #008000'># to look for the encoded characters instead of the literal ones.</span><br />
<span style='color: #008000'># we do it with this filter instead of directly in the regular </span><br />
<span style='color: #008000'># expression so the expressions can be a bit more readable (ha!)</span><br />
<br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"&"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&amp;"</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$Regex</span> )<br />
{<br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"(?<!\(\?)<"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&lt;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"(?<!\(\?)>"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&gt;"</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"\t"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>" "</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>" "</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&nbsp;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"<"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&lt;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>">"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&gt;"</span><br />
}<br />
<br />
<span style='color: #000080'>$_</span><br />
}<br />
<br />
<span style='color: #008000'># regular expressions</span><br />
<br />
<span style='color: #000080'>$operatorRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'>((?x:</span><br />
<span style='color: #800000'> (?# assignment operators)</span><br />
<span style='color: #800000'> =|\+=|-=|\*=|/=|%=|</span><br />
<span style='color: #800000'> (?# arithmatic operators)</span><br />
<span style='color: #800000'> (?<!\de)</span><br />
<span style='color: #800000'> (\+|-|\*|/|%)(?![a-z])|</span><br />
<span style='color: #800000'> (?# unary operators)</span><br />
<span style='color: #800000'> \+\+|\-\-|</span><br />
<span style='color: #800000'> (?# logical operators)</span><br />
<span style='color: #800000'> (-and|-or|-not)\b|!|</span><br />
<span style='color: #800000'> (?# bitwise operators)</span><br />
<span style='color: #800000'> (-band|-bor)\b|</span><br />
<span style='color: #800000'> (?# redirection and pipeline operators)</span><br />
<span style='color: #800000'> 2>>|>>|2>&1|1>&2|2>|>|<|\||</span><br />
<span style='color: #800000'> (?# comparison operators)</span><br />
<span style='color: #800000'> (</span><br />
<span style='color: #800000'> -[ci]? (?# case and case-insensitive variants)</span><br />
<span style='color: #800000'> (eq|ne|ge|gt|lt|le|like|notlike|match|notmatch|replace|contains|notcontains)\b</span><br />
<span style='color: #800000'> )|</span><br />
<span style='color: #800000'> (?# type operators)</span><br />
<span style='color: #800000'> (-is|-isnot|-as)\b|</span><br />
<span style='color: #800000'> (?# range and miscellaneous operators)</span><br />
<span style='color: #800000'> \.\.|(?<!\d)\.(?!\d)|&|::|:|,|``|</span><br />
<span style='color: #800000'> (?# string formatting operator)</span><br />
<span style='color: #800000'> -f\b</span><br />
<span style='color: #800000'>))</span><br />
<span style='color: #800000'>"@</span> <span style='color: #C86400'>|</span> Html-Encode -Regex<br />
<br />
<span style='color: #000080'>$numberRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'>((?x:</span><br />
<span style='color: #800000'> (</span><br />
<span style='color: #800000'> (?# hexadecimal numbers)</span><br />
<span style='color: #800000'> (\b0x[0-9a-f]+)|</span><br />
<span style='color: #800000'> (?# regular numbers)</span><br />
<span style='color: #800000'> (?<!&)</span><br />
<span style='color: #800000'> ((\b[0-9]+(\.(?!\.))?[0-9]*)|((?<!\.)\.[0-9]+))</span><br />
<span style='color: #800000'> (?!(>>|>&[12]|>))</span><br />
<span style='color: #800000'> (?# scientific notation)</span><br />
<span style='color: #800000'> (e(\+|-)?[0-9]+)?</span><br />
<span style='color: #800000'> )</span><br />
<span style='color: #800000'> (</span><br />
<span style='color: #800000'> (?# type specifiers)</span><br />
<span style='color: #800000'> (l|ul|u|f|ll|ull)?</span><br />
<span style='color: #800000'> (?# size shorthand)</span><br />
<span style='color: #800000'> (b|kb|mb|gb)?</span><br />
<span style='color: #800000'> \b</span><br />
<span style='color: #800000'> )?</span><br />
<span style='color: #800000'>))</span><br />
<span style='color: #800000'>"@</span> <span style='color: #C86400'>|</span> Html-Encode -Regex<br />
<br />
<span style='color: #000080'>$keyWordRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'>((?x:</span><br />
<span style='color: #800000'> \b(</span><br />
<span style='color: #800000'> (?# don't match anything that looks like a variable or a parameter)</span><br />
<span style='color: #800000'> (?<![-$])</span><br />
<span style='color: #800000'> (</span><br />
<span style='color: #800000'> (?# condition keywords)</span><br />
<span style='color: #800000'> if|else|elseif|(?<!\[)switch(?!\])|</span><br />
<span style='color: #800000'> (?# loop keywords)</span><br />
<span style='color: #800000'> for|(?<!\|</span>&nbsp;)foreach(?!-object)|in|do|while|until|default|break|continue|</span><br />
<span style='color: #800000'> (?# scope keywords)</span><br />
<span style='color: #800000'> global|script|local|private|</span><br />
<span style='color: #800000'> (?# block keywords)</span><br />
<span style='color: #800000'> begin|process|end|</span><br />
<span style='color: #800000'> (?# other keywords)</span><br />
<span style='color: #800000'> function|filter|param|throw|trap|return</span><br />
<span style='color: #800000'> )</span><br />
<span style='color: #800000'> )\b</span><br />
<span style='color: #800000'>))</span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$typeRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'>((?x:</span><br />
<span style='color: #800000'> \[</span><br />
<span style='color: #800000'> (</span><br />
<span style='color: #800000'> (?# primitive types and arrays of those types)</span><br />
<span style='color: #800000'> ((int|long|string|char|bool|byte|double|decimal|float|single)(\[\])?)|</span><br />
<span style='color: #800000'> (?# other types)</span><br />
<span style='color: #800000'> regex|array|xml|scriptblock|switch|hashtable|type|ref|psobject|wmi|wmisearcher|wmiclass</span><br />
<span style='color: #800000'> )</span><br />
<span style='color: #800000'> \]</span><br />
<span style='color: #800000'>))</span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$cmdletNames</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Command</span> -Type Cmdlet <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Name }<br />
<br />
<span style='color: #C86400'>function</span> Highlight-Other( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$code</span> )<br />
{<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$code</span> <span style='color: #C86400'>|</span> Html-Encode<br />
<br />
<span style='color: #008000'># operators</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>-replace</span> <br />
<span style='color: #000080'>$operatorRegex</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<span style='color: $operatorColor'>`$1</span>"</span><br />
<br />
<span style='color: #008000'># numbers</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>-replace</span> <br />
<span style='color: #000080'>$numberRegex</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<span style='color: $numberColor'>`$1</span>"</span><br />
<br />
<span style='color: #008000'># keywords</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>-replace</span> <br />
<span style='color: #000080'>$keyWordRegex</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<span style='color: $keywordColor'>`$1</span>"</span><br />
<br />
<span style='color: #008000'># types</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>-replace</span> <br />
<span style='color: #000080'>$typeRegex</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<span style='color: $typeColor'>`$1</span>"</span><br />
<br />
<span style='color: #008000'># Cmdlets</span><br />
<span style='color: #000080'>$cmdletNames</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>-replace</span> <br />
<span style='color: #800000'>"\b($_)\b"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<span style='color: $cmdletColor'>`$1</span>"</span><br />
}<br />
<br />
<span style='color: #000080'>$highlightedCode</span><br />
}<br />
<br />
<span style='color: #000080'>$RegexOptions</span> <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Text<span style='color: #C86400'>.</span>RegularExpressions<span style='color: #C86400'>.</span>RegexOptions]<br />
<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #008000'># we treat variables, strings, and comments differently because we don't </span><br />
<span style='color: #008000'># want anything inside them to be highlighted. we combine the regular </span><br />
<span style='color: #008000'># expressions so they are mutually exclusive</span><br />
<br />
<span style='color: #000080'>$variableRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>'(\$(\w+|{[^}`]*(`.[^}`]*)*}))'</span><br />
<br />
<span style='color: #000080'>$stringRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'>(?x:</span><br />
<span style='color: #800000'> (?# here strings)</span><br />
<span style='color: #800000'> @[`"'](.|\n)*?^[`"']@|</span><br />
<span style='color: #800000'> (?# double-quoted strings)</span><br />
<span style='color: #800000'> `"[^`"``]*(``.[^`"``]*)*`"|</span><br />
<span style='color: #800000'> (?# single-quoted strings)</span><br />
<span style='color: #800000'> '[^'``]*(``.[^'``]*)*'</span><br />
<span style='color: #800000'>)</span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$commentRegex</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#[^\r\n]*"</span><br />
<br />
<span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Matches( <span style='color: #000080'>$code</span><span style='color: #C86400'>,</span> <br />
<span style='color: #800000'>"(?<before>(.|\n)*?)"</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"((?<variable>$variableRegex)|"</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"(?<string>$stringRegex)|"</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"(?<comment>$commentRegex))"</span><span style='color: #C86400'>,</span><br />
<span style='color: #000080'>$RegexOptions</span><span style='color: #C86400'>::</span>MultiLine ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #008000'># highlight everything before the variable, string, or comment </span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> Highlight-Other <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"before"</span> ]<span style='color: #C86400'>.</span>Value<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"variable"</span> ]<span style='color: #C86400'>.</span>Value )<br />
{<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <br />
<span style='color: #800000'>"<span style='color: $variableColor'>"</span> <span style='color: #C86400'>+</span> <br />
( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>'variable'</span> ]<span style='color: #C86400'>.</span>Value <span style='color: #C86400'>|</span> Html-Encode ) <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"</span>"</span><br />
}<br />
<span style='color: #C86400'>elseif</span> ( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>"string"</span> ]<span style='color: #C86400'>.</span>Value )<br />
{<br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>'string'</span> ]<span style='color: #C86400'>.</span>Value <span style='color: #C86400'>|</span> Html-Encode<br />
<br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"<span style='color: $stringColor'>$string</span>"</span><br />
<br />
<span style='color: #008000'># we have to highlight each piece of multi-line strings</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$string</span> <span style='color: #C86400'>-match</span> <span style='color: #800000'>"\r\n"</span> )<br />
{<br />
<span style='color: #008000'># highlight any line continuation characters as operators</span><br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$string</span> <span style='color: #C86400'>-replace</span> <br />
<span style='color: #800000'>"(``)(?=\r\n)"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<span style='color: $operatorColor'>``</span>"</span><br />
<br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$string</span> <span style='color: #C86400'>-replace</span> <br />
<span style='color: #800000'>"\r\n"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"</span>`r`n<span style='color: $stringColor'>"</span><br />
}<br />
<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$string</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <br />
<span style='color: #800000'>"<span style='color: $commentColor'>"</span> <span style='color: #C86400'>+</span> <br />
$( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Groups[ <span style='color: #800000'>'comment'</span> ]<span style='color: #C86400'>.</span>Value <span style='color: #C86400'>|</span> Html-Encode ) <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"</span>"</span><br />
}<br />
<br />
<span style='color: #008000'># we need to keep track of the last position of a variable, string, </span><br />
<span style='color: #008000'># or comment, so we can highlight everything after it</span><br />
<span style='color: #000080'>$lastMatch</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$lastMatch</span> )<br />
{<br />
<span style='color: #008000'># highlight everything after the last variable, string, or comment </span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> Highlight-Other <span style='color: #000080'>$code</span><span style='color: #C86400'>.</span>SubString( <span style='color: #000080'>$lastMatch</span><span style='color: #C86400'>.</span>Index <span style='color: #C86400'>+</span> <span style='color: #000080'>$lastMatch</span><span style='color: #C86400'>.</span>Length )<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> Highlight-Other <span style='color: #000080'>$code</span><br />
}<br />
<br />
<span style='color: #008000'># add line breaks</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <br />
<span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Replace( <span style='color: #000080'>$highlightedCode</span><span style='color: #C86400'>,</span> <span style='color: #800000'>'(?=\r\n)'</span><span style='color: #C86400'>,</span> <span style='color: #800000'>'<br />'</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$RegexOptions</span><span style='color: #C86400'>::</span>MultiLine )<br />
<br />
<span style='color: #008000'># put the highlighted code in the pipeline</span><br />
<span style='color: #800000'>"<div style='width: 100%; "</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"/*height: 100%;*/ "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"overflow: auto; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"font-family: Consolas, `"Courier New`", Courier, mono; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"font-size: 12px; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"background-color: $backgroundColor; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"color: $foregroundColor; "</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"padding: 2px 2px 2px 2px; white-space: nowrap'>"</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$LineNumbers</span> )<br />
{<br />
<span style='color: #000080'>$digitCount</span> <span style='color: #C86400'>=</span> <br />
( <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Matches( <span style='color: #000080'>$highlightedCode</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"^"</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$RegexOptions</span><span style='color: #C86400'>::</span>MultiLine ) )<span style='color: #C86400'>.</span>Count<span style='color: #C86400'>.</span>ToString()<span style='color: #C86400'>.</span>Length<br />
<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Replace( <span style='color: #000080'>$highlightedCode</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"^"</span><span style='color: #C86400'>,</span> <br />
<span style='color: #800000'>"<li style='color: $lineNumberColor; padding-left: 5px'><span style='color: $foregroundColor'>"</span><span style='color: #C86400'>,</span><br />
<span style='color: #000080'>$RegexOptions</span><span style='color: #C86400'>::</span>MultiLine )<br />
<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Replace( <span style='color: #000080'>$highlightedCode</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<br />"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"</span><br />"</span><span style='color: #C86400'>,</span><br />
<span style='color: #000080'>$RegexOptions</span><span style='color: #C86400'>::</span>MultiLine )<br />
<br />
<span style='color: #800000'>"<ol start='1' style='border-left: "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"solid 1px $lineNumberColor; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"margin-left: $( ( $digitCount * 10 ) + 15 )px; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"padding: 0px;'>"</span><br />
}<br />
<br />
<span style='color: #000080'>$highlightedCode</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$LineNumbers</span> )<br />
{<br />
<span style='color: #800000'>"</ol>"</span><br />
}<br />
<br />
<span style='color: #800000'>"</div>"</span><br />
</div><br /><br />
As you might have guessed, most of the work with this script was getting the regular expressions right. I have always loved the support for regular expressions offered by the .Net Framework, and PowerShell makes them even easier to use. It turns out that I was able to reuse the expressions in a grammar file for my new favorite text editor, <a href="http://intype.info/home/index.php">Intype</a>. I like that my code examples look absolutely identical to what I see in my editor.<br /><br />
The script obviously relies heavily on these regular expressions, which can contribute to a higher potential for problems, but it seems to do a pretty good job. With all of the matching and string processing, the script can also be fairly slow.<br /><br />
Then along came the CTP for Windows PowerShell 2.0. One of the new classes available to developers is the System.Management.Automation.PsParser class, which can be used to tokenize PowerShell code. As you might imagine, a task like highlighting syntax becomes much easier.<br /><br />
Below is an equivalent highlighting script that makes use of the System.Management.Automation.PsParser class. It is used in the same way as the PowerShell version 1.0 script.<br /><br />
<div style='width: 100%; height: 400px; overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #008000'>#requires -version 2.0</span><br />
<br />
<span style='color: #008000'># Highlight-Syntax.ps1</span><br />
<span style='color: #008000'># version 2.0</span><br />
<span style='color: #008000'># by Jeff Hillman</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># this script uses the System.Management.Automation.PsParser class</span><br />
<span style='color: #008000'># to highlight PowerShell syntax with HTML.</span><br />
<br />
<span style='color: #C86400'>param</span><span style='color: #000000'>(</span> <span style='color: #404040'>[string]</span> <span style='color: #000080'>$code</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$LineNumbers</span> <span style='color: #000000'>)</span><br />
<br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$code</span> <span style='color: #000000'>-ErrorAction</span> <span style='color: #000000'>SilentlyContinue</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$code</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Content</span> <span style='color: #000080'>$code</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-String</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$backgroundColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#DDDDDD"</span><br />
<span style='color: #000080'>$foregroundColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#000000"</span><br />
<span style='color: #000080'>$lineNumberColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#404040"</span><br />
<br />
<span style='color: #000080'>$PSTokenType</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[System.Management.Automation.PSTokenType]</span><br />
<br />
<span style='color: #000080'>$colorHash</span> <span style='color: #C86400'>=</span> <span style='color: #000000'>@{</span> <br />
<span style='color: #008000'># $PSTokenType::Unknown = $foregroundColor; </span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Command</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><span style='color: #C86400'>;</span><br />
<span style='color: #008000'># $PSTokenType::CommandParameter = $foregroundColor;</span><br />
<span style='color: #008000'># $PSTokenType::CommandArgument = $foregroundColor;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Number</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#800000"</span><span style='color: #C86400'>;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>String</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#800000"</span><span style='color: #C86400'>;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Variable</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#000080"</span><span style='color: #C86400'>;</span><br />
<span style='color: #008000'># $PSTokenType::Member = $foregroundColor;</span><br />
<span style='color: #008000'># $PSTokenType::LoopLabel = $foregroundColor;</span><br />
<span style='color: #008000'># $PSTokenType::Attribute = $foregroundColor;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Type</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#404040"</span><span style='color: #C86400'>;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Operator</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><span style='color: #C86400'>;</span><br />
<span style='color: #008000'># $PSTokenType::GroupStart = $foregroundColor;</span><br />
<span style='color: #008000'># $PSTokenType::GroupEnd = $foregroundColor;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Keyword</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><span style='color: #C86400'>;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Comment</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#008000"</span><span style='color: #C86400'>;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>StatementSeparator</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><span style='color: #C86400'>;</span><br />
<span style='color: #008000'># $PSTokenType::NewLine = $foregroundColor;</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>LineContinuation</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#C86400"</span><span style='color: #C86400'>;</span><br />
<span style='color: #008000'># $PSTokenType::Position = $foregroundColor;</span><br />
<br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #C86400'>filter</span> <span style='color: #000000'>Html-Encode</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"&"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&amp;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>" "</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&nbsp;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"<"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&lt;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>">"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&gt;"</span><br />
<br />
<span style='color: #000080'>$_</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #008000'># replace the tabs with spaces</span><br />
<span style='color: #000080'>$code</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$code</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"\t"</span><span style='color: #C86400'>,</span> <span style='color: #000000'>(</span> <span style='color: #800000'>" "</span> <span style='color: #C86400'>*</span> <span style='color: #800000'>4</span> <span style='color: #000000'>)</span><br />
<br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$LineNumbers</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"<li style='color: $lineNumberColor; padding-left: 5px'>"</span><br />
<span style='color: #000000'>}</span><br />
<span style='color: #C86400'>else</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$parser</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[System.Management.Automation.PsParser]</span><br />
<span style='color: #000080'>$lastColumn</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>1</span><br />
<span style='color: #000080'>$lineCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>1</span><br />
<br />
<span style='color: #C86400'>foreach</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$token</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$parser</span><span style='color: #C86400'>::</span><span style='color: #000000'>Tokenize</span><span style='color: #000000'>(</span> <span style='color: #000080'>$code</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[ref]</span> <span style='color: #000080'>$null</span> <span style='color: #000000'>)</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> <span style='color: #000000'>StartLine</span><span style='color: #C86400'>,</span> <span style='color: #000000'>StartColumn</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #008000'># get the color based on the type of the token</span><br />
<span style='color: #000080'>$color</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$colorHash</span><span style='color: #C86400'>[</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>Type</span> <span style='color: #C86400'>]</span><br />
<br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$color</span> <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$null</span> <span style='color: #000000'>)</span> <br />
<span style='color: #000000'>{</span> <br />
<span style='color: #000080'>$color</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$foregroundColor</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #008000'># add whitespace</span><br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$lastColumn</span> <span style='color: #C86400'>-lt</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>StartColumn</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <span style='color: #000000'>(</span> <span style='color: #800000'>"&nbsp;"</span> <span style='color: #C86400'>*</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>StartColumn</span> <span style='color: #C86400'>-</span> <span style='color: #000080'>$lastColumn</span> <span style='color: #000000'>)</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #C86400'>switch</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>Type</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>String</span> <span style='color: #000000'>{</span><br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"<span style='color: {0}'>{1}</span>"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$color</span><span style='color: #C86400'>,</span> <br />
<span style='color: #000000'>(</span> <span style='color: #000080'>$code</span><span style='color: #C86400'>.</span><span style='color: #000000'>SubString</span><span style='color: #000000'>(</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>Start</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>Length</span> <span style='color: #000000'>)</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Html-Encode</span> <span style='color: #000000'>)</span><br />
<br />
<span style='color: #008000'># we have to highlight each piece of multi-line strings</span><br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$string</span> <span style='color: #C86400'>-match</span> <span style='color: #800000'>"\r\n"</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #008000'># highlight any line continuation characters as operators</span><br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$string</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"(``)(?=\r\n)"</span><span style='color: #C86400'>,</span> <br />
<span style='color: #000000'>(</span> <span style='color: #800000'>"<span style='color: {0}'>``</span>"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$colorHash</span><span style='color: #C86400'>[</span> <span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>Operator</span> <span style='color: #C86400'>]</span> <span style='color: #000000'>)</span><br />
<br />
<span style='color: #000080'>$stringHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"</span><br />`r`n"</span><br />
<br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$LineNumbers</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$stringHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<li style='color: $lineNumberColor; padding-left: 5px'>"</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$stringHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<span style='color: $color'>"</span><br />
<br />
<span style='color: #000080'>$string</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$string</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"\r\n"</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$stringHtml</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$string</span><br />
<span style='color: #C86400'>break</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>NewLine</span> <span style='color: #000000'>{</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<br />`r`n"</span><br />
<br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$LineNumbers</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<li style='color: $lineNumberColor; padding-left: 5px'>"</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$lastColumn</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>1</span><br />
<span style='color: #C86400'>++</span><span style='color: #000080'>$lineCount</span><br />
<span style='color: #C86400'>break</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000000'>default</span> <span style='color: #000000'>{</span><br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>Type</span> <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$PSTokenType</span><span style='color: #C86400'>::</span><span style='color: #000000'>LineContinuation</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$lastColumn</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>1</span><br />
<span style='color: #C86400'>++</span><span style='color: #000080'>$lineCount</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$highlightedCode</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<span style='color: {0}'>{1}</span>"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$color</span><span style='color: #C86400'>,</span> <br />
<span style='color: #000000'>(</span> <span style='color: #000080'>$code</span><span style='color: #C86400'>.</span><span style='color: #000000'>SubString</span><span style='color: #000000'>(</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>Start</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>Length</span> <span style='color: #000000'>)</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Html-Encode</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>}</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$lastColumn</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$token</span><span style='color: #C86400'>.</span><span style='color: #000000'>EndColumn</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #008000'># put the highlighted code in the pipeline</span><br />
<span style='color: #800000'>"<div style='width: 100%; "</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"/*height: 100%;*/ "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"overflow: auto; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"font-family: Consolas, `"Courier New`", Courier, mono; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"font-size: 12px; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"background-color: $backgroundColor; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"color: $foregroundColor; "</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"padding: 2px 2px 2px 2px; white-space: nowrap'>"</span><br />
<br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$LineNumbers</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #000080'>$digitCount</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$lineCount</span><span style='color: #C86400'>.</span><span style='color: #000000'>ToString</span><span style='color: #000000'>(</span><span style='color: #000000'>)</span><span style='color: #C86400'>.</span><span style='color: #000000'>Length</span><br />
<br />
<span style='color: #800000'>"<ol start='1' style='border-left: "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"solid 1px $lineNumberColor; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"margin-left: $( ( $digitCount * 10 ) + 15 )px; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"padding: 0px;'>"</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #000080'>$highlightedCode</span><br />
<br />
<span style='color: #C86400'>if</span> <span style='color: #000000'>(</span> <span style='color: #000080'>$LineNumbers</span> <span style='color: #000000'>)</span><br />
<span style='color: #000000'>{</span><br />
<span style='color: #800000'>"</ol>"</span><br />
<span style='color: #000000'>}</span><br />
<br />
<span style='color: #800000'>"</div>"</span><br />
</div><br /><br />
Besides being much faster, the PsParser technique provides much more potential for customization. This script highlights the same types of things as the 1.0 version of the script, but other token types are available, including CommandParameter, CommandArgument (these two types would be very difficult to define with a regular expression), and Member. All of the token types are listed in the script; those that I ignore are commented out.<br /><br />
As an extra bonus, here is a little script that highlights PowerShell commands in the console:<br/><br />
<div style='width: 100%; height: 400px; overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #008000'># Highlight-Commands.ps1</span><br />
<span style='color: #008000'># by Jeff Hillman</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># this script highlights PowerShell commands with HTML.</span><br />
<br />
<span style='color: #C86400'>param</span>( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$commands</span> )<br />
<br />
<span style='color: #000080'>$backgroundColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#000000"</span><br />
<span style='color: #000080'>$foregroundColor</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"#FFC400"</span><br />
<br />
<span style='color: #C86400'>filter</span> Html-Encode( <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$Regex</span> )<br />
{<br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"&"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&amp;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"\t"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>" "</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>" "</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&nbsp;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"<"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&lt;"</span><br />
<span style='color: #000080'>$_</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>">"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&gt;"</span><br />
<br />
<span style='color: #000080'>$_</span><br />
}<br />
<br />
<span style='color: #008000'># add line breaks</span><br />
<span style='color: #000080'>$highlightedCommands</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$commands</span> <span style='color: #C86400'>|</span> Html-Encode<br />
<br />
<span style='color: #000080'>$highlightedCommands</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Replace( <span style='color: #000080'>$highlightedCommands</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"^"</span><span style='color: #C86400'>,</span> <br />
<span style='color: #800000'>"<span style='font-weight: bold;'>"</span><span style='color: #C86400'>,</span><br />
[System<span style='color: #C86400'>.</span>Text<span style='color: #C86400'>.</span>RegularExpressions<span style='color: #C86400'>.</span>RegexOptions]<span style='color: #C86400'>::</span>MultiLine )<br />
<br />
<span style='color: #000080'>$highlightedCommands</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Replace( <span style='color: #000080'>$highlightedCommands</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"(?=\r\n)"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"</span><br />"</span><span style='color: #C86400'>,</span><br />
[System<span style='color: #C86400'>.</span>Text<span style='color: #C86400'>.</span>RegularExpressions<span style='color: #C86400'>.</span>RegexOptions]<span style='color: #C86400'>::</span>MultiLine )<br />
<br />
<br />
<span style='color: #008000'># put the highlighted commands in the pipeline</span><br />
<span style='color: #800000'>"<div style='width: 100%; "</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"/*height: 100%;*/ "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"overflow: auto; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"font-family: `"Courier New`", Courier, mono; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"font-size: 12px; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"background-color: $backgroundColor; "</span> <span style='color: #C86400'>+</span><br />
<span style='color: #800000'>"color: $foregroundColor; "</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"padding: 2px 2px 2px 2px; white-space: nowrap'>"</span><br />
<br />
<span style='color: #000080'>$highlightedCommands</span><br />
<br />
<span style='color: #800000'>"</div>"</span><br />
</div><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: "Courier New", Courier, mono; font-size: 12px; background-color: #000000; color: #FFC400; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='font-weight: bold;'>C:\Users\hillman\Documents\WindowsPowerShell\Utilities</span><br />
<span style='font-weight: bold;'></span><br />
<span style='font-weight: bold;'>PSH$ ls</span><br />
<span style='font-weight: bold;'></span><br />
<span style='font-weight: bold;'></span><br />
<span style='font-weight: bold;'> Directory: Microsoft.PowerShell.Core\FileSystem::C:\Users\hillman\Documents\WindowsPowerShell\Utilities</span><br />
<span style='font-weight: bold;'></span><br />
<span style='font-weight: bold;'></span><br />
<span style='font-weight: bold;'>Mode LastWriteTime Length Name</span><br />
<span style='font-weight: bold;'>---- ------------- ------ ----</span><br />
<span style='font-weight: bold;'>-a--- 07-Nov-07 4:05 PM 38117 Compile-Help.ps1</span><br />
<span style='font-weight: bold;'>-a--- 10-Nov-07 2:53 PM 8047 Highlight-1.0Syntax.ps1</span><br />
<span style='font-weight: bold;'>-a--- 10-Nov-07 3:09 PM 5182 Highlight-2.0Syntax.ps1</span><br />
<span style='font-weight: bold;'>-a--- 10-Nov-07 3:27 PM 1296 Highlight-Commands.ps1</span><br />
<span style='font-weight: bold;'>-a--- 09-Nov-07 2:49 PM 14741 Utilities.ps1</span><br />
<span style='font-weight: bold;'>
</div><br /><br />
Well, I hope these scripts come in handy for someone else out there.Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com1tag:blogger.com,1999:blog-4092806390106651827.post-12589796138640708532007-11-01T21:33:00.000-07:002007-11-04T21:00:11.262-08:00PowerShell and SubversionI try to use PowerShell for everything I can. Because we use Subversion for source control at the shop where I work, I have written a few PowerShell functions to make life a little easier when using Subversion at the command line.<br /><br />
Some might argue that most of this stuff can be done for you by <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a> or something similar. That may be true, but where's the fun in that? I was using TortoiseSVN when I first started playing around with PowerShell, but I found that using it forced me to keep a Windows Explorer window open a lot, which kept me away from the command line. I wanted to force myself to use PowerShell for as much as possible, so I uninstalled TortoiseSVN and I've never looked back.<br /><br />
The first function is called Get-SvnStatus. It uses the Subversion "status" command with the "--xml" switch and displays the status of versioned files and directories little more nicely. More importantly, the Status and Path are properties are on the objects output by this function. This means they can be used farther down the pipeline.<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000'>
<nobr><span style='color: #C86400'>function</span> Get-SvnStatus( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$filter</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"^(?!unversioned)"</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$NoFormat</span> )</nobr><br />
<nobr>{</nobr><br />
<nobr> <span style='color: #008000'># powershell chokes on "wc-status" and doesn't like two definitions of "item"</span></nobr><br />
<nobr> <span style='color: #404040'>[xml]</span><span style='color: #000080'>$status</span> <span style='color: #C86400'>=</span> ( ( svn status <span style='color: #C86400'>-</span>-xml ) <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"wc-status"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"svnstatus"</span> ) <span style='color: #C86400'>`</span></nobr><br />
<nobr> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"item="</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"itemstatus="</span></nobr><br />
<nobr> </nobr><br />
<nobr> <span style='color: #000080'>$statusObjects</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$status</span><span style='color: #C86400'>.</span>status<span style='color: #C86400'>.</span>target<span style='color: #C86400'>.</span>entry <span style='color: #C86400'>|</span> <span style='color: #C86400'>Where-Object</span> { </nobr><br />
<nobr> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>svnstatus<span style='color: #C86400'>.</span>itemstatus <span style='color: #C86400'>-match</span> <span style='color: #000080'>$filter</span> </nobr><br />
<nobr> } <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {</nobr><br />
<nobr> <span style='color: #000080'>$_</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Select-Object</span> @{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Status"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>svnstatus<span style='color: #C86400'>.</span>itemstatus } }<span style='color: #C86400'>,</span> </nobr><br />
<nobr> @{ Name <span style='color: #C86400'>=</span> <span style='color: #800000'>"Path"</span>; Expression <span style='color: #C86400'>=</span> { <span style='color: #C86400'>Resolve-Path</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>path } }</nobr><br />
<nobr> } <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> Status</nobr><br />
<nobr> </nobr><br />
<nobr> <span style='color: #C86400'>if</span> ( <span style='color: #000080'>$NoFormat</span> )</nobr><br />
<nobr> {</nobr><br />
<nobr> <span style='color: #000080'>$statusObjects</span></nobr><br />
<nobr> }</nobr><br />
<nobr> <span style='color: #C86400'>else</span></nobr><br />
<nobr> {</nobr><br />
<nobr> <span style='color: #000080'>$statusObjects</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Format-Table</span> -Auto</nobr><br />
<nobr> }</nobr><br />
<nobr>}</nobr><br />
</div>
<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: "Courier New", Courier, mono; font-size: 12px; background-color: #000000; color: #FFC400'>
<nobr><span style='font-weight: bold;'>D:\Subversion\projects</span></nobr><br />
<nobr><span style='font-weight: bold;'></span></nobr><br />
<nobr><span style='font-weight: bold;'>PSH$ Get-SvnStatus</span></nobr><br />
<nobr><span style='font-weight: bold;'></span></nobr><br />
<nobr><span style='font-weight: bold;'>Status Path</span></nobr><br />
<nobr><span style='font-weight: bold;'>------ ----</span></nobr><br />
<nobr><span style='font-weight: bold;'>modified D:\Subversion\projects\KickButtApp\KickButtApp.cpp</span></nobr><br />
<nobr><span style='font-weight: bold;'>modified D:\Subversion\projects\KickButtApp\KickButtApp.h</span></nobr><br />
</div><br /><br />
The filter can be any regular expression to match against the status of the item. The default filter doesn't allow unversioned files through. The "NoFormat" switch is there in case the Status or Path properties of the objects created need to be used down the pipeline.<br /><br />
The next function is Compare-SvnRevision. It uses Subversion's "cat" command to get a copy of a file at a specified revision to compare with your current working copy. The default value for the revision is "HEAD", which will get the latest version in the repository.<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000'>
<nobr><span style='color: #C86400'>function</span> Compare-SvnRevision( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$path</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[string]</span> <span style='color: #000080'>$revision</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"HEAD"</span> )</nobr><br />
<nobr>{</nobr><br />
<nobr> <span style='color: #000080'>$url</span> <span style='color: #C86400'>=</span> Get-SvnUrl <span style='color: #000080'>$path</span></nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$fileInfo</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>New-Object</span> System<span style='color: #C86400'>.</span>IO<span style='color: #C86400'>.</span>FileInfo <span style='color: #000080'>$path</span></nobr><br />
<nobr></nobr><br />
<nobr> svn cat -r <span style='color: #000080'>$revision</span> <span style='color: #000080'>$url</span> <span style='color: #C86400'>></span> <span style='color: #800000'>"TEMP - $($fileInfo.Name)"</span></nobr><br />
<nobr></nobr><br />
<nobr> WinMerge <span style='color: #000080'>$path</span> <span style='color: #800000'>"TEMP - $($fileInfo.Name)"</span></nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$winMerge</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Process</span> WinMerge</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>while</span> ( <span style='color: #000080'>$winMerge</span> <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$null</span> )</nobr><br />
<nobr> {</nobr><br />
<nobr> <span style='color: #000080'>$winMerge</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Process</span> WinMerge</nobr><br />
<nobr> }</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$winMerge</span><span style='color: #C86400'>.</span>WaitForExit()</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>Remove-Item</span> <span style='color: #800000'>"TEMP - $($fileInfo.Name)"</span></nobr><br />
<nobr>}</nobr><br />
</div><br /><br />
This function uses <a href="http://winmerge.org/">WinMerge</a> to perform the comparison, which is my favorite two-way merge tool. It also assumes WinMerge is in $env:Path.<br /><br />
The next function, Resolve-SvnConflicts, uses Get-SvnStatus to get all the files in a "conflicted" state after an update, commit, or merge. It then uses <a href="http://www.sourcegear.com/diffmerge/index.html">DiffMerge</a> to do a three-way merge of the base revision, your working copy, and the head revision. You are prompted to indicate if you were able to resolve conflicts, and if you have, the "resolved" command is performed on the file. This function assumes DiffMerge is in $env:Path.<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000'>
<nobr><span style='color: #C86400'>function</span> Resolve-SvnConflicts</nobr><br />
<nobr>{</nobr><br />
<nobr> Get-SvnStatus <span style='color: #800000'>"conflicted"</span> -NoFormat <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> { </nobr><br />
<nobr> <span style='color: #000080'>$file</span> <span style='color: #C86400'>=</span> ( <span style='color: #C86400'>Resolve-Path</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Path )</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>Write-Output</span> <span style='color: #800000'>"Merging $( $file )..."</span></nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$baseRevision</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$headRevision</span> <span style='color: #C86400'>=</span> ( <span style='color: #C86400'>Get-ChildItem</span> <span style='color: #800000'>"$file.r*"</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> )</nobr><br />
<nobr></nobr><br />
<nobr> DiffMerge /t1 <span style='color: #800000'>"Base Revision"</span> /t2 <span style='color: #800000'>"Working Copy"</span> /t3 <span style='color: #800000'>"Head Revision"</span> <span style='color: #C86400'>`</span></nobr><br />
<nobr> <span style='color: #000080'>$baseRevision</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"$file.mine"</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$headRevision</span></nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$diffMerge</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Process</span> DiffMerge</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>while</span> ( <span style='color: #000080'>$diffMerge</span> <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$null</span> )</nobr><br />
<nobr> {</nobr><br />
<nobr> <span style='color: #000080'>$diffMerge</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Get-Process</span> DiffMerge</nobr><br />
<nobr> }</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$diffMerge</span><span style='color: #C86400'>.</span>WaitForExit()</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>Write-Output</span> <span style='color: #800000'>"Conflicts resolved? [yes, no]"</span></nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$resolved</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Read-Host</span></nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>if</span> ( <span style='color: #000080'>$resolved</span> <span style='color: #C86400'>-imatch</span> <span style='color: #800000'>"^y(es)?$"</span> )</nobr><br />
<nobr> {</nobr><br />
<nobr> <span style='color: #C86400'>Copy-Item</span> <span style='color: #800000'>"$file.mine"</span> <span style='color: #000080'>$file</span> -Force</nobr><br />
<nobr> svn resolved <span style='color: #000080'>$file</span></nobr><br />
<nobr> }</nobr><br />
<nobr> }</nobr><br />
<nobr>}</nobr><br />
</div><br /><br />
These next two functions just use the Subversion "info" command with the "--xml" switch to get the URL or revision for a versioned file. They both have a switch parameter to indicate if you want the result to be put on the clipboard. To put these items on the clipboard, I use a Cmdlet I wrote myself, but the <a href="http://www.codeplex.com/PowerShellCX">PowerShell Community Extensions</a> have a Cmdlet with the same name that will do the same thing and, apparently, more.<br /><br />
<div style='width: 100%; /*height: 100%;*/ overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000'>
<nobr><span style='color: #C86400'>function</span> Get-SvnUrl( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$path</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"."</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$Clipboard</span> )</nobr><br />
<nobr>{</nobr><br />
<nobr> <span style='color: #000080'>$url</span> <span style='color: #C86400'>=</span> ( <span style='color: #404040'>[xml]</span>( svn info <span style='color: #C86400'>-</span>-xml <span style='color: #000080'>$path</span> ) )<span style='color: #C86400'>.</span>info<span style='color: #C86400'>.</span>entry<span style='color: #C86400'>.</span>url</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>if</span> ( <span style='color: #000080'>$Clipboard</span> )</nobr><br />
<nobr> {</nobr><br />
<nobr> <span style='color: #C86400'>Set-Clipboard</span> <span style='color: #000080'>$url</span> </nobr><br />
<nobr> }</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$url</span></nobr><br />
<nobr>}</nobr><br />
<nobr></nobr><br />
<nobr><span style='color: #C86400'>function</span> Get-SvnRevision( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$path</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"."</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$Clipboard</span> )</nobr><br />
<nobr>{</nobr><br />
<nobr> <span style='color: #000080'>$revision</span> <span style='color: #C86400'>=</span> ( <span style='color: #404040'>[xml]</span>( svn info <span style='color: #C86400'>-</span>-xml <span style='color: #000080'>$path</span> ) )<span style='color: #C86400'>.</span>info<span style='color: #C86400'>.</span>entry<span style='color: #C86400'>.</span>revision</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #C86400'>if</span> ( <span style='color: #000080'>$Clipboard</span> )</nobr><br />
<nobr> {</nobr><br />
<nobr> <span style='color: #C86400'>Set-Clipboard</span> <span style='color: #000080'>$revision</span> </nobr><br />
<nobr> }</nobr><br />
<nobr></nobr><br />
<nobr> <span style='color: #000080'>$revision</span></nobr><br />
<nobr>}</nobr><br />
</div><br /><br />
Well, there you have it. I use these functions every day, so I hope sharing them will make someone else's life a little easier.Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com2tag:blogger.com,1999:blog-4092806390106651827.post-59110837178260764382007-10-12T17:44:00.000-07:002009-03-09T08:30:07.208-07:00PowerShell HelpI personally think the help that comes with Windows PowerShell is very good. I love having access to everything right from the command line. Accessing the help from the command line just falls short in convenience if you would like to switch quickly between more than one topic, or if the help topic you are reading is particularly long.<br /><br />
Inspired in part by the <a href="http://www.microsoft.com/technet/scriptcenter/topics/winpsh/pschm.mspx">Windows PowerShell Graphical Help File</a>, I wrote a PowerShell script that uses the PowerShell XML help files to generate HTML help topics that are then compiled into a CHM with Html Help Workshop. The advantage of the resulting file over the Windows PowerShell Graphical Help File is that help is generated for all Cmdlets installed on your system, not just the core Cmdlets that come with Windows PowerShell. The help manual also includes help for PSProviders and all of the "about" topics. The original formatting for the "about" topics is preserved, so they don't look quite as nice as the other topics. I tested this after installing the <a href="http://www.codeplex.com/PowerShellCX">PowerShell Community Extensions</a> and the <a href="http://www.quest.com/activeroles-server/arms.aspx">PowerShell cmdlets for Active Directory by Quest Software</a>, even though I personally don't use either snap-in. I would be interested to hear how the help looks for any other snap-ins available out there.<br /><br />
The resulting CHM is fully searchable, and all Cmdlet and "about" topic names link to their topic, so jumping from one topic to another is much easier.<br />
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgZn8Kw7j9Kb1DSBaWETHT9lDPt24SUnJAy5pstAAET12lvSILnoVg1cjG0iQsjnAZSbtGMIPMVZ-2cxJ6kQDodsmsQWALC9qW2a0llFylmxmUN06h2Wrv5Oo1sXnn7Z_oEnvwM1XWh5g/s1600-h/pshelp.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgZn8Kw7j9Kb1DSBaWETHT9lDPt24SUnJAy5pstAAET12lvSILnoVg1cjG0iQsjnAZSbtGMIPMVZ-2cxJ6kQDodsmsQWALC9qW2a0llFylmxmUN06h2Wrv5Oo1sXnn7Z_oEnvwM1XWh5g/s320/pshelp.png" alt="" id="BLOGGER_PHOTO_ID_5121406069142924370" border="0" /></a>
The script generates all of the HTML topic files, a CSS file, an Html Help Contents file, and an Html Help Project file. The CHM is automatically compiled at the end of the script, but it would be fairly easy to update these files and then re-create the manual if you don't, for example, like the color scheme I chose.<br />
Here is the script:<br /><br />
<div style='width: 100%; height: 400px; overflow: auto; font-family: Consolas, "Courier New", Courier, mono; font-size: 12px; background-color: #DDDDDD; color: #000000; padding: 2px 2px 2px 2px; white-space: nowrap'>
<span style='color: #008000'># Compile-Help.ps1</span><br />
<span style='color: #008000'># by Jeff Hillman</span><br />
<span style='color: #008000'>#</span><br />
<span style='color: #008000'># this script uses the text and XML PowerShell help files to generate HTML help</span><br />
<span style='color: #008000'># for all PowerShell Cmdlets, PSProviders, and "about" topics. the help topics </span><br />
<span style='color: #008000'># are compiled into a .chm file using HTML Help Workshop.</span><br />
<br />
<span style='color: #C86400'>param</span>( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$outDirectory</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>".\PSHelp"</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[switch]</span> <span style='color: #000080'>$GroupByPSSnapIn</span> )<br />
<br />
<span style='color: #C86400'>function</span> Html-Encode( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$value</span> )<br />
{<br />
<span style='color: #008000'># System.Web.HttpUtility.HtmlEncode() doesn't quite get everything, and </span><br />
<span style='color: #008000'># I don't want to load the System.Web assembly just for this. I'm sure </span><br />
<span style='color: #008000'># I missed something here, but these are the characters I saw that needed </span><br />
<span style='color: #008000'># to be encoded most often</span><br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$value</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"&(?![\w#]+;)"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&amp;"</span><br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$value</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"<(?!!--)"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&lt;"</span><br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$value</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"(?<!--)>"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&gt;"</span><br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$value</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"’"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&#39;"</span><br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$value</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>'["“”]'</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"&quot;"</span><br />
<br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$value</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"\n"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<br />"</span><br />
<br />
<span style='color: #000080'>$value</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Capitalize-Words( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$value</span> )<br />
{<br />
<span style='color: #000080'>$capitalizedString</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #008000'># convert the string to lower case and split it into individual words. for each one,</span><br />
<span style='color: #008000'># capitalize the first character, and append it to the converted string</span><br />
<span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Split( <span style='color: #000080'>$value</span><span style='color: #C86400'>.</span>ToLower()<span style='color: #C86400'>,</span> <span style='color: #800000'>"\s"</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>ForEach-Object</span> {<br />
<span style='color: #000080'>$capitalizedString</span> <span style='color: #C86400'>+=</span> ( <span style='color: #404040'>[string]</span><span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Chars( <span style='color: #800000'>0</span> ) )<span style='color: #C86400'>.</span>ToUpper() <span style='color: #C86400'>+</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>SubString( <span style='color: #800000'>1</span> ) <span style='color: #C86400'>+</span> <span style='color: #800000'>" "</span><br />
}<br />
<br />
<span style='color: #000080'>$capitalizedString</span><span style='color: #C86400'>.</span>Trim()<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-ParagraphedHtml( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$xmlText</span> )<br />
{<br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$xmlText</span> <span style='color: #C86400'>-match</span> <span style='color: #800000'>"<(\w+:)?para"</span> )<br />
{<br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$options</span> <span style='color: #C86400'>=</span> [System<span style='color: #C86400'>.</span>Text<span style='color: #C86400'>.</span>RegularExpressions<span style='color: #C86400'>.</span>RegexOptions]<span style='color: #C86400'>::</span>Singleline<br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$match</span> <span style='color: #C86400'>in</span> <span style='color: #404040'>[regex]</span><span style='color: #C86400'>::</span>Matches( <span style='color: #000080'>$xmlText</span><span style='color: #C86400'>,</span> <br />
<span style='color: #800000'>"<(?:\w+:)?para[^>]*>(?<Text>.*?)</(?:\w+:)?para>"</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$options</span> ) )<br />
{<br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<p>$( Html-Encode $match.Groups[ 'Text' ].Value )</p>"</span> <br />
}<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$value</span> <span style='color: #C86400'>=</span> Html-Encode <span style='color: #000080'>$xmlText</span><br />
}<br />
<br />
<span style='color: #000080'>$value</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-SyntaxHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$syntaxXml</span> )<br />
{<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #008000'># generate the HTML for each form of the Cmdlet syntax</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$syntaxItem</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$syntaxXml</span><span style='color: #C86400'>.</span>syntax<span style='color: #C86400'>.</span>syntaxItem )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<br /><br />`n"</span><br />
}<br />
<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" $( $syntaxItem.name.get_InnerText().Trim() ) "</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$syntaxItem</span><span style='color: #C86400'>.</span>parameter )<br />
{<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$parameter</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$syntaxItem</span><span style='color: #C86400'>.</span>parameter )<br />
{<br />
<span style='color: #000080'>$required</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[bool]</span><span style='color: #C86400'>::</span>Parse( <span style='color: #000080'>$parameter</span><span style='color: #C86400'>.</span>required )<br />
<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"<nobr>[-$( $parameter.name.get_InnerText().Trim() )"</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$required</span> )<br />
{<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"]"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$parameter</span><span style='color: #C86400'>.</span>parameterValue )<br />
{<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <br />
<span style='color: #800000'>" &lt;$( $parameter.parameterValue.get_InnerText().Trim() )&gt;"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>!</span><span style='color: #000080'>$required</span> )<br />
{<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"]"</span><br />
}<br />
<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"</nobr> "</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$syntaxHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <nobr>[&lt;CommonParameters&gt;]</nobr>"</span><br />
}<br />
<br />
<span style='color: #000080'>$syntaxHtml</span><span style='color: #C86400'>.</span>Trim()<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-ParameterHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$parameterXml</span> )<br />
{<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #008000'># generate HTML for each parameter</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$parameter</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$parameterXml</span><span style='color: #C86400'>.</span>parameters<span style='color: #C86400'>.</span>parameter )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br /><br />`n"</span><br />
}<br />
<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <br />
<span style='color: #800000'>" <nobr><span class=`"boldtext`">-$( $parameter.name.get_InnerText().Trim() )"</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$parameter</span><span style='color: #C86400'>.</span>parameterValue )<br />
{<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" &lt;$( $parameter.parameterValue.get_InnerText().Trim() )&gt;"</span><br />
}<br />
<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"</span></nobr>`n"</span><br />
<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $parameter.description.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$parameter</span><span style='color: #C86400'>.</span>possibleValues )<br />
{<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$possibleValue</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$parameter</span><span style='color: #C86400'>.</span>possibleValues<span style='color: #C86400'>.</span>possibleValue )<br />
{<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> $( $possibleValue.value.Trim() )<br /></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$possibleValue</span><span style='color: #C86400'>.</span>description<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $possibleValue.description.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
}<br />
<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <table class="parametertable"></span><br />
<span style='color: #800000'> <tr></span><br />
<span style='color: #800000'> <td>Required</td></span><br />
<span style='color: #800000'> <td>$( $parameter.required )</td></span><br />
<span style='color: #800000'> </tr></span><br />
<span style='color: #800000'> <tr></span><br />
<span style='color: #800000'> <td>Position</td></span><br />
<span style='color: #800000'> <td>$( $parameter.position )</td></span><br />
<span style='color: #800000'> </tr></span><br />
<span style='color: #800000'> <tr></span><br />
<span style='color: #800000'> <td>Accepts pipeline input</td></span><br />
<span style='color: #800000'> <td>$( $parameter.pipelineInput )</td></span><br />
<span style='color: #800000'> </tr></span><br />
<span style='color: #800000'> <tr></span><br />
<span style='color: #800000'> <td>Accepts wildcard characters</td></span><br />
<span style='color: #800000'> <td>$( $parameter.globbing )</td></span><br />
<span style='color: #800000'> </tr></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$parameter</span><span style='color: #C86400'>.</span>defaultValue )<br />
{<br />
<span style='color: #C86400'>if</span>( <span style='color: #000080'>$parameter</span><span style='color: #C86400'>.</span>defaultValue<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <tr></span><br />
<span style='color: #800000'> <td>Default Value</td></span><br />
<span style='color: #800000'> <td>$( $parameter.defaultValue.get_InnerText().Trim() )</td></span><br />
<span style='color: #800000'> </tr></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> </table></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br /><br />`n"</span><br />
}<br />
<br />
<span style='color: #000080'>$parameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <nobr><span class="boldtext">&lt;CommonParameters&gt;</span></nobr></span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> For more information about common parameters, type "Get-Help about_commonparameters".</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$parameterHtml</span><span style='color: #C86400'>.</span>Trim()<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-InputHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$inputXml</span> )<br />
{<br />
<span style='color: #000080'>$inputHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$inputCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<br />
<span style='color: #008000'># generate HTML for each input type</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$inputType</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$inputXml</span><span style='color: #C86400'>.</span>inputTypes<span style='color: #C86400'>.</span>inputType )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$inputHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$inputHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br /><br />`n"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$inputType</span><span style='color: #C86400'>.</span>type<span style='color: #C86400'>.</span>name<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> <span style='color: #C86400'>-or</span> <br />
<span style='color: #000080'>$inputType</span><span style='color: #C86400'>.</span>type<span style='color: #C86400'>.</span>description<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$inputHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" $( $inputType.type.name.get_InnerText().Trim() )`n"</span><br />
<span style='color: #000080'>$inputHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $inputType.type.description.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #000080'>$inputCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$inputHtml</span><span style='color: #C86400'>.</span>Trim()<br />
<span style='color: #000080'>$inputCount</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-ReturnHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$returnXml</span> )<br />
{<br />
<span style='color: #000080'>$returnHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$returnCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<br />
<span style='color: #008000'># generate HTML for each return value</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$returnValue</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$returnXml</span><span style='color: #C86400'>.</span>returnValues<span style='color: #C86400'>.</span>returnValue )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$returnHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$returnHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br /><br />`n"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$returnValue</span><span style='color: #C86400'>.</span>type<span style='color: #C86400'>.</span>name<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> <span style='color: #C86400'>-or</span> <br />
<span style='color: #000080'>$returnValue</span><span style='color: #C86400'>.</span>type<span style='color: #C86400'>.</span>description<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$returnHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" $( $returnValue.type.name.get_InnerText().Trim() )`n"</span><br />
<span style='color: #000080'>$returnHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $returnValue.type.description.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #000080'>$returnCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$returnHtml</span><span style='color: #C86400'>.</span>Trim()<br />
<span style='color: #000080'>$returnCount</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-ExampleHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$exampleXml</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$exampleTotalCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<span style='color: #000080'>$exampleCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$example</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$exampleXml</span><span style='color: #C86400'>.</span>examples<span style='color: #C86400'>.</span>example )<br />
{<br />
<span style='color: #000080'>$exampleTotalCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
<br />
<span style='color: #008000'># generate HTML for each example</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$example</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$exampleXml</span><span style='color: #C86400'>.</span>examples<span style='color: #C86400'>.</span>example )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$example</span><span style='color: #C86400'>.</span>code <span style='color: #C86400'>-and</span> <span style='color: #000080'>$example</span><span style='color: #C86400'>.</span>code<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br />`n"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$exampleTotalCount</span> <span style='color: #C86400'>-gt</span> <span style='color: #800000'>1</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <br />
<span style='color: #800000'>" <nobr><span class=`"boldtext`">Example $( $exampleCount + 1 )</span></nobr>`n"</span><br />
}<br />
<br />
<span style='color: #000080'>$exampleCodeHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"$( Html-Encode $example.introduction.get_InnerText().Trim() )"</span> <span style='color: #C86400'>+</span> <br />
<span style='color: #800000'>"$( Html-Encode $example.code.get_InnerText().Trim() )"</span><br />
<br />
<span style='color: #000080'>$foundFirstPara</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$example</span><span style='color: #C86400'>.</span>remarks<span style='color: #C86400'>.</span>get_InnerXml() <span style='color: #C86400'>-notmatch</span> <span style='color: #800000'>"-----------"</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <div class=`"syntaxregion`">$exampleCodeHtml</div>`n"</span><br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$para</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$example</span><span style='color: #C86400'>.</span>remarks<span style='color: #C86400'>.</span>para )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$para</span><span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #008000'># the first para is generally the description of the example.</span><br />
<span style='color: #008000'># other para tags usually contain sample output</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>!</span><span style='color: #000080'>$foundFirstPara</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $( Html-Encode $para.get_InnerText().Trim() )</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #000080'>$foundFirstPara</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <pre class="syntaxregion">$( $( ( Html-Encode $para.get_InnerText().Trim() ) -replace "<br />", "`n" ) )</pre></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
}<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$descriptionHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$getDivider</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
<span style='color: #000080'>$getDescription</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$para</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$example</span><span style='color: #C86400'>.</span>remarks<span style='color: #C86400'>.</span>para )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$para</span><span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$para</span><span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-eq</span> <span style='color: #800000'>"Description"</span> )<br />
{<br />
<span style='color: #000080'>$getDivider</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
}<br />
<span style='color: #C86400'>elseif</span>( <span style='color: #000080'>$getDivider</span> )<br />
{<br />
<span style='color: #000080'>$getDivider</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
<span style='color: #000080'>$getDescription</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$true</span><br />
}<br />
<span style='color: #C86400'>elseif</span>( <span style='color: #000080'>$getDescription</span> )<br />
{<br />
<span style='color: #000080'>$descriptionHtml</span> <span style='color: #C86400'>=</span> ( Html-Encode <span style='color: #000080'>$para</span><span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() )<br />
<span style='color: #000080'>$getDescription</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$false</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$exampleCodeHtml</span> <span style='color: #C86400'>+=</span> ( Html-Encode <span style='color: #000080'>$para</span><span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"<br />"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"`n"</span> )<br />
}<br />
}<br />
}<br />
<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <div class=`"syntaxregion`">$exampleCodeHtml</div>`n"</span><br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $descriptionHtml</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #000080'>$exampleCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$exampleHtml</span><span style='color: #C86400'>.</span>Trim()<br />
<span style='color: #000080'>$exampleCount</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-TaskExampleHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$exampleXml</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$exampleCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<span style='color: #000080'>$exampleTotalCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$example</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$exampleXml</span><span style='color: #C86400'>.</span>examples<span style='color: #C86400'>.</span>example )<br />
{<br />
<span style='color: #000080'>$exampleTotalCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
<br />
<span style='color: #008000'># generate HTML for each example</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$example</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$exampleXml</span><span style='color: #C86400'>.</span>examples<span style='color: #C86400'>.</span>example )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br />`n"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$exampleTotalCount</span> <span style='color: #C86400'>-gt</span> <span style='color: #800000'>1</span> )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <nobr><span class=`"boldtext`">Example $( $exampleCount + 1 )</span></nobr>`n"</span><br />
}<br />
<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <div>$( Get-ParagraphedHtml $example.introduction.get_InnerXml().Trim() )</div>`n"</span><br />
<br />
<span style='color: #000080'>$exampleCodeHtml</span> <span style='color: #C86400'>=</span> ( Html-Encode <span style='color: #000080'>$example</span><span style='color: #C86400'>.</span>code<span style='color: #C86400'>.</span>Trim() ) <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"<br />"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"`n"</span><br />
<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <pre class=`"syntaxregion`">$exampleCodeHtml</pre>"</span><br />
<br />
<span style='color: #000080'>$exampleHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <div>$( Get-ParagraphedHtml $example.remarks.get_InnerXml().Trim() )</div>`n"</span><br />
<br />
<span style='color: #000080'>$exampleCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
<br />
<span style='color: #000080'>$exampleHtml</span><span style='color: #C86400'>.</span>Trim()<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-LinkHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$linkXml</span> )<br />
{<br />
<span style='color: #000080'>$linkHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$linkCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<span style='color: #000080'>$helpTopicNames</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$helpTopicNameArray</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>ToUpper() }<br />
<br />
<span style='color: #008000'># generate HTML for each related link</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$navigationLink</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$linkXml</span><span style='color: #C86400'>.</span>relatedLinks<span style='color: #C86400'>.</span>navigationLink )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$navigationLink</span><span style='color: #C86400'>.</span>linkText )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$navigationLink</span><span style='color: #C86400'>.</span>linkText <span style='color: #C86400'>-is</span> [object[]] )<br />
{<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$linkText</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$navigationLink</span><span style='color: #C86400'>.</span>linkText )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$helpTopicNames</span> <span style='color: #C86400'>-contains</span> <span style='color: #000080'>$linkText</span><span style='color: #C86400'>.</span>Trim()<span style='color: #C86400'>.</span>ToUpper() )<br />
{<br />
<span style='color: #000080'>$linkHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" $( $linkText.Trim() )<br />`n"</span><br />
<span style='color: #000080'>$linkCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
}<br />
}<br />
<span style='color: #C86400'>elseif</span> ( <span style='color: #000080'>$helpTopicNames</span> <span style='color: #C86400'>-contains</span> <span style='color: #000080'>$navigationLink</span><span style='color: #C86400'>.</span>linkText<span style='color: #C86400'>.</span>Trim()<span style='color: #C86400'>.</span>ToUpper() )<br />
{<br />
<span style='color: #000080'>$linkHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" $( $navigationLink.linkText.Trim() )<br />`n"</span><br />
<span style='color: #000080'>$linkCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
}<br />
}<br />
<br />
<span style='color: #000080'>$linkHtml</span><span style='color: #C86400'>.</span>Trim()<br />
<span style='color: #000080'>$linkCount</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-TaskHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$taskXml</span> )<br />
{<br />
<span style='color: #000080'>$taskHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$taskCount</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>0</span><br />
<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$task</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$taskXml</span><span style='color: #C86400'>.</span>tasks<span style='color: #C86400'>.</span>task )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$taskHtml</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$taskHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br />`n"</span><br />
}<br />
<br />
<span style='color: #000080'>$taskHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <nobr><span class=`"boldtext`">Task:</span> $( $task.title.Trim() )</nobr>`n"</span><br />
<br />
<span style='color: #000080'>$taskDescriptionHtml</span> <span style='color: #C86400'>=</span> ( Get-ParagraphedHtml <span style='color: #000080'>$task</span><span style='color: #C86400'>.</span>description<span style='color: #C86400'>.</span>get_InnerXml()<span style='color: #C86400'>.</span>Trim() )<br />
<br />
<span style='color: #000080'>$taskHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <div id=`"contenttext`">$taskDescriptionHtml</div>`n"</span><br />
<br />
<span style='color: #008000'># add the example sections</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$task</span><span style='color: #C86400'>.</span>examples )<br />
{<br />
<span style='color: #000080'>$taskHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $( Get-TaskExampleHtml ( [xml]$task.examples.get_OuterXml() ) )</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> </span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #000080'>$taskCount</span><span style='color: #C86400'>+</span><span style='color: #C86400'>+</span><br />
}<br />
<br />
<span style='color: #000080'>$taskHtml</span><span style='color: #C86400'>.</span>Trim()<br />
<span style='color: #000080'>$taskCount</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Get-DynamicParameterHtml( <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$dynamicParameterXml</span> )<br />
{<br />
<span style='color: #000080'>$dynamicParameterHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #008000'># generate HTML for each dynamic parameter</span><br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$dynamicParameter</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$dynamicParameterXml</span><span style='color: #C86400'>.</span>dynamicparameters<span style='color: #C86400'>.</span>dynamicparameter )<br />
{<br />
<span style='color: #000080'>$dynamicParameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <nobr><span class=`"boldtext`">-$( $dynamicParameter.name.Trim() )"</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$dynamicParameter</span><span style='color: #C86400'>.</span>type )<br />
{<br />
<span style='color: #000080'>$dynamicParameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" &lt;$( $dynamicParameter.type.name.Trim() )&gt;"</span><br />
}<br />
<br />
<span style='color: #000080'>$dynamicParameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>"</span></nobr>`n"</span><br />
<br />
<span style='color: #000080'>$dynamicParameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $( Html-Encode $dynamicParameter.description.Trim() )</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$dynamicParameter</span><span style='color: #C86400'>.</span>possiblevalues )<br />
{<br />
<span style='color: #C86400'>foreach</span> ( <span style='color: #000080'>$possibleValue</span> <span style='color: #C86400'>in</span> <span style='color: #000080'>$dynamicParameter</span><span style='color: #C86400'>.</span>possiblevalues<span style='color: #C86400'>.</span>possiblevalue )<br />
{<br />
<span style='color: #000080'>$dynamicParameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <span class=`"boldtext`">$( $possibleValue.value )</span></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $possibleValue.description.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$dynamicParameterHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> <span class=`"boldtext`">Cmdlets Supported</span></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $( Html-Encode $dynamicParameter.cmdletsupported.Trim() )</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #000080'>$dynamicParameterHtml</span><span style='color: #C86400'>.</span>Trim()<br />
}<br />
<br />
<span style='color: #C86400'>function</span> Write-AboutTopic( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$topicName</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[string]</span> <span style='color: #000080'>$topicPath</span> )<br />
{<br />
<span style='color: #008000'># just dump the contents of the about topic exactly as it is. the only changes needed</span><br />
<span style='color: #008000'># are to encode the special HTML characters and add topic links</span><br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'><html></span><br />
<span style='color: #800000'> <head></span><br />
<span style='color: #800000'> <link rel="stylesheet" type="text/css" href="powershell.css" /></span><br />
<span style='color: #800000'> <title>About $( Capitalize-Words ( $topicName -replace "(about)?_", " " ).Trim() )</title></span><br />
<span style='color: #800000'> </head></span><br />
<span style='color: #800000'> <body></span><br />
<span style='color: #800000'> <div id="topicheading"></span><br />
<span style='color: #800000'> <div id="topictitle">PowerShell Help</div></span><br />
<span style='color: #800000'> About $( Capitalize-Words ( $topicName -replace "(about)?_", " " ).Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <pre></span><br />
<span style='color: #800000'>$( ( Html-Encode ( [string]::Join( [Environment]::NewLine, ( Get-Content -Path $topicPath ) ) ) ) -replace "<br />" )</span><br />
<span style='color: #800000'> </pre></span><br />
<span style='color: #800000'> </body></span><br />
<span style='color: #800000'></html></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>=</span> Add-Links <span style='color: #000080'>$topicName</span> <span style='color: #000080'>$topicHtml</span><br />
<br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #800000'>"$outDirectory\Topics\$topicName.html"</span> -Encoding Ascii -Input <span style='color: #000080'>$topicHtml</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Write-ProviderTopic( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$providerFullName</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$providerXml</span> )<br />
{<br />
<span style='color: #000080'>$providerName</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$providerXml</span><span style='color: #C86400'>.</span>providerhelp<span style='color: #C86400'>.</span>Name<span style='color: #C86400'>.</span>Trim()<br />
<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'><html></span><br />
<span style='color: #800000'> <head></span><br />
<span style='color: #800000'> <link rel="stylesheet" type="text/css" href="powershell.css" /></span><br />
<span style='color: #800000'> <title>$providerName Help</title></span><br />
<span style='color: #800000'> </head></span><br />
<span style='color: #800000'> <body></span><br />
<span style='color: #800000'> <div id="topicheading"></span><br />
<span style='color: #800000'> <div id="topictitle">PowerShell Help</div></span><br />
<span style='color: #800000'> $providerName Provider</span><br />
<span style='color: #800000'> <div style="text-align: right; padding-right: 3px;"></span><br />
<span style='color: #800000'> $( $providerFullName -replace "^\w+\." )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <div class="categorytitle">Drives</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $providerXml.providerhelp.drives.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <div class="categorytitle">Synopsis</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p>$( Html-Encode $providerXml.providerhelp.synopsis.Trim() )</p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Description</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $providerXml.providerhelp.detaileddescription.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$providerXml</span><span style='color: #C86400'>.</span>providerhelp<span style='color: #C86400'>.</span>capabilities<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Capabilities</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $providerXml.providerhelp.capabilities.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #000080'>$taskHtml</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$taskCount</span> <span style='color: #C86400'>=</span> Get-TaskHtml( <span style='color: #000080'>$providerXml</span><span style='color: #C86400'>.</span>providerhelp<span style='color: #C86400'>.</span>tasks<span style='color: #C86400'>.</span>get_OuterXml() )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$taskCount</span> <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Task$( if ( $taskCount -gt 1 ) { "s" } )</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $taskHtml</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$providerXml</span><span style='color: #C86400'>.</span>providerhelp<span style='color: #C86400'>.</span>dynamicparameters )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Dynamic Parameters</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-DynamicParameterHtml( $providerXml.providerhelp.dynamicparameters.get_OuterXml() ) )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$providerXml</span><span style='color: #C86400'>.</span>providerhelp<span style='color: #C86400'>.</span>notes<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Notes</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p>$( Html-Encode $providerXml.providerhelp.notes.Trim() )</p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$providerXml</span><span style='color: #C86400'>.</span>providerhelp<span style='color: #C86400'>.</span>relatedlinks <span style='color: #C86400'>-is</span> <span style='color: #404040'>[string]</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Related Links</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p>$( Html-Encode $providerXml.providerhelp.relatedlinks.Trim() )</p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'>"@</span> <br />
}<br />
<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> </body></span><br />
<span style='color: #800000'></html> </span><br />
<span style='color: #800000'>"@</span> <br />
<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>=</span> Add-Links <span style='color: #000080'>$providerName</span> <span style='color: #000080'>$topicHtml</span><br />
<br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #800000'>"$outDirectory\Topics\$providerFullName.html"</span> -Encoding Ascii -Input <span style='color: #000080'>$topicHtml</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Write-CmdletTopic( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$cmdletFullName</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[xml]</span> <span style='color: #000080'>$cmdletXml</span> )<br />
{<br />
<span style='color: #000080'>$cmdletName</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>details<span style='color: #C86400'>.</span>name<span style='color: #C86400'>.</span>Trim()<br />
<br />
<span style='color: #008000'># add the heading, syntax section, and description</span><br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'><html></span><br />
<span style='color: #800000'> <head></span><br />
<span style='color: #800000'> <link rel="stylesheet" type="text/css" href="powershell.css" /></span><br />
<span style='color: #800000'> <title>$cmdletName Help</title></span><br />
<span style='color: #800000'> </head></span><br />
<span style='color: #800000'> <body></span><br />
<span style='color: #800000'> <div id="topicheading"></span><br />
<span style='color: #800000'> <div id="topictitle">PowerShell Help</div></span><br />
<span style='color: #800000'> $cmdletName Cmdlet</span><br />
<span style='color: #800000'> <div style="text-align: right; padding-right: 3px;"></span><br />
<span style='color: #800000'> $( $cmdletFullName -replace "^\w+-\w+\." )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <div class="categorytitle">Synopsis</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $cmdletXml.command.details.description.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <div class="categorytitle">Syntax</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <div class="syntaxregion">$( Get-SyntaxHtml ( [xml]$cmdletXml.command.syntax.get_OuterXml() ) )</div></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <div class="categorytitle">Description</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $cmdletXml.command.description.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #008000'># add the parameters section</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>parameters )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Parameters</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $( Get-ParameterHtml ( [xml]$cmdletXml.command.parameters.get_OuterXml() ) )</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Parameters</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> <nobr><span class="boldtext">&lt;CommonParameters&gt;</span></nobr><br /></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> For more information about common parameters, type "Get-Help about_commonparameters".</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #008000'># add the input types section</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>inputTypes )<br />
{<br />
<span style='color: #000080'>$inputHtml</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$inputCount</span> <span style='color: #C86400'>=</span> Get-InputHtml ( <span style='color: #404040'>[xml]</span><span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>inputTypes<span style='color: #C86400'>.</span>get_OuterXml() )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$inputCount</span> <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Input Type$( if ( $inputCount -gt 1 ) { "s" } )</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $inputHtml</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
<br />
<span style='color: #008000'># add the return values section</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>returnValue )<br />
{<br />
<span style='color: #000080'>$returnHtml</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$returnCount</span> <span style='color: #C86400'>=</span> Get-ReturnHtml ( <span style='color: #404040'>[xml]</span><span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>returnValues<span style='color: #C86400'>.</span>get_OuterXml() )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$returnCount</span> <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Return Value$( if ( $returnCount -gt 1 ) { "s" } )</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $returnHtml</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
<br />
<span style='color: #008000'># add the notes section</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>alertSet )<br />
{<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>alertSet<span style='color: #C86400'>.</span>get_InnerText()<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Notes</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> $( Get-ParagraphedHtml $cmdletXml.command.alertSet.get_InnerXml().Trim() )</span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
<br />
<span style='color: #008000'># add the example section</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>examples )<br />
{<br />
<span style='color: #000080'>$exampleHtml</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$exampleCount</span> <span style='color: #C86400'>=</span> Get-ExampleHtml ( <span style='color: #404040'>[xml]</span><span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>examples<span style='color: #C86400'>.</span>get_OuterXml() )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$exampleCount</span> <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Example$( if ( $exampleCount -gt 1 ) { "s" } )</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $exampleHtml</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
<br />
<span style='color: #008000'># add the related links section</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>relatedLinks )<br />
{<br />
<span style='color: #000080'>$linkHtml</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$linkCount</span> <span style='color: #C86400'>=</span> Get-LinkHtml ( <span style='color: #404040'>[xml]</span><span style='color: #000080'>$cmdletXml</span><span style='color: #C86400'>.</span>command<span style='color: #C86400'>.</span>relatedLinks<span style='color: #C86400'>.</span>get_OuterXml() )<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$linkCount</span> <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <div class="categorytitle">Related Link$( if ( $linkCount -gt 1 ) { "s" } )</div></span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <p></span><br />
<span style='color: #800000'> $linkHtml</span><br />
<span style='color: #800000'> </p></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br />`n"</span><br />
}<br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>" <br />`n"</span><br />
}<br />
<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> </body></span><br />
<span style='color: #800000'></html></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>=</span> Add-Links <span style='color: #000080'>$cmdletName</span> <span style='color: #000080'>$topicHtml</span><br />
<br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #800000'>"$outDirectory\Topics\$cmdletFullName.html"</span> -Encoding Ascii -Input <span style='color: #000080'>$topicHtml</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Add-Links( <span style='color: #404040'>[string]</span> <span style='color: #000080'>$topicName</span><span style='color: #C86400'>,</span> <span style='color: #404040'>[string]</span> <span style='color: #000080'>$topicHtml</span> )<br />
{<br />
<span style='color: #008000'># we only want to add links for Cmdlets and about topics</span><br />
<span style='color: #000080'>$helpHash</span><span style='color: #C86400'>.</span>Keys <span style='color: #C86400'>|</span> <span style='color: #C86400'>Where-Object</span> { <span style='color: #000080'>$_</span> <span style='color: #C86400'>-match</span> <span style='color: #800000'>"(^\w+-\w+|^about_)"</span> } <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$searchText</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><br />
<br />
<span style='color: #008000'># keys representing Cmdlets are formatted like this:</span><br />
<span style='color: #008000'># <Cmdlet Name>.<PSProvider name></span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$_</span> <span style='color: #C86400'>-match</span> <span style='color: #800000'>"^\w+-\w+"</span> )<br />
{<br />
<span style='color: #008000'># we only want to search for the Cmdlet name</span><br />
<span style='color: #000080'>$searchText</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$matches</span>[ <span style='color: #800000'>0</span> ]<br />
}<br />
<br />
<span style='color: #008000'># if the search text isn't the topic being processed</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$searchText</span> <span style='color: #C86400'>-ne</span> <span style='color: #000080'>$topicName</span> )<br />
{<br />
<span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$topicHtml</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"\b($searchText)\b"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"<a href=`"Topics\$_.html`"><nobr>`$1</nobr></a>"</span><br />
}<br />
}<br />
<br />
<span style='color: #000080'>$topicHtml</span><br />
}<br />
<br />
<span style='color: #008000'># file dumping functions</span><br />
<br />
<span style='color: #C86400'>function</span> Write-Hhp<br />
{<br />
<span style='color: #008000'># write the contents of the Html Help Project file</span><br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #800000'>"$outDirectory\powershell.hhp"</span> -Encoding Ascii -Input <span style='color: #800000'>@"</span><br />
<span style='color: #800000'>[OPTIONS]</span><br />
<span style='color: #800000'>Binary TOC=Yes</span><br />
<span style='color: #800000'>Compatibility=1.1 or later</span><br />
<span style='color: #800000'>Compiled file=PowerShell.chm</span><br />
<span style='color: #800000'>Contents file=powershell.hhc</span><br />
<span style='color: #800000'>Default topic=Topics/default.html</span><br />
<span style='color: #800000'>Full-text search=Yes</span><br />
<span style='color: #800000'>Language=0x409 English (United States)</span><br />
<span style='color: #800000'>Title=PowerShell Help</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>[INFOTYPES]</span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Write-DefaultPage<br />
{<br />
<span style='color: #000080'>$defaultHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'><html></span><br />
<span style='color: #800000'> <head></span><br />
<span style='color: #800000'> <link rel="stylesheet" type="text/css" href="powershell.css" /></span><br />
<span style='color: #800000'> <title>PowerShell Help</title></span><br />
<span style='color: #800000'> </head></span><br />
<span style='color: #800000'> <body style="margin: 5px 5px 5px 5px; color: #FFFFFF; background-color: #C86400;"></span><br />
<span style='color: #800000'> <h2>Windows PowerShell Help</h2></span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> This complied help manual contains the help for all of the built-in PowerShell Cmdlets </span><br />
<span style='color: #800000'> and PSProviders, as well as the help for any Cmdlets or PSProviders added through </span><br />
<span style='color: #800000'> Add-PSSnapin, if help for them is available. Also included are all of the "about" topics.</span><br />
<span style='color: #800000'> <br /><br /></span><br />
<span style='color: #800000'> To use this manual from the PowerShell command line, add the following function and </span><br />
<span style='color: #800000'> alias to your PowerShell profile:</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <pre class="syntaxregion">function Get-CompiledHelp( [string] `$topic )</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> if ( `$topic )</span><br />
<span style='color: #800000'> {</span><br />
<span style='color: #800000'> # Get-Command will fail if the topic is a PSProvider or an "about" topic.</span><br />
<span style='color: #800000'> `$ErrorActionPreference = "SilentlyContinue"</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'> # we don't want Get-Command to resolve to an application or a function </span><br />
<span style='color: #800000'> `$command = Get-Command `$topic | Where-Object { `$_.CommandType -match "Alias|Cmdlet" }</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'> # if the topic is an alias or a Cmdlet, combine its name with</span><br />
<span style='color: #800000'> # its PSProvider to get the full name of the help file</span><br />
<span style='color: #800000'> if ( `$command -and `$command.CommandType -eq "Alias" )</span><br />
<span style='color: #800000'> {</span><br />
<span style='color: #800000'> `$topic = "`$( `$command.ResolvedCommand ).`$( `$command.ReferencedCommand.PSSnapIn.Name )"</span><br />
<span style='color: #800000'> }</span><br />
<span style='color: #800000'> elseif ( `$command -and `$command.CommandType -eq "Cmdlet" )</span><br />
<span style='color: #800000'> {</span><br />
<span style='color: #800000'> `$topic = "`$( `$command.Name ).`$( `$command.PSSnapIn.Name )"</span><br />
<span style='color: #800000'> }</span><br />
<span style='color: #800000'> else</span><br />
<span style='color: #800000'> {</span><br />
<span style='color: #800000'> # check to see if we have a PSProvider</span><br />
<span style='color: #800000'> `$psProvider = Get-PSProvider `$topic</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'> if ( `$psProvider )</span><br />
<span style='color: #800000'> {</span><br />
<span style='color: #800000'> `$topic = "`$( `$psProvider.Name ).`$( `$psProvider.PSSnapIn.Name )"</span><br />
<span style='color: #800000'> }</span><br />
<span style='color: #800000'> }</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'> hh.exe "mk:@MSITStore:$( Resolve-Path "$outDirectory" )\PowerShell.chm::/Topics/`$topic.html"</span><br />
<span style='color: #800000'> }</span><br />
<span style='color: #800000'> else</span><br />
<span style='color: #800000'> {</span><br />
<span style='color: #800000'> hh.exe "$( Resolve-Path "$outDirectory" )\PowerShell.chm"</span><br />
<span style='color: #800000'> }</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>Set-Alias chelp Get-CompiledHelp</pre></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> The path in the Get-CompliedHelp function corresponds to the location where this compiled </span><br />
<span style='color: #800000'> help manual was originally created. If this file is moved to another location, the path </span><br />
<span style='color: #800000'> in the function will need to be updated.</span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> To view the help topic for Get-ChildItem, type the following:</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <div class="syntaxregion">PS$ Get-CompiledHelp Get-ChildItem</div></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> <br /></span><br />
<span style='color: #800000'> Because "ls" is an alias for Get-ChildItem, and "chelp" is an alias for Get-CompliedHelp, the following also works:</span><br />
<span style='color: #800000'> <div id="contenttext"></span><br />
<span style='color: #800000'> <div class="syntaxregion">PS$ chelp ls</div></span><br />
<span style='color: #800000'> </div></span><br />
<span style='color: #800000'> </body></span><br />
<span style='color: #800000'></html></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$defaultHtml</span> <span style='color: #C86400'>=</span> Add-Links <span style='color: #800000'>""</span> <span style='color: #000080'>$defaultHtml</span><br />
<br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #800000'>"$outDirectory\Topics\default.html"</span> -Encoding Ascii -Input <span style='color: #000080'>$defaultHtml</span><br />
}<br />
<br />
<span style='color: #C86400'>function</span> Write-Css<br />
{<br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #800000'>"$outDirectory\powershell.css"</span> -Encoding Ascii -Input <span style='color: #800000'>@"</span><br />
<span style='color: #800000'>body</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> margin: 0px 0px 0px 0px;</span><br />
<span style='color: #800000'> padding: 0px 0px 0px 0px;</span><br />
<span style='color: #800000'> font-family: Verdana, Arial, Helvetica, sans-serif;</span><br />
<span style='color: #800000'> font-size: 70%;</span><br />
<span style='color: #800000'> width: 100%;</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>div#topicheading</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> position: relative;</span><br />
<span style='color: #800000'> left: 0px;</span><br />
<span style='color: #800000'> padding: 5px 0px 5px 10px;</span><br />
<span style='color: #800000'> border-bottom: 1px solid #999999;</span><br />
<span style='color: #800000'> color: #FFFFFF;</span><br />
<span style='color: #800000'> background-color: #C86400;</span><br />
<span style='color: #800000'> font-size: 110%;</span><br />
<span style='color: #800000'> font-weight: bold;</span><br />
<span style='color: #800000'> text-align: left;</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>div#topictitle</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> padding: 5px 5px 5px 5px;</span><br />
<span style='color: #800000'> color: #FFFFFF</span><br />
<span style='color: #800000'> font-size: 90%;</span><br />
<span style='color: #800000'> font-weight: normal;</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>div#contenttext</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> top: 0px;</span><br />
<span style='color: #800000'> padding: 0px 25px 0px 25px;</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>p { margin: 5px 0px 5px 0px; }</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>a:link { color: #0000FF; }</span><br />
<span style='color: #800000'>a:visited { color: #0000FF; }</span><br />
<span style='color: #800000'>a:hover { color: #3366FF; }</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>table.parametertable</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> margin-left: 25px;</span><br />
<span style='color: #800000'> font-size: 100%;</span><br />
<span style='color: #800000'> border-collapse:collapse</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>table.parametertable td</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> font-size: 100%;</span><br />
<span style='color: #800000'> border: solid #999999 1px;</span><br />
<span style='color: #800000'> padding: 0in 5.4pt 0in 5.4pt</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>pre.syntaxregion, div.syntaxregion</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> background: #DDDDDD;</span><br />
<span style='color: #800000'> padding: 4px 8px;</span><br />
<span style='color: #800000'> cursor: text;</span><br />
<span style='color: #800000'> margin-top: 1em;</span><br />
<span style='color: #800000'> margin-bottom: 1em;</span><br />
<span style='color: #800000'> margin-left: .6em;</span><br />
<span style='color: #800000'> color: #000000;</span><br />
<span style='color: #800000'> border-width: 1px;</span><br />
<span style='color: #800000'> border-style: solid;</span><br />
<span style='color: #800000'> border-color: #999999;</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>.categorytitle</span><br />
<span style='color: #800000'>{</span><br />
<span style='color: #800000'> padding-top: .8em;</span><br />
<span style='color: #800000'> font-size: 110%;</span><br />
<span style='color: #800000'> font-weight: bold;</span><br />
<span style='color: #800000'> text-align: left;</span><br />
<span style='color: #800000'> margin-left: 5px;</span><br />
<span style='color: #800000'>}</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>.boldtext { font-weight: bold; }</span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #008000'>### main ###</span><br />
<br />
<span style='color: #008000'># create the topics directory</span><br />
<span style='color: #C86400'>New-Item</span> -Type Directory -Path <span style='color: #800000'>"$outDirectory"</span> -Force <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-Null</span><br />
<span style='color: #C86400'>New-Item</span> -Type Directory -Path <span style='color: #800000'>"$outDirectory\Topics"</span> -Force <span style='color: #C86400'>|</span> <span style='color: #C86400'>Out-Null</span><br />
<br />
<span style='color: #800000'>"`nRetrieving help content...`n"</span><br />
<br />
<span style='color: #008000'># initialize variables for HHC file</span><br />
<span style='color: #000080'>$hhcContentsHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$cmdletCategoryHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$cmdletCategoryHash</span> <span style='color: #C86400'>=</span> @{}<br />
<br />
<span style='color: #008000'># help content hash</span><br />
<span style='color: #000080'>$helpHash</span> <span style='color: #C86400'>=</span> @{}<br />
<span style='color: #000080'>$helpTopicNameArray</span> <span style='color: #C86400'>=</span> @()<br />
<br />
<span style='color: #008000'># get the Cmdlet help</span><br />
<span style='color: #C86400'>Get-PSSnapIn</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> -Property Name <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> { <br />
<span style='color: #000080'>$psSnapInName</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Name<br />
<br />
<span style='color: #000080'>$helpFilePath</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Join-Path</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>ApplicationBase ( ( <span style='color: #C86400'>Get-Command</span> -PSSnapIn <span style='color: #000080'>$_</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>Select-Object</span> -First <span style='color: #800000'>1</span> )<span style='color: #C86400'>.</span>HelpFile<br />
<br />
<span style='color: #008000'># the culture needs to be added to the path on Vista </span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>!</span>( <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$helpFilePath</span> ) )<br />
{<br />
<span style='color: #000080'>$helpFilePath</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"$( $_.ApplicationBase )\$( $Host.CurrentUICulture.Name )\$( Split-Path -Leaf $helpFilePath )"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$helpFilePath</span> )<br />
{<br />
<span style='color: #000080'>$helpXml</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[xml]</span>( <span style='color: #C86400'>Get-Content</span> <span style='color: #000080'>$helpFilePath</span> )<br />
<br />
<span style='color: #000080'>$cmdletCategoryContents</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>Get-Command</span> -PSSnapIn <span style='color: #000080'>$_</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$commandName</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Name<br />
<br />
<span style='color: #000080'>$helpXml</span><span style='color: #C86400'>.</span>helpitems<span style='color: #C86400'>.</span>command <span style='color: #C86400'>|</span> <span style='color: #C86400'>Where-Object</span> { <br />
<span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>details<span style='color: #C86400'>.</span>name <span style='color: #C86400'>-and</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>details<span style='color: #C86400'>.</span>name<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-imatch</span> <span style='color: #800000'>"\b$commandName\b"</span> <br />
} <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #008000'># add the Xml Help of the Cmdlet to the help hashtable</span><br />
<span style='color: #000080'>$helpHash</span>[ <span style='color: #800000'>"{0}.{1}"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$commandName</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$psSnapInName</span> ] <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>get_OuterXml()<br />
<span style='color: #000080'>$helpTopicNameArray</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$commandName</span><br />
<br />
<span style='color: #000080'>$cmdletTopicItem</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="$commandName"></span><br />
<span style='color: #800000'> <param name="Local" value="Topics\$( "{0}.{1}" -f $commandName, $psSnapInName ).html"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$GroupByPSSnapIn</span> )<br />
{ <br />
<span style='color: #000080'>$cmdletCategoryContents</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$cmdletTopicItem</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #008000'># save the topics so they can be sorted properly and added to the HHC later</span><br />
<span style='color: #000080'>$cmdletCategoryHash</span>[ <span style='color: #800000'>"{0}.{1}"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$commandName</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$psSnapInName</span> ] <span style='color: #C86400'>=</span> <span style='color: #000080'>$cmdletTopicItem</span><br />
}<br />
}<br />
} <br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$GroupByPSSnapIn</span> )<br />
{<br />
<span style='color: #008000'># add a category in the HHC for this PSSnapIn and its Cmdlets</span><br />
<span style='color: #000080'>$cmdletCategoryHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="$psSnapInName"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'> <ul></span><br />
<span style='color: #800000'> $( $cmdletCategoryContents.Trim() )</span><br />
<span style='color: #800000'> </ul></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
}<br />
<br />
<span style='color: #008000'># sort the Cmdlets so they are added to the HHC in a logical order</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>!</span><span style='color: #000080'>$GroupByPSSnapIn</span> )<br />
{<br />
<span style='color: #000080'>$cmdletCategoryHash</span><span style='color: #C86400'>.</span>Keys <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$cmdletCategoryHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$cmdletCategoryHash</span>[ <span style='color: #000080'>$_</span> ]<br />
}<br />
}<br />
<br />
<span style='color: #008000'># add the Cmdlet category to the HHC</span><br />
<span style='color: #000080'>$hhcContentsHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="Cmdlet Help"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'> <ul></span><br />
<span style='color: #800000'> $( $cmdletCategoryHtml.Trim() )</span><br />
<span style='color: #800000'> </ul></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$providerCategoryHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<span style='color: #000080'>$providerCategoryHash</span> <span style='color: #C86400'>=</span> @{}<br />
<br />
<span style='color: #008000'># get the PSProvider help</span><br />
<span style='color: #C86400'>Get-PSSnapIn</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> -Property Name <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$psSnapInName</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Name<br />
<br />
<span style='color: #000080'>$helpFilePath</span> <span style='color: #C86400'>=</span> <span style='color: #C86400'>Join-Path</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>ApplicationBase ( ( <span style='color: #C86400'>Get-Command</span> -PSSnapIn <span style='color: #000080'>$_</span> ) <span style='color: #C86400'>|</span> <span style='color: #C86400'>Select-Object</span> -First <span style='color: #800000'>1</span> )<span style='color: #C86400'>.</span>HelpFile<br />
<br />
<span style='color: #008000'># the culture needs to be added to the path on Vista </span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>!</span>( <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$helpFilePath</span> ) )<br />
{<br />
<span style='color: #000080'>$helpFilePath</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"$( $_.ApplicationBase )\$( $Host.CurrentUICulture.Name )\$( Split-Path -Leaf $helpFilePath )"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$helpFilePath</span> )<br />
{<br />
<span style='color: #000080'>$helpXml</span> <span style='color: #C86400'>=</span> <span style='color: #404040'>[xml]</span>( <span style='color: #C86400'>Get-Content</span> <span style='color: #000080'>$helpFilePath</span> )<br />
<br />
<span style='color: #000080'>$providerCategoryContents</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>Get-PSProvider</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Where-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>PSSnapin<span style='color: #C86400'>.</span>Name <span style='color: #C86400'>-eq</span> <span style='color: #000080'>$psSnapInName</span> } <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$psProviderName</span> <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Name<br />
<br />
<span style='color: #000080'>$helpXml</span><span style='color: #C86400'>.</span>helpitems<span style='color: #C86400'>.</span>providerhelp <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Where-Object</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>name<span style='color: #C86400'>.</span>Trim() <span style='color: #C86400'>-imatch</span> <span style='color: #800000'>"\b$psProviderName\b"</span> } <span style='color: #C86400'>|</span> <br />
<span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$helpHash</span>[ <span style='color: #800000'>"{0}.{1}"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$psProviderName</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$psSnapInName</span> ] <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>get_OuterXml()<br />
<span style='color: #000080'>$helpTopicNameArray</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$psProviderName</span><br />
<br />
<span style='color: #008000'># add a category in the HHC for this PSProvider</span><br />
<span style='color: #000080'>$providerTopicItem</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="$psProviderName"></span><br />
<span style='color: #800000'> <param name="Local" value="Topics\$( "{0}.{1}" -f $psProviderName, $psSnapInName ).html"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$GroupByPSSnapIn</span> )<br />
{ <br />
<span style='color: #000080'>$providerCategoryContents</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$providerTopicItem</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #008000'># save the topics so they can be sorted properly and added to the HHC later</span><br />
<span style='color: #000080'>$providerCategoryHash</span>[ <span style='color: #800000'>"{0}.{1}"</span> <span style='color: #C86400'>-f</span> <span style='color: #000080'>$psProviderName</span><span style='color: #C86400'>,</span> <span style='color: #000080'>$psSnapInName</span> ] <span style='color: #C86400'>=</span> <span style='color: #000080'>$providerTopicItem</span><br />
}<br />
}<br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$GroupByPSSnapIn</span> <span style='color: #C86400'>-and</span> <span style='color: #000080'>$providerCategoryContents</span> <span style='color: #C86400'>-ne</span> <span style='color: #800000'>""</span> )<br />
{<br />
<span style='color: #008000'># add a category in the HHC for this PSSnapIn and its Cmdlets</span><br />
<span style='color: #000080'>$providerCategoryHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="$psSnapInName"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'> <ul></span><br />
<span style='color: #800000'> $( $providerCategoryContents.Trim() )</span><br />
<span style='color: #800000'> </ul></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
}<br />
}<br />
<br />
<span style='color: #008000'># sort the PSProviders so they are added to the HHC in a logical order</span><br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>!</span><span style='color: #000080'>$GroupByPSSnapIn</span> )<br />
{<br />
<span style='color: #000080'>$providerCategoryHash</span><span style='color: #C86400'>.</span>Keys <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #000080'>$providerCategoryHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$providerCategoryHash</span>[ <span style='color: #000080'>$_</span> ]<br />
}<br />
}<br />
<br />
<span style='color: #008000'># add the PSProvider category to the HHC</span><br />
<span style='color: #000080'>$hhcContentsHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="Provider Help"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'> <ul></span><br />
<span style='color: #800000'> $( $providerCategoryHtml.Trim() )</span><br />
<span style='color: #800000'> </ul></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #008000'># get the about topics</span><br />
<span style='color: #000080'>$about_TopicPaths</span> <span style='color: #C86400'>=</span> @()<br />
<br />
<span style='color: #000080'>$helpPath</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>Resolve-Path</span> <span style='color: #800000'>"$pshome\about_*.txt"</span> )<br />
{<br />
<span style='color: #000080'>$helpPath</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"$pshome"</span><br />
}<br />
<span style='color: #C86400'>elseif</span> ( <span style='color: #C86400'>Resolve-Path</span> <span style='color: #800000'>"$pshome\$( $Host.CurrentUICulture.Name )\about_*.txt"</span> )<br />
{<br />
<span style='color: #000080'>$helpPath</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>"$pshome\$( $Host.CurrentUICulture.Name )"</span><br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>Test-Path</span> <span style='color: #000080'>$helpPath</span> )<br />
{<br />
<span style='color: #000080'>$about_TopicPaths</span> <span style='color: #C86400'>+=</span> <span style='color: #C86400'>Get-ChildItem</span> <span style='color: #800000'>"$helpPath\about_*.txt"</span><br />
}<br />
<br />
<span style='color: #008000'># we SilentlyContinue with Get-ChildItem errors because the ModuleName</span><br />
<span style='color: #008000'># for the built-in PSSnapins doesn't resolve to anything, since the assemblies</span><br />
<span style='color: #008000'># are only in the GAC.</span><br />
<span style='color: #000080'>$about_TopicPaths</span> <span style='color: #C86400'>+=</span> <span style='color: #C86400'>Get-PSSnapin</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> { <br />
( <span style='color: #C86400'>Get-ChildItem</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>ModuleName -ErrorAction <span style='color: #800000'>"SilentlyContinue"</span> )<span style='color: #C86400'>.</span>DirectoryName <br />
} <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> { <br />
<span style='color: #C86400'>Get-ChildItem</span> <span style='color: #800000'>"$_\about_*.txt"</span> <br />
}<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #000080'>$about_TopicPaths</span><span style='color: #C86400'>.</span>Count <span style='color: #C86400'>-gt</span> <span style='color: #800000'>0</span> )<br />
{<br />
<span style='color: #000080'>$aboutCategoryHtml</span> <span style='color: #C86400'>=</span> <span style='color: #800000'>""</span><br />
<br />
<span style='color: #000080'>$about_TopicPaths</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> -Unique -Property @{ Expression <span style='color: #C86400'>=</span> { <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Name<span style='color: #C86400'>.</span>ToUpper() } }<span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #008000'># pull the topic name out of the file name</span><br />
<span style='color: #000080'>$name</span> <span style='color: #C86400'>=</span> ( <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>Name <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"(.xml)?.help.txt"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>"`$1"</span> )<br />
<br />
<span style='color: #008000'># add the path of the topic to the help hashtable</span><br />
<span style='color: #000080'>$helpHash</span>[ <span style='color: #000080'>$name</span> ] <span style='color: #C86400'>=</span> <span style='color: #000080'>$_</span><span style='color: #C86400'>.</span>FullName<br />
<span style='color: #000080'>$helpTopicNameArray</span> <span style='color: #C86400'>+=</span> <span style='color: #000080'>$name</span><br />
<br />
<span style='color: #000080'>$topicName</span> <span style='color: #C86400'>=</span> Capitalize-Words ( <span style='color: #000080'>$name</span> <span style='color: #C86400'>-replace</span> <span style='color: #800000'>"(about)?_"</span><span style='color: #C86400'>,</span> <span style='color: #800000'>" "</span> )<span style='color: #C86400'>.</span>Trim()<br />
<br />
<span style='color: #008000'># add a category in the HHC for this about topic</span><br />
<span style='color: #000080'>$aboutCategoryHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="$topicName"></span><br />
<span style='color: #800000'> <param name="Local" value="Topics\$name.html"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #008000'># add the About Topics category to the HHC</span><br />
<span style='color: #000080'>$hhcContentsHtml</span> <span style='color: #C86400'>+=</span> <span style='color: #800000'>@"</span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="About Topics"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'> <ul></span><br />
<span style='color: #800000'> $( $aboutCategoryHtml.Trim() )</span><br />
<span style='color: #800000'> </ul></span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
<br />
<span style='color: #008000'># write the contents file</span><br />
<span style='color: #C86400'>Out-File</span> -FilePath <span style='color: #800000'>"$outDirectory\powershell.hhc"</span> -Encoding Ascii -Input <span style='color: #800000'>@"</span><br />
<span style='color: #800000'><!doctype html public "-//ietf//dtd html//en"></span><br />
<span style='color: #800000'><html></span><br />
<span style='color: #800000'> <head></span><br />
<span style='color: #800000'> <meta name="Generator" content="Microsoft&reg; HTML Help Workshop 4.1"></span><br />
<span style='color: #800000'> <!-- Sitemap 1.0 --></span><br />
<span style='color: #800000'> </head></span><br />
<span style='color: #800000'> <body></span><br />
<span style='color: #800000'> <object type="text/site properties"></span><br />
<span style='color: #800000'> <param name="Window Styles" value="0x800025"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'> <ul></span><br />
<span style='color: #800000'> <li><object type="text/sitemap"></span><br />
<span style='color: #800000'> <param name="Name" value="PowerShell Help"></span><br />
<span style='color: #800000'> <param name="Local" value="Topics\default.html"></span><br />
<span style='color: #800000'> </object></span><br />
<span style='color: #800000'> $( $hhcContentsHtml.Trim() )</span><br />
<span style='color: #800000'> </ul></span><br />
<span style='color: #800000'> </body></span><br />
<span style='color: #800000'></html></span><br />
<span style='color: #800000'>"@</span><br />
<br />
<span style='color: #000080'>$helpHash</span><span style='color: #C86400'>.</span>Keys <span style='color: #C86400'>|</span> <span style='color: #C86400'>Sort-Object</span> <span style='color: #C86400'>|</span> <span style='color: #C86400'>Foreach-Object</span> {<br />
<span style='color: #C86400'>switch</span> -regex ( <span style='color: #000080'>$_</span> )<br />
{<br />
<span style='color: #008000'># about topic</span><br />
<span style='color: #800000'>"about_"</span><br />
{<br />
<span style='color: #800000'>"Creating help for the $_ about topic..."</span><br />
Write-AboutTopic <span style='color: #000080'>$_</span> <span style='color: #000080'>$helpHash</span>[ <span style='color: #000080'>$_</span> ]<br />
}<br />
<br />
<span style='color: #008000'># Verb-Noun: Cmdlet</span><br />
<span style='color: #800000'>"\w+-\w+"</span><br />
{<br />
<span style='color: #800000'>"Creating help for the $( $_ -replace '(^\w+-\w+).*', '$1' ) Cmdlet..."</span><br />
Write-CmdletTopic <span style='color: #000080'>$_</span> <span style='color: #000080'>$helpHash</span>[ <span style='color: #000080'>$_</span> ]<br />
}<br />
<br />
<span style='color: #008000'># PSProvider</span><br />
<span style='color: #C86400'>default</span><br />
{<br />
<span style='color: #800000'>"Creating help for the $( $_ -replace '(^\w+).*', '$1' ) PSProvider..."</span><br />
Write-ProviderTopic <span style='color: #000080'>$_</span> <span style='color: #000080'>$helpHash</span>[ <span style='color: #000080'>$_</span> ]<br />
}<br />
}<br />
}<br />
<br />
Write-DefaultPage<br />
Write-Css<br />
Write-Hhp<br />
<br />
<span style='color: #C86400'>if</span> ( <span style='color: #C86400'>Test-Path</span> <span style='color: #800000'>"C:\Program Files\HTML Help Workshop\hhc.exe"</span> )<br />
{<br />
<span style='color: #008000'># compile the help</span><br />
<span style='color: #800000'>"`nCompiling the help manual...`n"</span><br />
<span style='color: #C86400'>Push-Location</span><br />
<span style='color: #C86400'>Set-Location</span> <span style='color: #000080'>$outDirectory</span><br />
<span style='color: #C86400'>&</span> <span style='color: #800000'>"C:\Program Files\HTML Help Workshop\hhc.exe"</span> powershell<span style='color: #C86400'>.</span>hhp<br />
<span style='color: #C86400'>Pop-Location</span><br />
<br />
<span style='color: #008000'># open the help file</span><br />
<span style='color: #C86400'>&</span> <span style='color: #800000'>"$outDirectory\PowerShell.chm"</span><br />
}<br />
<span style='color: #C86400'>else</span><br />
{<br />
<span style='color: #C86400'>Write-Host</span> -ForegroundColor Red <span style='color: #800000'>@"</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>HTML Help Workshop is not installed, or it was not installed in its default</span><br />
<span style='color: #800000'>location of "C:\Program Files\HTML Help Workshop".</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>HTML Help Workshop is required to compile the help manual. It can be downloaded</span><br />
<span style='color: #800000'>free of charge from Microsoft:</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>http://www.microsoft.com/downloads/details.aspx?familyid=00535334-c8a6-452f-9aa0-d597d16580cc&displaylang=en</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>If you do not want to install HTML Help Workshop on this machine, all of the</span><br />
<span style='color: #800000'>files necessary to compile the manual have been created here:</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>$( Resolve-Path $outDirectory ) </span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>Copy these files to a machine with HTML Help Workshop, and you can compile the</span><br />
<span style='color: #800000'>manual there, with the following command:</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'><HTML Help Workshop location>\hhc.exe powershell.hhp</span><br />
<span style='color: #800000'></span><br />
<span style='color: #800000'>"@</span><br />
}<br />
</div>
The XML help files are fairly consistent, but once in a while something is formatted a little differently. I tried to account for as much of this sort of thing as possible, but I'm sure I missed something. If you find something wrong with this script, please leave a comment here.<br /><br />
I hope this ends up being useful to someone else.Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com2tag:blogger.com,1999:blog-4092806390106651827.post-91259960603405438282007-10-11T09:47:00.000-07:002007-10-17T21:52:37.923-07:00PowerShell and MeMy name is Jeff Hillman, and I am a software developer.
I realized that Computer Science was for me when I was required to take a introductory C++ class as an Electrical Engineering major in college. I changed my major, and I have never looked back. My professional programming language experience has included Java, C++, COM, VB6 (bleh), Javascript, and C#. I have experience scripting with bash, Perl, and DOS batch files. I really enjoy Perl, and I regret that I don't have many opportunities to use it for work. I work in a very Microsoft-oriented shop, where we write software for Windows, so that is kind of where I lean right now. I'm not one of those guys who will tell you that .NET (or Windows) is the only way to go and that Java (or *nix) is a big waste of bytes (or the other way around). I think we have the responsibility of using the best tool for the job. Sometimes the best tool is the one with which you have the most experience; sometimes it isn't.
I am currently on a two-year assignment in Bangkok, Thailand, training some Thai software developers on a large project developed in our offices in Salt Lake City, Utah, which is where I worked before. All the development here is C++ and COM, but the guys back home in Utah are all neck-deep in .NET and C# goodness. I am very much enjoying my work experience here in Thailand, but I do look forward to getting back into the .NET framework full-time, when I return next year.
I was first introduced to Windows PowerShell in late 2005, back when it was codenamed Monad. I am not a system administrator, so I might not fit the main "target audience" of PowerShell, but, as a developer, I thought it had a lot of potential to help me in my day-to-day work. Besides that, I really like finding ways to automate anything that is likely to be repeated. Sometimes I automate something just for fun, or for the experience, rather than for a long-term benefit. I use PowerShell at work every day; I rarely open a Windows Explorer window anymore. I force myself to use it for pretty much everything, and, in doing so, I discover new and exciting things about it on a fairly regular basis.
I plan to use this blog to share what I have learned about PowerShell. If I have anything I think others might find useful, I will post it here. First up: PowerShell Help.Hillman Familyhttp://www.blogger.com/profile/12600060342784990078noreply@blogger.com0