Migrating from PowerShell 6 to 7.5: Breaking Changes/New Features

Published:28 October 2025 - 4 min. read

Audit your Active Directory for weak passwords and risky accounts. Run your free Specops scan now!

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):

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-Json defaults to Depth=2 (not 100!). Always set -Depth explicitly 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

  1. Review the PowerShell support lifecycle
  2. Download from the official installation guide
  3. Test with PSScriptAnalyzer
  4. Check What’s New in PowerShell 7.5
  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.

Hate ads? Want to support the writer? Get many of our tutorials packaged as an ATA Guidebook.

Explore ATA Guidebooks

Looks like you're offline!