11name : Install PowerShell
2- description : >-
2+ description : >
33 Install a specific version —or the latest stable version— of PowerShell Core
44 on any GitHub runner (Linux, macOS, Windows).
55 Skips the install if the requested version is already present.
@@ -10,129 +10,140 @@ branding:
1010
1111inputs :
1212 Version :
13- description : >-
14- PowerShell version to install (`7.4.1`, `7.3.10`, or `latest` for the
15- newest stable release).
16- Defaults to **latest** .
13+ description : >
14+ PowerShell version to install (e.g. `7.4.1`).
15+ Use `latest`, `null`, leave it **empty**, or omit the input entirely
16+ to grab the newest stable release automatically .
1717 required : false
18- default : latest
18+ default : ' ' # Empty string → newest release
1919
2020runs :
2121 using : composite
2222 steps :
23- - name : Install PowerShell (Linux)
24- if : runner.os == 'Linux'
25- shell : bash
26- env :
27- REQUESTED_VERSION : ${{ inputs.Version }}
28- run : |
29- set -e
30-
31- # Resolve "latest" to a concrete version number (e.g. 7.4.1)
32- if [[ -z "$REQUESTED_VERSION" || "$REQUESTED_VERSION" == "latest" ]]; then
33- REQUESTED_VERSION=$(curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
34- | grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//')
35- echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
36- fi
37-
38- DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
39- if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
40- echo "PowerShell $DETECTED_VERSION already installed. Skipping."
41- exit 0
42- fi
43-
44- if command -v apt-get >/dev/null; then
45- echo "Using APT package manager (Debian/Ubuntu)…"
46-
47- if ! grep -q "packages.microsoft.com" /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null; then
48- wget -qO- https://packages.microsoft.com/keys/microsoft.asc \
49- | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc > /dev/null
50- DIST_CODENAME=$(lsb_release -cs)
51- sudo add-apt-repository \
52- "deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/ubuntu/$DIST_CODENAME/prod $DIST_CODENAME main"
23+ - name : Install PowerShell (Linux)
24+ if : runner.os == 'Linux'
25+ shell : bash
26+ env :
27+ REQUESTED_VERSION : ${{ inputs.Version }}
28+ run : |
29+ set -e
30+
31+ # Resolve empty / 'null' / 'latest' to a concrete version number
32+ if [[ -z "$REQUESTED_VERSION" || \
33+ "${REQUESTED_VERSION,,}" == "latest" || \
34+ "${REQUESTED_VERSION,,}" == "null" ]]; then
35+ REQUESTED_VERSION=$(
36+ curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
37+ | grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//'
38+ )
39+ echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
5340 fi
5441
55- sudo apt-get update -y
56- EXACT_PKG=$(apt-cache madison powershell | awk '{print $3}' \
57- | grep -E "^${REQUESTED_VERSION}(-|$)" | head -n1 || true)
42+ DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
43+ if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
44+ echo "PowerShell $DETECTED_VERSION already installed. Skipping."
45+ exit 0
46+ fi
5847
59- if [[ -n "$EXACT_PKG" ]]; then
60- sudo apt-get install -y powershell=$EXACT_PKG
48+ if command -v apt-get >/dev/null; then
49+ echo "Using APT package manager (Debian/Ubuntu)…"
50+
51+ if ! grep -q "packages.microsoft.com" /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null; then
52+ wget -qO- https://packages.microsoft.com/keys/microsoft.asc \
53+ | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc > /dev/null
54+ DIST_CODENAME=$(lsb_release -cs)
55+ sudo add-apt-repository \
56+ "deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/ubuntu/$DIST_CODENAME/prod $DIST_CODENAME main"
57+ fi
58+
59+ sudo apt-get update -y
60+ EXACT_PKG=$(apt-cache madison powershell | awk '{print $3}' \
61+ | grep -E "^${REQUESTED_VERSION}(-|$)" | head -n1 || true)
62+
63+ if [[ -n "$EXACT_PKG" ]]; then
64+ sudo apt-get install -y powershell=$EXACT_PKG
65+ else
66+ ARCH=$(dpkg --print-architecture)
67+ DEB_NAME="powershell_${REQUESTED_VERSION}-1.deb_${ARCH}.deb"
68+ URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${DEB_NAME}"
69+ wget -q "$URL" -O "$DEB_NAME"
70+ sudo dpkg -i "$DEB_NAME" || sudo apt-get -f install -y
71+ fi
6172 else
62- ARCH=$(dpkg --print-architecture)
63- DEB_NAME="powershell_${REQUESTED_VERSION}-1.deb_${ARCH}.deb"
64- URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${DEB_NAME}"
65- wget -q "$URL" -O "$DEB_NAME"
66- sudo dpkg -i "$DEB_NAME" || sudo apt-get -f install -y
73+ echo "Unsupported Linux distribution (no apt-get)."
74+ exit 1
75+ fi
76+
77+ - name : Install PowerShell (macOS)
78+ if : runner.os == 'macOS'
79+ shell : bash
80+ env :
81+ REQUESTED_VERSION : ${{ inputs.Version }}
82+ run : |
83+ set -e
84+
85+ # Resolve empty / 'null' / 'latest' to a concrete version number
86+ if [[ -z "$REQUESTED_VERSION" || \
87+ "${REQUESTED_VERSION,,}" == "latest" || \
88+ "${REQUESTED_VERSION,,}" == "null" ]]; then
89+ REQUESTED_VERSION=$(
90+ curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
91+ | grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//'
92+ )
93+ echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
6794 fi
68- else
69- echo "Unsupported Linux distribution (no apt-get)."
70- exit 1
71- fi
72-
73- - name : Install PowerShell (macOS)
74- if : runner.os == 'macOS'
75- shell : bash
76- env :
77- REQUESTED_VERSION : ${{ inputs.Version }}
78- run : |
79- set -e
80-
81- # Resolve "latest" to concrete version number
82- if [[ -z "$REQUESTED_VERSION" || "$REQUESTED_VERSION" == "latest" ]]; then
83- REQUESTED_VERSION=$(curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
84- | grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//')
85- echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
86- fi
87-
88- DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
89- if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
90- echo "PowerShell $DETECTED_VERSION already installed. Skipping."
91- exit 0
92- fi
93-
94- if brew info --cask powershell@$REQUESTED_VERSION >/dev/null 2>&1; then
95- brew install --cask powershell@$REQUESTED_VERSION
96- else
97- ARCH=$(uname -m)
98- if [[ "$ARCH" == "arm64" ]]; then
99- PKG_NAME="powershell-${REQUESTED_VERSION}-osx-arm64.pkg"
95+
96+ DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
97+ if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
98+ echo "PowerShell $DETECTED_VERSION already installed. Skipping."
99+ exit 0
100+ fi
101+
102+ if brew info --cask powershell@$REQUESTED_VERSION >/dev/null 2>&1; then
103+ brew install --cask powershell@$REQUESTED_VERSION
100104 else
101- PKG_NAME="powershell-${REQUESTED_VERSION}-osx-x64.pkg"
105+ ARCH=$(uname -m)
106+ if [[ "$ARCH" == "arm64" ]]; then
107+ PKG_NAME="powershell-${REQUESTED_VERSION}-osx-arm64.pkg"
108+ else
109+ PKG_NAME="powershell-${REQUESTED_VERSION}-osx-x64.pkg"
110+ fi
111+ URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${PKG_NAME}"
112+ curl -sSL "$URL" -o "$PKG_NAME"
113+ sudo installer -pkg "$PKG_NAME" -target /
102114 fi
103- URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${PKG_NAME}"
104- curl -sSL "$URL" -o "$PKG_NAME"
105- sudo installer -pkg "$PKG_NAME" -target /
106- fi
107-
108- - name : Install PowerShell (Windows)
109- if : runner.os == 'Windows'
110- shell : powershell
111- env :
112- REQUESTED_VERSION : ${{ inputs.Version }}
113- run : |
114- # Resolve "latest" to concrete version number
115- if (-not $env:REQUESTED_VERSION -or $env:REQUESTED_VERSION -eq 'latest') {
116- $latest = (Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest').tag_name.TrimStart('v')
117- Write-Host "Latest stable PowerShell release detected: $latest"
118- $env:REQUESTED_VERSION = $latest
119- }
120-
121- try {
122- $detected = (pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')
123- } catch {
124- $detected = $null
125- }
126-
127- Write-Host "Detected PowerShell version: $detected"
128- Write-Host "Requested PowerShell version: $env:REQUESTED_VERSION"
129-
130- if ($detected -eq $env:REQUESTED_VERSION) {
131- Write-Host "PowerShell $detected already installed. Skipping."
132- exit 0
133- }
134-
135- $msi = "PowerShell-$($env:REQUESTED_VERSION)-win-x64.msi"
136- $url = "https://github.com/PowerShell/PowerShell/releases/download/v$($env:REQUESTED_VERSION)/$msi"
137- Invoke-WebRequest -Uri $url -OutFile $msi -UseBasicParsing
138- Start-Process msiexec.exe -ArgumentList '/i', $msi, '/quiet', '/norestart' -Wait
115+
116+ - name : Install PowerShell (Windows)
117+ if : runner.os == 'Windows'
118+ shell : powershell
119+ env :
120+ REQUESTED_VERSION : ${{ inputs.Version }}
121+ run : |
122+ # Resolve empty / 'null' / 'latest' to a concrete version number
123+ $req = $env:REQUESTED_VERSION
124+ if ([string]::IsNullOrWhiteSpace($req) -or
125+ ($req.Trim().ToLower() -in @('latest','null'))) {
126+
127+ $latest = (Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest').tag_name.TrimStart('v')
128+ Write-Host "Latest stable PowerShell release detected: $latest"
129+ $env:REQUESTED_VERSION = $latest
130+ }
131+
132+ try {
133+ $detected = (pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')
134+ } catch {
135+ $detected = $null
136+ }
137+
138+ Write-Host "Detected PowerShell version: $detected"
139+ Write-Host "Requested PowerShell version: $env:REQUESTED_VERSION"
140+
141+ if ($detected -eq $env:REQUESTED_VERSION) {
142+ Write-Host "PowerShell $detected already installed. Skipping."
143+ exit 0
144+ }
145+
146+ $msi = "PowerShell-$($env:REQUESTED_VERSION)-win-x64.msi"
147+ $url = "https://github.com/PowerShell/PowerShell/releases/download/v$($env:REQUESTED_VERSION)/$msi"
148+ Invoke-WebRequest -Uri $url -OutFile $msi -UseBasicParsing
149+ Start-Process msiexec.exe -ArgumentList '/i', $msi, '/quiet', '/norestart' -Wait
0 commit comments