You adopted PowerShell Core 6 early. You moved scripts to .NET Core. You dealt with the compatibility issues. Now Microsoft wants you to upgrade again.
Here’s why it matters: PowerShell Core 6 is no longer supported. Your scripts still run, but you’re missing security patches, performance improvements, and features that make PowerShell 7.5 worth the upgrade.
The good news? Moving from Core 6 to 7.5 is easier than the jump from Windows PowerShell. Most scripts work unchanged. But “most” isn’t “all,” and the differences matter.
Why PowerShell 7 Replaced Core 6
PowerShell Core 6 was the experiment. It proved PowerShell could run cross-platform but broke too many things. Enterprises complained. Scripts failed. Microsoft listened.
PowerShell 7 fixed the problems:
- Restored compatibility with more Windows PowerShell modules
- Improved .NET runtime performance
- Added back missing cmdlets
- Unified the PowerShell versioning (no more “Core” in the name)
PowerShell 7.5 (stable, non-LTS) is built on .NET 9 and is supported until May 12, 2026. PowerShell 7.4 (LTS) runs on .NET 8 and is supported until November 10, 2026. Check the PowerShell support lifecycle for complete details.
Breaking Changes from Core 6
These changes will affect your scripts:
Encoding Consistency
Since PowerShell 6, the default text encoding is UTF-8 without BOM for most text cmdlets. This hasn’t changed in 7.5, but specify -Encoding explicitly when interoperability requires it:
# Both Core 6 and 7.5 default to UTF-8 without BOM
Get-Content file.txt | Out-File output.txt
# Specify encoding when working with legacy systems
Get-Content file.txt | Out-File output.txt -Encoding UTF8BOM
For complete encoding details, see about_Character_Encoding.
Error View Changes
PowerShell 7 introduced ConciseView as the default error display and the new Get-Error cmdlet:
# PowerShell 7.5 - Cleaner error display by default
$ErrorView = 'ConciseView' # This is the default
# Use Get-Error for detailed error information
Get-Error -Newest 5
Learn more about error handling in about_Preference_Variables.
Test-Connection Cmdlet Rewritten
The Test-Connection cmdlet parameter names changed completely. The -ComputerName parameter from PowerShell 5.1 became -TargetName in Core 6+:
# Core 6 and 7.5 - Use -TargetName
Test-Connection -TargetName server01 -Count 2
# PowerShell 7.5 - Additional parameters available
Test-Connection -TargetName server01 -Count 2 -IPv4
See Test-Connection documentation for all parameters.
Web Cmdlets Proxy Behavior
In PowerShell 7.0+, web cmdlets support proxy configuration via environment variables and explicit -Proxy parameter:
# PowerShell 7.5 - Honors proxy environment variables
$env:HTTP_PROXY = 'http://proxy:8080'
Invoke-WebRequest -Uri 'https://api.example.com'
# Or use explicit proxy
Invoke-WebRequest -Uri 'https://api.example.com' -Proxy 'http://proxy:8080'
Details in Invoke-WebRequest documentation.
Quick Win: Chain Operators Replace verbose
if ($?)blocks with&&and||operators to fail fast in CI/CD pipelines. Example:Build-Project && Deploy-Project
Performance Improvements
PowerShell 7.x generally starts and runs faster than Core 6 due to .NET runtime improvements. Rather than rely on generic percentages, benchmark your scripts with Measure-Command on your hardware:
# Measure startup time
Measure-Command { pwsh -Command "exit" }
# Compare ForEach-Object performance
$data = 1..100000
Measure-Command {
$data | ForEach-Object { $_ * 2 }
}
# Test parallel performance (new in PowerShell 7)
Measure-Command {
$data | ForEach-Object -Parallel { $_ * 2 } -ThrottleLimit 5
}
New Features Since Core 6
PowerShell 7.5 adds features that weren’t in Core 6. See What’s New in PowerShell 7.5 for complete list.
Parallel Processing
ForEach-Object -Parallel was introduced in PowerShell 7.0 and didn’t exist in Core 6:
# Core 6 - Sequential processing only
$servers = Get-Content servers.txt
$servers | ForEach-Object {
Test-Connection -TargetName $_ -Count 1
}
# PowerShell 7.5 - Parallel execution
$servers | ForEach-Object -Parallel {
Test-Connection -TargetName $_ -Count 1
} -ThrottleLimit 10
Pipeline Chain Operators
Pipeline chain operators (&& and ||) let you fail fast in pipelines without verbose if ($?) blocks:
# Core 6 - Manual error checking
$result = Start-Service 'Spooler'
if ($?) {
Write-Output "Service started"
}
# PowerShell 7.5 - Chain operators
Start-Service 'Spooler' && Write-Output "Service started"
Learn more: about_Pipeline_Chain_Operators
Null Coalescing Operators
Null coalescing operators (?? and ??=) reduce null-checking code:
# Core 6 - Verbose null checking
if ($null -eq $config) {
$config = Get-DefaultConfig
}
# PowerShell 7.5 - Null coalescing assignment
$config ??= Get-DefaultConfig
Details: about_Assignment_Operators
Out-GridView Returns
Out-GridView is available again on Windows in PowerShell 7+. For cross-platform scenarios, use Out-ConsoleGridView from the ConsoleGuiTools module:
# PowerShell 7.5 on Windows
Get-Process | Out-GridView -Title "Select Process" -PassThru
# Cross-platform alternative
Install-Module ConsoleGuiTools -Scope CurrentUser
Get-Process | Out-ConsoleGridView
See Out-GridView documentation.
Module Compatibility Updates
PowerShell 7.5 supports more modules than Core 6:
Native Support Added
These modules now work with PowerShell 7 (version requirements vary):
- Active Directory (with RSAT, Windows only): Works with PowerShell 7.
- Exchange Online Management v3: Module version 2.0.4 and later are supported in PowerShell 7.0.3 and later.
- SharePoint Online Management Shell: Works with PowerShell 7, but requires using the
-UseWindowsPowerShellparameter for compatibility. - Microsoft Teams: Requires PowerShell 7.2 or later.
Import Changes
Module importing provides better error messages:
# PowerShell 7.5 - Use compatibility mode for Windows-only modules
Import-Module SomeWindowsModule -UseWindowsPowerShell
Gotcha: JSON Depth Defaults
ConvertTo-Jsondefaults to Depth=2 (not 100!). Always set-Depthexplicitly to prevent data truncation:$object | ConvertTo-Json -Depth 5
Installation and Side-by-Side Behavior
Critical Installation Notes for Windows
On Windows, installing PowerShell 7:
- Removes PowerShell Core 6.x and replaces its PATH entry
- Runs side-by-side with Windows PowerShell 5.1
- Upgrades any existing PowerShell 7.x installation
See Installing PowerShell on Windows for details.
Installation Steps
# Windows - Using winget
winget install --id Microsoft.PowerShell --exact
# Linux - Using package manager
sudo apt-get update
sudo apt-get install -y powershell
# macOS - Using Homebrew
brew install --cask powershell
Verify Installation
$PSVersionTable.PSVersion
Common Upgrade Issues
JSON Cmdlet Depth
ConvertTo-Json defaults to Depth=2 (warns when exceeded). ConvertFrom-Json defaults to Depth=1024:
# ConvertTo-Json defaults to depth 2 - set it explicitly
$object | ConvertTo-Json -Depth 5 # Prevents truncation
# ConvertFrom-Json handles deeply nested JSON (depth 1024)
$json | ConvertFrom-Json
Reference: ConvertTo-Json documentation
Experimental Features
Core 6 experimental features changed in 7.5:
# List current experimental features
Get-ExperimentalFeature
# Enable specific features
Enable-ExperimentalFeature -Name PSCommandNotFoundSuggestion
Module Path Updates
Check and update module paths:
# View PowerShell 7.5 module paths
$env:PSModulePath -split [IO.Path]::PathSeparator
Testing Your Migration
Create a structured testing approach:
Syntax Analysis
Install-Module -Name PSScriptAnalyzer -Force
Invoke-ScriptAnalyzer -Path "C:\Scripts" -Recurse
Module Compatibility
$modules = 'Az', 'VMware.PowerCLI', 'ExchangeOnlineManagement'
$modules | ForEach-Object {
try {
Import-Module $_ -ErrorAction Stop
Write-Output "$_ loaded successfully"
} catch {
Write-Warning "$_ failed: $_"
}
}
Performance Comparison
# Benchmark in both versions
Measure-Command { & "C:\Scripts\critical-script.ps1" }
Making the Decision
The upgrade from Core 6 to PowerShell 7.5 is straightforward for most scripts. Start with development environments. Test critical scripts. Document required changes.
Remember:
- PowerShell Core 6 is no longer supported.
- PowerShell 7.4 LTS is supported until November 10, 2026.
- PowerShell 7.5 (non-LTS) is supported until May 12, 2026.
Next Steps
- Review the PowerShell support lifecycle
- Download from the official installation guide
- Test with PSScriptAnalyzer
- Check What’s New in PowerShell 7.5
- Review migration documentation
Your Core 6 investment wasn’t wasted. It proved that PowerShell could go cross-platform. Now, PowerShell 7.5 delivers on that promise with better performance, compatibility, and support.