Contents

What Happened in PowerShell This Summer


Third roundup of the year, covering August and September, plus what October brought so far: three patch waves and the first 7.7 release candidate. The previous one ran up to the end of July. Pester had a busy summer too, with two feature releases in five weeks — more on that below.

If you only read one section, make it this one. PowerShell 7.4 LTS and 7.5 both reach end of support on November 10, 2026, together with .NET 8 and .NET 9. I wrote a separate short post on what that means and where 7.4 tends to hide (Azure Functions, Automation runbooks, build agents). Short version: get onto 7.6 LTS.

Two more previews of 7.7, which is built on .NET 11 and will be a non-LTS release — and this week, the first release candidate.

7.7.0-preview.4 (September 1):

  • A new New-TemporaryDirectory cmdlet, the folder counterpart to New-TemporaryFile. A community contribution, and one of those “how was this not there already” additions
  • Invoke-WebRequest got better output file path detection and changed how the Authorization header is handled on redirects — worth testing if you call APIs that redirect
  • Security hardening in remoting: tighter argument validation and validation of PSRP (PowerShell Remoting Protocol) message fragments
  • Ubuntu 26.04 packages

7.7.0-preview.5 (September 23) moved to .NET 11 RC1 and has two changes I’d call out.

Compact output, aimed at AI agents. A new opt-in setting makes the implicit table and wide views autosize their columns:

$PSStyle.AutoSizeDefaultFormatting = $true

The motivation in the pull request is explicit: “This allows PowerShell to generate less verbose output when used by an agent.” When an AI coding assistant runs Get-Process for you, every padded space in that table costs tokens and context. It also helps in a narrow terminal. List views and complex objects still stream as before. It was backported to 7.6.7, so you can try it on the LTS today.

Get-Process -Name pwsh | Out-Host
$PSStyle.AutoSizeDefaultFormatting = $true
Get-Process -Name pwsh | Out-Host
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     60    39,96      97,50       1,03    8384   1 pwsh
    105    53,55     188,41       9,34   16852   1 pwsh
    153    98,34     286,98     100,36   21868   1 pwsh


NPM(K) PM(M)  WS(M) CPU(s)    Id SI ProcessName
------ -----  ----- ------    -- -- -----------
    60 39,59  98,19   1,08  8384  1 pwsh
   105 53,55 188,41   9,34 16852  1 pwsh
   153 98,34 286,98 100,36 21868  1 pwsh

Same processes, same data, but every column is only as wide as it needs to be. The | Out-Host matters in this demo: without it, both commands write into one and the same table, which keeps the first command’s layout, so you’d see no difference at all.

A broken user config file no longer stops PowerShell from starting. If your per-user powershell.config.json can’t be read — bad JSON, wrong permissions, or OneDrive’s file provider not running yet when you open a terminal — PowerShell now falls back to the defaults and writes a warning, instead of failing. The system-wide config still fails hard, which makes sense: it’s admin-owned, and on Linux and macOS it’s where some security policies live. Also backported to 7.6.7.

Preview 5 bundles PSResourceGet 1.3.0-preview2 and PSReadLine 2.4.5.

7.7.0-rc.1 (October 29) is mostly hardening and fixes, which is what you’d expect from a release candidate:

  • The update notification is gone. PowerShell no longer tells you at startup that a new version is available. The same change shipped in 7.6.8 (see the servicing waves below), so update your machines through your package manager or whatever you deploy with
  • Several Constrained Language Mode protections around property assignment, and implicit-remoting protections that now also apply to aliases
  • Test-Json no longer follows external schema references by default — you now need -FetchExternalReference for that. Worth testing if your schemas $ref other files or URLs
  • Fixes for Get-ChildItem -Recurse -Name, Resolve-Path -Relative with dot-prefixed names, and duplicate results from Get-Command’s fuzzy matching
  • It bundles PSResourceGet 1.3.0-rc1

DSC v3.3.0 was released on September 17 — the only post on the PowerShell team blog in this window. If you followed my DSC v3 primer and the v3.2 post, the highlights:

  • New Windows resources: Microsoft.Windows/RegistryList, WindowsFeatureList and Personalization, plus a registry adapter
  • --what-if now works for services, firewall rules and the SSH server config resources
  • New stateChanged() and restartRequired() expression functions, and format() is now stable
  • DSC is now published as RPM and DEB packages on packages.microsoft.com

Two renames, both keeping the old name as a backward-compatible alias:

  • dsc mcp is now dsc server
  • On dsc resource commands, --version is now --required-version

v3.4.0-preview.1 was published on September 10, a week before 3.3 GA, with JSON schema caching, a Group Policy template adapter, and resources for Windows environment variables and file content. v3.4.0-preview.2 followed on October 28 with ACL support: a new Microsoft.Filesystem/ACL resource and ACLs on the registry resources, plus an environment path variable resource and a Windows Configuration Service Provider (CSP) adapter.

Two feature releases followed Pester 6.0 from July, each with its own post:

  • Pester 6.1 (August 11) — New-ShouldAssertion for writing your own Should-* assertions, -NormalizeLineEnding and -IgnoreOrder options, and experimental global mocks (Mock.Global, which the maintainers want as the default in Pester 7) and shuffled test order. The Run.BeforeContainer option was quietly removed
  • Pester 6.2 (September 9) — Pester.BeforeContainer.ps1 setup files now cascade down your test folders, multiple BeforeAll blocks are allowed again (reversing a 6.0 breaking change), configuration typos and wrong types are caught, and parallel runs work on Windows PowerShell 5.1

6.2 is the one I’d single out. The setup-file cascade removes a lot of copy-pasted BeforeAll boilerplate from bigger test suites, and the configuration validation finally tells you when a typo like Run.Paralel means an option silently does nothing.

If you’re moving from v5 now, start with 6.2 — going for the latest is the right call unless it’s broken. The move from 4.x to 5.x was the big syntax change; from 5.x to 6.x is a lot easier.

A few issues were reported after 6.2 that are worth knowing about, mostly if you use the still-experimental parallel runs:

  • #3047 — parallel runs can fail with “Collection was modified” while importing modules
  • #3044 — warning output now shows up in parallel runs
  • #3059 — Should-BeCollection doesn’t check item order, while v5’s Should -Be @(1, 2, 3) did. Worth knowing when you convert assertions

PSResourceGet 1.3.0-preview2 (September 18) continues the roadmap from May:

  • Platform-aware installs — packages with native components can be filtered by -RuntimeIdentifier and -TargetFramework, so you don’t download every platform’s binaries
  • PSContentPath — standard platform paths for where modules and scripts are installed
  • More parallelism during installs
  • -WhatIf support for the DSC resource’s list operations — one of several DSC resource contributions by Gijs Reijn (@Gijsreyn)

In October it moved to release candidates: 1.3.0-rc1 (October 20) adds custom error messages for the PowerShell Gallery and more install concurrency, and rc2 (October 29) only updates dependencies — so GA looks close. Stable is still 1.2.0, and remember that 1.3 drops Windows PowerShell 5.1 support.

Five rounds in this window, most of them covering 7.6, 7.5 and 7.4:

Date7.6 (LTS)7.57.4 (LTS)Notable
August 147.6.57.5.107.4.19Fixes dot-sourcing of advanced-function scripts run with pwsh -File
September 87.6.67.5.117.4.20Fixes a crash on older Windows versions related to WLDP (Windows Lockdown Policy)
October 137.6.77.5.127.4.21Tolerant user config, AutoSizeDefaultFormatting backport; same day as the October .NET security updates
October 227.6.8——Removes the update notification at startup
October 257.6.97.5.137.4.22.NET SDK update only

7.4.22 and 7.5.13 are likely the last or second-to-last patches those lines will get: end of support, November 10, is also November’s Patch Tuesday.

  • Az 16.2.0 (August 4) — Az.Storage 9.7.2 fixes a path traversal issue in Get-AzStorageBlobContent and Get-AzDataLakeGen2ItemContent. If you download blobs with names you don’t control, update
  • Az 16.3.0 (August 31) — Az.KeyVault moves to a newer API version; older Key Vault API versions retire on February 27, 2027
  • Az 16.4.0 (October 6) — two new GA modules (Az.Discovery and Az.Mission) and SpotPlus priority for New-AzVM
  • Microsoft Graph PowerShell SDK — 2.39 added -LoginHint to Connect-MgGraph, and 2.41.x isolates the authentication module’s dependencies to fix assembly conflicts. 2.41.2 is current

No new releases of PSScriptAnalyzer, PSReadLine, or the VS Code extension in this window. The extension’s newest build is still the 2026.1.2-preview from June, and the latest stable is from October 2025 — a long gap for the extension most of us write PowerShell in.

For Pester, this was the stretch where version 6 settled in: 6.1 made the new assertions extensible, and 6.2 took away a lot of setup boilerplate and one of the more annoying 6.0 breaking changes. If you’ve been waiting to move from v5, 6.2 is a good moment.

For PowerShell itself, the theme, if there is one: adjusting to being driven by AI agents as much as by people — compact output for agents in 7.7, and DSC’s MCP mode now being a general server mode. And underneath it, the usual servicing work. Most important action item: November 10.

Happy scripting 😊