5151 -H "Authorization: Bearer $GITHUB_TOKEN" \
5252 -H "X-GitHub-Api-Version: 2022-11-28" \
5353 https://api.github.com/repos/PowerShell/PowerShell/releases |
54- jq -r '[.[] | select(.prerelease == true)] | .[0].tag_name' | sed 's/^v//'
54+ jq -r '[.[] | select(.prerelease == true)] | ( .[0].tag_name // empty) ' | sed 's/^v//'
5555 )
56+ if [[ -z "$REQUESTED_VERSION" ]]; then
57+ echo "Error: No prerelease PowerShell releases found when resolving latest prerelease."
58+ exit 1
59+ fi
5660 echo "Latest prerelease PowerShell version detected: $REQUESTED_VERSION"
5761 else
5862 REQUESTED_VERSION=$(
@@ -115,6 +119,17 @@ runs:
115119 fi
116120 echo "Installation complete. PowerShell [$REQUESTED_VERSION] is now available."
117121
122+ # For prerelease builds, add the install directory to GITHUB_PATH so subsequent
123+ # `shell: pwsh` steps resolve to the version we just installed.
124+ if [[ "$REQUESTED_VERSION" == *-* ]]; then
125+ MAJOR_VERSION=$(echo "$REQUESTED_VERSION" | cut -d'.' -f1)
126+ INSTALL_DIR="/opt/microsoft/powershell/${MAJOR_VERSION}-preview"
127+ if [[ -d "$INSTALL_DIR" ]]; then
128+ echo "Adding install directory to GITHUB_PATH: $INSTALL_DIR"
129+ echo "$INSTALL_DIR" >> "$GITHUB_PATH"
130+ fi
131+ fi
132+
118133 - name : Install PowerShell (macOS)
119134 if : runner.os == 'macOS'
120135 shell : bash
@@ -139,8 +154,12 @@ runs:
139154 -H "Authorization: Bearer $GITHUB_TOKEN" \
140155 -H "X-GitHub-Api-Version: 2022-11-28" \
141156 https://api.github.com/repos/PowerShell/PowerShell/releases |
142- jq -r '[.[] | select(.prerelease == true)] | .[0].tag_name' | sed 's/^v//'
157+ jq -r '[.[] | select(.prerelease == true)] | ( .[0].tag_name // empty) ' | sed 's/^v//'
143158 )
159+ if [[ -z "$REQUESTED_VERSION" ]]; then
160+ echo "Error: No prerelease PowerShell releases found when resolving latest prerelease."
161+ exit 1
162+ fi
144163 echo "Latest prerelease PowerShell version detected: $REQUESTED_VERSION"
145164 else
146165 REQUESTED_VERSION=$(
@@ -190,6 +209,17 @@ runs:
190209 sudo installer -pkg "$PKG_NAME" -target /
191210 echo "Installation complete. PowerShell [$REQUESTED_VERSION] is now available."
192211
212+ # For prerelease builds, add the install directory to GITHUB_PATH so subsequent
213+ # `shell: pwsh` steps resolve to the version we just installed.
214+ if [[ "$REQUESTED_VERSION" == *-* ]]; then
215+ MAJOR_VERSION=$(echo "$REQUESTED_VERSION" | cut -d'.' -f1)
216+ INSTALL_DIR="/usr/local/microsoft/powershell/${MAJOR_VERSION}-preview"
217+ if [[ -d "$INSTALL_DIR" ]]; then
218+ echo "Adding install directory to GITHUB_PATH: $INSTALL_DIR"
219+ echo "$INSTALL_DIR" >> "$GITHUB_PATH"
220+ fi
221+ fi
222+
193223 - name : Install PowerShell (Windows)
194224 if : runner.os == 'Windows'
195225 shell : powershell
@@ -213,7 +243,12 @@ runs:
213243 }
214244 if ($env:PRERELEASE -eq 'true') {
215245 $releases = Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases' -Headers $headers
216- $latest = ($releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1).tag_name.TrimStart('v')
246+ $latestRelease = $releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1
247+ if (-not $latestRelease) {
248+ Write-Host "Error: No prerelease PowerShell releases are available from GitHub."
249+ exit 1
250+ }
251+ $latest = $latestRelease.tag_name.TrimStart('v')
217252 Write-Host "Latest prerelease PowerShell version detected: $latest"
218253 } else {
219254 $latest = (Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' -Headers $headers).tag_name.TrimStart('v')
@@ -252,8 +287,10 @@ runs:
252287 Write-Host "Downgrade detected: $detected → $($env:REQUESTED_VERSION)"
253288 $isDowngrade = $true
254289 } elseif ($detectedVersion -eq $requestedVersion -and $detected -ne $env:REQUESTED_VERSION) {
255- # Same base version but different prerelease label, treat as a reinstall
256- Write-Host "Version change detected (same base, different label): $detected → $($env:REQUESTED_VERSION)"
290+ # Same base version but different prerelease label — MSI installers cannot
291+ # handle cross-prerelease changes in-place, so force uninstall first.
292+ Write-Host "Prerelease version change detected (same base, different label): $detected → $($env:REQUESTED_VERSION)"
293+ $isDowngrade = $true
257294 } else {
258295 Write-Host "Upgrade detected: $detected → $($env:REQUESTED_VERSION)"
259296 }
@@ -272,14 +309,14 @@ runs:
272309 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
273310 )
274311
275- $isDetectedPreview = $detected -match '-preview|\ -rc'
312+ $isDetectedPreview = $detected -match '-preview|-rc'
276313 $pwshEntries = Get-ItemProperty -Path $regPaths -ErrorAction SilentlyContinue |
277314 Where-Object {
278315 $_.Publisher -eq 'Microsoft Corporation' -and
279316 $_.DisplayName -like 'PowerShell 7*' -and
280317 $(if ($isDetectedPreview) { $_.DisplayName -like '*Preview*' } else { $_.DisplayName -notlike '*Preview*' }) -and
281318 $_.DisplayVersion -and
282- $_.DisplayVersion.StartsWith( ($detected -split '-')[0])
319+ ( $_.DisplayVersion -match "^$([regex]::Escape(($detected -split '-')[0]))([.\-]|$)" -or $_.DisplayVersion -eq ($detected -split '-')[0])
283320 }
284321
285322 $targetEntry = $pwshEntries | Select-Object -First 1
@@ -337,10 +374,11 @@ runs:
337374 # resolve to the version we just installed — even for preview builds whose
338375 # install directory (7-preview) is not on the runner's default PATH.
339376 $isPrerelease = $env:REQUESTED_VERSION -match '-'
377+ $majorVersion = ($env:REQUESTED_VERSION -split '[.\-]')[0]
340378 $installDir = if ($isPrerelease) {
341- "$env:ProgramFiles\PowerShell\7 -preview"
379+ "$env:ProgramFiles\PowerShell\$majorVersion -preview"
342380 } else {
343- "$env:ProgramFiles\PowerShell\7 "
381+ "$env:ProgramFiles\PowerShell\$majorVersion "
344382 }
345383 if (Test-Path $installDir) {
346384 Write-Host "Adding install directory to GITHUB_PATH: $installDir"
0 commit comments