Happy Star Wars Day

PowerShell

It’s the age-old* question people have been asking since at least 2006. Which is nerdier, Star Wars or PowerShell? While the debate rages on, we’ve taken on a different task. How can we join the two together for the ultimate mashup of fandom meets technical prowess?

While it may be an unconventional use of PDQ Deploy (running a non-silent pun intended interactive windowed deployment), it’s still a fun experiment.

Behind the Scenes

Here is an excerpt of the trumpet part. Copy it into your PowerShell ISE and give it a run.

$sw = [Diagnostics.Stopwatch]::StartNew()
$host.ui.RawUI.BackgroundColor = "Blue"
$host.ui.RawUI.ForegroundColor = "White"

function Pause-Console
{
 param([int]$p = 0,[int]$n = 0)
 $playhead = $p
 $next = $n
 
 $savedColor = $host.ui.RawUI.BackgroundColor

 $elapsed = $sw.elapsedMilliseconds
 $pelapsed = $elapsed - $playhead
 $dur = $next-$playhead

 if($pelapsed -lt 0) {
  $pos = [math]::abs($pelapsed) + $dur
  
  if($pos -gt 200) {
   $host.ui.RawUI.BackgroundColor = "Black"
   Clear-Host
  }
  
  Write-Output "Start-Sleep -m $pos"
  Start-Sleep -m $pos
  
  if($pos -gt 200) {
   $host.ui.RawUI.BackgroundColor = $savedColor
   Clear-Host
  }
 }else{
  $dif = $dur - $pelapsed
  if($dif -gt 0) {
   if($dif -gt 200) {
    $host.ui.RawUI.BackgroundColor = "Black"
    Clear-Host
   }
   Write-Output "Start-Sleep -m $dif"
   Start-Sleep -m $dif
   
   if($dif -gt 200) {
    $host.ui.RawUI.BackgroundColor = $savedColor
    Clear-Host
   }
  }
 }
}

function Console-Beep
{
  param( [int]$h = 0,
    [int]$p = 0,
     [int]$n = 0)
  $hertz = $h
  $playhead = $p
  $next = $n
  
  $elapsed = $sw.elapsedMilliseconds
  $pelapsed = $elapsed - $playhead
  $dur = $next-$playhead

 if($pelapsed -lt 0) {
  $pos = [math]::abs($pelapsed)
  $dur = $dur+$pos
  Write-Output "[console]::beep($hertz,$dur)" 
  [console]::beep($hertz,$dur)
 }else{
  $dif = $dur - $pelapsed
  if($dif -gt 0) {
   Write-Output "[console]::beep($hertz,$dif)" 
   [console]::beep($hertz,$dif)
  }
 }
}


Console-Beep -h 880 -p 566 -n 778
Pause-Console -p 778 -n 1132
Console-Beep -h 880 -p 1132 -n 1344
Pause-Console -p 1344 -n 1698
Console-Beep -h 880 -p 1698 -n 1910
Pause-Console -p 1910 -n 4867
Console-Beep -h 466 -p 4867 -n 4909
Pause-Console -p 4909 -n 4926
Console-Beep -h 466 -p 4926 -n 4968
Pause-Console -p 4968 -n 4989
Console-Beep -h 466 -p 4989 -n 5029
Pause-Console -p 5029 -n 5051
Console-Beep -h 466 -p 5051 -n 5107
Pause-Console -p 5107 -n 5119
Console-Beep -h 466 -p 5119 -n 5197
Pause-Console -p 5197 -n 5281
Console-Beep -h 349 -p 5281 -n 5338
Pause-Console -p 5338 -n 5449
Console-Beep -h 622 -p 5449 -n 5515
Pause-Console -p 5515 -n 5664
Console-Beep -h 698 -p 5664 -n 5742
Pause-Console -p 5742 -n 5864
Console-Beep -h 622 -p 5864 -n 5932
Pause-Console -p 5932 -n 6055
Console-Beep -h 466 -p 6055 -n 6140
Pause-Console -p 6140 -n 6270
Console-Beep -h 466 -p 6270 -n 6355
Pause-Console -p 6355 -n 6461
Console-Beep -h 349 -p 6461 -n 6540
Pause-Console -p 6540 -n 6661
Console-Beep -h 622 -p 6661 -n 6721
Pause-Console -p 6721 -n 6874
Console-Beep -h 698 -p 6874 -n 6946
Pause-Console -p 6946 -n 7074
Console-Beep -h 622 -p 7074 -n 7134
Pause-Console -p 7134 -n 7261
Console-Beep -h 466 -p 7261 -n 7330
Pause-Console -p 7330 -n 7470
Console-Beep -h 466 -p 7470 -n 7545
Pause-Console -p 7545 -n 7670
Console-Beep -h 349 -p 7670 -n 7751
Pause-Console -p 7751 -n 7874
Console-Beep -h 622 -p 7874 -n 7946
Pause-Console -p 7946 -n 8082
Console-Beep -h 698 -p 8082 -n 8155
Pause-Console -p 8155 -n 8311
Console-Beep -h 466 -p 8311 -n 8377
Pause-Console -p 8377 -n 8389
Console-Beep -h 466 -p 8389 -n 8482
Pause-Console -p 8482 -n 8545
Console-Beep -h 466 -p 8545 -n 8639
Pause-Console -p 8639 -n 8832
Console-Beep -h 349 -p 8832 -n 8995
Pause-Console -p 8995 -n 9151
Console-Beep -h 349 -p 9151 -n 9295
Pause-Console -p 9295 -n 9470
Console-Beep -h 349 -p 9470 -n 9626
Pause-Console -p 9626 -n 9882
Console-Beep -h 466 -p 9882 -n 11051
Pause-Console -p 11051 -n 11114
Console-Beep -h 698 -p 11114 -n 12116
Pause-Console -p 12116 -n 12213
Console-Beep -h 622 -p 12213 -n 12276
Pause-Console -p 12276 -n 12343
Console-Beep -h 587 -p 12343 -n 12424
Pause-Console -p 12424 -n 12491
Console-Beep -h 523 -p 12491 -n 12554
Pause-Console -p 12554 -n 12662
Console-Beep -h 932 -p 12662 -n 13709
Pause-Console -p 13709 -n 13769
Console-Beep -h 698 -p 13769 -n 14238
Pause-Console -p 14238 -n 14353
Console-Beep -h 622 -p 14353 -n 14444
Pause-Console -p 14444 -n 14528
Console-Beep -h 587 -p 14528 -n 14638
Pause-Console -p 14638 -n 14734
Console-Beep -h 523 -p 14734 -n 14821
Pause-Console -p 14821 -n 14959
Console-Beep -h 932 -p 14959 -n 16144
Pause-Console -p 16144 -n 16171
Console-Beep -h 698 -p 16171 -n 16646
Pause-Console -p 16646 -n 16788
Console-Beep -h 622 -p 16788 -n 16885
Pause-Console -p 16885 -n 16963
Console-Beep -h 587 -p 16963 -n 17063
Pause-Console -p 17063 -n 17163
Console-Beep -h 622 -p 17163 -n 17260
Pause-Console -p 17260 -n 17369
Console-Beep -h 523 -p 17369 -n 18723
Pause-Console -p 18723 -n 18856
Console-Beep -h 349 -p 18856 -n 18913
Pause-Console -p 18913 -n 18950
Console-Beep -h 349 -p 18950 -n 19025
Pause-Console -p 19025 -n 19050
Console-Beep -h 349 -p 19050 -n 19125
Pause-Console -p 19125 -n 19165
Console-Beep -h 466 -p 19165 -n 20359
Pause-Console -p 20359 -n 20378
Console-Beep -h 698 -p 20378 -n 21528
Pause-Console -p 21528 -n 21578
Console-Beep -h 622 -p 21578 -n 21663
Pause-Console -p 21663 -n 21763
Console-Beep -h 587 -p 21763 -n 21848
Pause-Console -p 21848 -n 21959
Console-Beep -h 523 -p 21959 -n 22065
Pause-Console -p 22065 -n 22181
Console-Beep -h 932 -p 22181 -n 23354
Pause-Console -p 23354 -n 23381
Console-Beep -h 698 -p 23381 -n 23960
Pause-Console -p 23960 -n 23975
Console-Beep -h 622 -p 23975 -n 24075
Pause-Console -p 24075 -n 24175
Console-Beep -h 587 -p 24175 -n 24248
Pause-Console -p 24248 -n 24359
Console-Beep -h 523 -p 24359 -n 24434
Pause-Console -p 24434 -n 24571
Console-Beep -h 932 -p 24571 -n 25753
Pause-Console -p 25753 -n 25771
Console-Beep -h 698 -p 25771 -n 26334
Pause-Console -p 26334 -n 26375
Console-Beep -h 622 -p 26375 -n 26475
Pause-Console -p 26475 -n 26571
Console-Beep -h 587 -p 26571 -n 26650
Pause-Console -p 26650 -n 26765
Console-Beep -h 622 -p 26765 -n 26831
Pause-Console -p 26831 -n 26971
Console-Beep -h 523 -p 26971 -n 28078

#Change your default color scheme back in your ISE
$psISE.Options.RestoreDefaults()

Notice how we don’t actually use hard coded values on the [console]::beep and Start-Sleep functions? The reason for this is that over time, the playhead for each individual console can get off just a tiny bit depending on CPU speed and the audio output buffer. These tiny delays add up over time and cause the consoles to get out of sync with each other. In order to get around this issue, we calculate the time based on its sync with the [Diagnostics.Stopwatch].

If our fixed playhead note start time isn’t activated until after the current stopwatch time, then we subtract the delay amount from the total note, allowing the notes to catch up.

Showing The PowerShell Command Window

You may be familiar with the fact that even when deploying a .ps1 in interactive mode, the PowerShell window will not be visible on the target machine. To get around this, we’re going to run an additional PowerShell process using the Start-Process command.


Start-Process powershell.exe -ArgumentList '-Command "& {
  Write-Output \"Hello from PDQ Deploy\"
  Pause
}"'

Note the character escape on the quotations: \". Because we’re using the -Command "& { }" argument, all quotations need to be escaped.

On the PowerShell step, on the Options tab, set your Run As to Deploy User (Interactive)

Happy PowerShelling!

*2006 may not be that long ago, but in computer terms, we’re approaching ancient history.

2 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *