Universal.psm1
[UniversalAutomation.AssemblyResolver]::Bind() function Resolve-Variable { [CmdletBinding()] param($Name) $PSCmdlet.GetVariableValue($Name) } function Start-PSUServer { [CmdletBinding()] param( [Parameter()] [string]$ExecutablePath, [Parameter()] [string]$ListenAddress, [Parameter()] [int]$Port, [Parameter()] [ScriptBlock]$Configuration ) if ([UniversalAutomation.RemoteCommand]::Configuration) { & $Configuration return } if (-not $PSBoundParameters.ContainsKey("ExecutablePath")) { $ExecutablePath = "Universal.Server" if ($PSVersionTable.PSEdition -eq 'Desktop' -or $IsWindows) { $ExecutablePath = "Universal.Server.exe" } } $Command = Get-Command $ExecutablePath -ErrorAction SilentlyContinue if ($null -eq $Command) { $ExecutablePath = Join-Path $PSScriptRoot $ExecutablePath $Command = Get-Command $ExecutablePath -ErrorAction SilentlyContinue if ($null -eq $Command) { throw 'Unable to locate the Universal Server executable. You can use Install-PSUServer the server for your platform. Use the -AddToPath parameter to add the installation directory the the PATH.' } } if ($PSVersionTable.PSEdition -ne 'Desktop' -and -not $IsWindows) { try { chmod +x $ExecutablePath } catch { Write-Warning "Failed to set executable flag. You may have to run 'chmod +x' yourself on $ExecutablePath. $_" } } if ($ListenAddress) { $Env:Kestrel__Endpoints__HTTP__Url = $ListenAddress } elseif ($PSBoundParameters.ContainsKey("Port")) { $Env:Kestrel__Endpoints__HTTP__Url = "http://localhost:$port" } if ($Configuration) { $scriptName = (Get-PSCallStack | Select-Object -Last 1).ScriptName if (-not $scriptName) { $scriptName = (Get-PSCallStack | Select-Object -Last 1 -Skip 1).ScriptName } $Env:Data__ConfigurationScript = $scriptName } $Process = Start-Process -FilePath $ExecutablePath -PassThru $Process } function Install-PSUServer { [CmdletBinding(DefaultParameterSetName = "Version")] param( [Parameter()] [string]$Path, [Parameter()] [Switch]$AddToPath, [Parameter(ParameterSetName = "Version")] [string]$Version = (Get-Module Universal).Version, [Parameter(ParameterSetName = "Latest")] [Switch]$LatestVersion ) if ([UniversalAutomation.RemoteCommand]::Configuration) { return } $platform = "win7-x64"; if ($PSVersionTable.Edition -eq 'Core') { if ($IsLinux) { $platform = "linux-x64" } else { $platform = "osx-x64" } } if (-not $Path) { $Path = Join-Path $Env:ProgramData "PowerShellUniversal" } if ($LatestVersion) { $Version = (Invoke-WebRequest https://imsreleases.blob.core.windows.net/universal/production/version.txt).Content } Invoke-WebRequest "https://imsreleases.blob.core.windows.net/universal/production/$version/Universal.$platform.$Version.zip" -OutFile ".\Universal.$version.$platform.zip" Expand-Archive -Path ".\Universal.$Version.$platform.zip" -DestinationPath $Path -Force Remove-Item ".\Universal.$Version.$platform.zip" -Force Get-ChildItem $Path -Recurse | Unblock-File if ($AddToPath) { $Scope = 'User' if ($platform -eq 'win7-x64' -and ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { $Scope = 'Machine' } $envPath = [Environment]::GetEnvironmentVariable('PATH', $Scope) $newpath = $envPath + ";" + $Path [Environment]::SetEnvironmentVariable("PATH", $newpath, $Scope) $Env:Path += ";" + $newpath } } |