<# .SYNOPSIS Invoke a graphical application on X-Server. .DESCRIPTION Invoke a graphical application, making sure an X server connection is active, start the x-server if needed, and if the application is remote, make sure the remote session has the correct DISPLAY values set. .INPUTS Inputs to this cmdlet (if any) .OUTPUTS Output from this cmdlet (if any) .NOTES General notes .EXAMPLE Invoke-XApp xclock .EXAMPLE Invoke-XApp xclock -Remote remote@example.com .COMPONENT The component this cmdlet belongs to .ROLE The role this cmdlet belongs to .FUNCTIONALITY The functionality that best describes this cmdlet #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] #[OutputType([String])] # # Param2 help description # [Parameter(ParameterSetName='Parameter Set 1')] # [AllowNull()] # [AllowEmptyCollection()] # [AllowEmptyString()] # [ValidateScript({$true})] # [ValidateRange(0,5)] # [int] # $Param2, # # Param3 help description # [Parameter(ParameterSetName='Another Parameter Set')] # [ValidatePattern("[a-z]*")] # [ValidateLength(0,15)] # [String] # $Param3 Param ( # Param1 help description [Parameter(Mandatory, Position = 0, ParameterSetName = 'Parameter Set 1')] [string[]]$Command, [string[]]$Remote, [ValidateSet('pwsh', 'bash', 'zsh', 'sh')] [string]$RemoteShell = 'pwsh', [string]$PrivateKeyPath ) begin { $null = Get-Command 'xlaunch' -ErrorAction Stop if ( -not $(Get-Process -ProcessName 'vcxsrv' -ErrorAction SilentlyContinue) ) { $local:LaunchCfg = $env:XLAUNCH_CONFIG if ( -not $env:XLAUNCH_CONFIG ) { New-TemporaryFile | Tee-Object -Variable 'LaunchCfg' | Remove-Item } Write-Verbose "LaunchCfg=$LaunchCfg" if ( -not (Test-Path $LaunchCfg) ) { Write-Verbose "Creating missing $LaunchCfg..." New-Item -ItemType File -Path $LaunchCfg -Value @( '' , '' ) } & xlaunch --run $LaunchCfg } } process { if ( -not "Command" ) { Write-Warning "No command supplied, exiting." return } if ($pscmdlet.ShouldProcess("Target", "Operation")) { if ( $Remote ) { $local:RemoteCommand = "bash", "-c", "'DISPLAY=`"localhost:`"`$( xauth list | awk `"{ print `$1 }`" | cut -d: -f2 | tail -1 ) $Command'" & ssh -i $PrivateKeyPath $Remote $RemoteCommand } } } end { }