[CmdletBinding()] Param ( [Parameter()] [Boolean]$Close = $True, [Parameter()] [String]$Command = "Echo-VMs", [Parameter()] [String]$GalleryPath = "gallery", [Parameter()] [String]$ffmpegPath = "ffmpeg.exe", #[String]$ffmpegPath = "ffmpeg.exe" [Parameter()] [String]$ffmpegWrapperPath = "start-encoder.bat", [Parameter()] [String]$SetWindowPath = "Set-Window.ps1", [Parameter()] [String]$Temperature = "Warm", [Parameter()] [String]$VMPath = "", [Parameter()] [String]$VMOPath = "VirtualMachineObject.dll", [Parameter()] [String]$VMRCPath = "vmrc.exe", [Parameter()] [String]$VMRCURL = "vmrc://foo@127.0.0.1/?moid=", [Parameter()] [Object[]]$VMs = @( #Essential services @{Name="nexus"; Interactive = 0; StartupDelayWarm=15; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0},#timed @{Name="joy"; Interactive = 0; StartupDelayWarm=15; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0},#timed #Option VMs @{Name="liberty"; Interactive = 2; StartupDelayWarm=150; StartupDelayCold=425; SkipStartup=0; SkipShutdown=0},#timed @{Name="Olympus"; Interactive = 2; StartupDelayWarm=70; StartupDelayCold=375; SkipStartup=0; SkipShutdown=0},#timed #@{Name="excess"; Interactive = 1; StartupDelayWarm=25; StartupDelayCold=275; SkipStartup=1; SkipShutdown=1},#timed #@{Name="Media Center 8.1"; Interactive = 2; StartupDelayWarm=40; StartupDelayCold=375; SkipStartup=0; SkipShutdown=0},#timed #@{Name="qube"; Interactive = 0; StartupDelayWarm=20; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0},#timed #Other services #@{Name="NetBSD 9 i386 debugger"; Interactive = 2; StartupDelayWarm=70; StartupDelayCold=275; SkipStartup=1; SkipShutdown=0},#timed @{Name="BionicBeaver"; Interactive = 2; StartupDelayWarm=50; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0; Encode="VMWW"; InputSize="1920x1080"; OutputSize="384x216"; FrameRate=15; OffsetX=0; OffsetY=0; OtherOptions=""},#timed @{Name="Hyper-V (unsupported)"; Interactive = 0; StartupDelayWarm=70; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0},#timed @{Name="Ubuntu 20.04 64-bit"; Interactive = 2; StartupDelayWarm=70; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0},#timed @{Name="NetBSD32"; Interactive = 2; StartupDelayWarm=70; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0},#timed @{Name="VMware ESXi 7.x"; Interactive = 0; StartupDelayWarm=70; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0},#timed #Screensavers @{Name="bliss"; Interactive = 1; StartupDelayWarm=15; StartupDelayCold=275; SkipStartup=0; SkipShutdown=0; Encode="VMWW"; InputSize="640x480"; OutputSize="640x480"; FrameRate=30; OffsetX=3; OffsetY=70; OtherOptions=""},#timed @{Name="ebbe"; Interactive = 1; StartupDelayWarm=15; StartupDelayCold=375; SkipStartup=0; SkipShutdown=0; Encode="VMWW"; InputSize="512x384"; OutputSize="320x240"; FrameRate=30; OffsetX=3; OffsetY=70; OtherOptions=""},#timed #@{Name="freedom"; Interactive = 2; StartupDelayWarm=30; StartupDelayCold=375; SkipStartup=0; SkipShutdown=0; Encode="VMWW"; InputSize="1920x1080"; OutputSize="160x90"; FrameRate=30; OffsetX=0; OffsetY=0; OtherOptions=""},#timed #Nested, remote or other screensavers @{Name="ESXi-1"; Encode="VMRC"; InputSize="1360x768"; OutputSize="720x480"; FrameRate=30; OffsetX=0; OffsetY=33; OtherOptions=""; VMRCI=8},#timed @{Name="ESXi-2"; Encode="VMRC"; InputSize="1920x1080"; OutputSize="720x480"; FrameRate=30; OffsetX=0; OffsetY=0; OtherOptions=""; VMRCI=2},#timed #@{Name="fishtank-01"; Encode="VMRC"; InputSize="1360x768"; OutputSize="720x480"; FrameRate=30; OffsetX=0; OffsetY=33; OtherOptions=""; VMRCI=10},#timed @{Name="millenium"; Encode="VMRC"; InputSize="640x480"; OutputSize="640x480"; FrameRate=30; OffsetX=0; OffsetY=33; OtherOptions=""; VMRCI=11}#timed ), [Parameter()] [String[]]$VMsSubset = @() ) ############################################################################### # # Manage-Alchemy.ps1, Copyright 2020, by Josh Moyer # All rights reserved. # # Another great PS script! :-) # ############################################################################### Function StartEncoder($VM) { If ((Test-Path $GalleryPath) -EQ $False) { Write-Error "Mount the gallery share and try again." Return } Set-Location "$($GalleryPath)" $ErrorActionPreference = "Continue" mkdir $VM.Name $ErrorActionPreference = "Stop" Set-Location $VM.Name If ((Get-Location).Path -EQ "$($GalleryPath)\$($VM.Name)") { Remove-Item * } Else { Write-Error "Couldn't set encoder path." Return } Switch ($VM.Encode) { "VMRC" { $WindowTitle = "$($VM.Name) - VMware Remote Console" Start-Process $VMRCPath "$($VMRCURL)$($VM.VMRCI)" Wait-Event -Timeout 10 (New-Object -ComObject WScript.Shell).SendKeys("`n") Wait-Event -Timeout 10 Break } "VMWW" { $WindowTitle = "$($VM.Name) - VMware Workstation" Break } } & Start-Process -WorkingDirectory "$($GalleryPath)\$($VM.Name)" -FilePath $ffmpegWrapperPath -ArgumentList @($VM.Name,"`"$($ffmpegPath)`"",$VM.FrameRate,$VM.InputSize,"`"$($WindowTitle)`"",$VM.OutputSize,$VM.OffsetX,$VM.OffsetY) } Function StartVM($VM, $Interactive, $Temperature) { If ($VM.SkipStartup) { Return } $VMX = "$VMPath$($VM.Name)\$($VM.Name).vmx" $VMObj = New-Object -TypeName NDDN.VirtualMachines.VirtualMachine -ArgumentList $VMX Write-Output "$($VM.Name)" If ($VM.SkipStartup -NE $Null) { Start-VM $VMObj -Interactive $Interactive If ($Interactive -AND $Temperature -EQ "Cold") { Wait-Event -Timeout $VM.StartupDelayCold } If ($Interactive -AND $Temperature -EQ "Instant") { Wait-Event -Timeout 5 } If ($Interactive -AND $Temperature -EQ "Warm") { Wait-Event -Timeout $VM.StartupDelayWarm } } If ($VM.Encode) { StartEncoder $VM } } Function StopEncoder($VM) { & TASKKILL "/FI" "WINDOWTITLE eq $($VM.Name)" Wait-Event -Timeout 1 Switch ($VM.Encode) { "VMRC" { & TASKKILL "/FI" "WINDOWTITLE eq $($VM.Name) - VMware Remote Console" Break } # "VMWW" # { # & TASKKILL "/FI" "WINDOWTITLE eq $($VM.Name) - VMware Workstation" # Break # } } } Function SuspendVM($VM, $Close) { If ($VM.SkipShutdown) { Return } $VMX = "$VMPath$($VM.Name)\$($VM.Name).vmx" $VMObj = New-Object -TypeName NDDN.VirtualMachines.VirtualMachine -ArgumentList $VMX Write-Output $VM.Name If ($VM.Encode) { StopEncoder $VM } If ($VM.SkipShutdown -NE $Null) { Unpause-VM $VMObj Suspend-VM $VMObj } Wait-Event -Timeout 3 If ($Close) { & TASKKILL "/FI" "WINDOWTITLE eq $($VM.Name) - VMware Workstation" } } Function Main { $DebugPreference = "Continue" $ErrorActionPreference = "Stop" Import-Module $VMOPath If ($VMsSubset) { ForEach ($VMName in $VMsSubset) { $FoundVM = $False ForEach ($VM in $VMs) { If ($VMName -EQ $VM.Name) { $NewVMs += ,@($VM) $FoundVM = $True } } If ($FoundVM -EQ $False) { Write-Error "VM not found." Return } } $VMs = $NewVMs } If ( $Command -EQ "Echo-VMs" -OR $Command -EQ "Stop-Encoders" -OR $Command -EQ "Suspend-VMs" ) { [array]::Reverse($VMs) } ForEach ($VM in $VMs) { Switch ($Command) { "Echo-VMs" { Write-Output $VM.Name ; Break } "Start-Encoders" { StartEncoder $VM ; Break } "Start-VMs" { StartVM $VM $VM.Interactive $Temperature ; Break } "Stop-Encoders" { StopEncoder $VM ; Break } "Suspend-VMs" { SuspendVM $VM $Close ; Break } #"Toggle" { Depends on current state of NDDN.VirtualMachines } } } Remove-Module VirtualMachineObject Return } Main