What's New in PowerShell 7.3

PowerShell 7.3 is the next stable release, built on .NET 7.0.

PowerShell 7.3 includes the following features, updates, and breaking changes.

Breaking Changes and Improvements

  • In this release, Windows APIs were updated or removed for compliance, which means that PowerShell 7.3 doesn't run on Windows 7. While Windows 7 is no longer supported, previous builds could run on Windows 7.
  • PowerShell Direct for Hyper-V is only supported on Windows 10, version 1809 and higher.
  • Test-Connection is broken due to an intentional breaking change in .NET 7. It's tracked by #17018
  • Add clean block to script block as a peer to begin, process, and end to allow easy resource cleanup (#15177)
  • Change default for $PSStyle.OutputRendering to Host
  • Make Out-String and Out-File keep string input unchanged (#17455)
  • Move the type data definition of System.Security.AccessControl.ObjectSecurity to the Microsoft.PowerShell.Security module (#16355) (Thanks @iSazonov!)
    • Before this change, a user doesn't need to explicitly import the Microsoft.PowerShell.Security module to use the code properties defined for an instance of System.Security.AccessControl.ObjectSecurity.
    • After this change, a user needs to explicitly import Microsoft.PowerShell.Security module in order to use those code properties and code methods.

Tab completion improvements

  • PowerShell 7.3 includes PSReadline 2.2.6, which enables Predictive IntelliSense by default. For more information, see about_PSReadLine.
  • Fix tab completion within the script block specified for the ValidateScriptAttribute. (#14550) (Thanks @MartinGC94!)
  • Added tab completion for loop labels after break/continue (#16438) (Thanks @MartinGC94!)
  • Improve Hashtable completion in multiple scenarios (#16498) (Thanks @MartinGC94!)
    • Parameter splatting
    • Arguments parameter for Invoke-CimMethod
    • FilterHashtable parameter for Get-WinEvent
    • Property parameter for the CIM cmdlets
    • Removes duplicates from member completion scenarios
  • Support forward slashes in network share (UNC path) completion (#17111) (Thanks @sba923!)
  • Improve member autocompletion (#16504) (Thanks @MartinGC94!)
  • Prioritize ValidateSet completions over Enums for parameters (#15257) (Thanks @MartinGC94!)
  • Add type inference support for generic methods with type parameters (#16951) (Thanks @MartinGC94!)
  • Improve type inference and completions (#16963) (Thanks @MartinGC94!)
    • Allows methods to be shown in completion results for ForEach-Object -MemberName
    • Prevents completion on expressions that return void like ([void](""))
    • Allows non-default Class constructors to show up when class completion is based on the AST
  • Improve type inference for $_ (#17716) (Thanks @MartinGC94!)
  • Fix type inference for ICollection (#17752) (Thanks @MartinGC94!)
  • Prevent braces from being removed when completing variables (#17751) (Thanks @MartinGC94!)
  • Add completion for index expressions for dictionaries (#17619) (Thanks @MartinGC94!)
  • Fix type completion for attribute tokens (#17484) (Thanks @MartinGC94!)
  • Improve dynamic parameter tab completion (#17661) (Thanks @MartinGC94!)
  • Avoid binding positional parameters when completing parameter in front of value (#17693) (Thanks @MartinGC94!)

Improved error handling

  • Set $? correctly for command expression with redirections (#16046)
  • Fix a casting error when using $PSNativeCommandUseErrorActionPreference (#15993)
  • Make the native command error handling optionally honor ErrorActionPreference (#15897)
  • Specify the executable path as TargetObject for non-zero exit code ErrorRecord (#16108) (Thanks @rkeithhill!)

Session and remoting improvements

  • Add -Options to the PSRP over SSH commands to allow passing OpenSSH options directly (#12802) (Thanks @BrannenGH!)
  • Add -ConfigurationFile parameter to pwsh to allow starting a new process with the session configuration defined in a .pssc file (#17447)
  • Add support for using New-PSSessionConfigurationFile on non-Windows platforms (#17447)

Updated cmdlets

  • Add -HttpVersion parameter to web cmdlets (#15853) (Thanks @hayhay27!)
  • Add support to web cmdlets for open-ended input tags (#16193) (Thanks @farmerau!)
  • Fix ConvertTo-Json -Depth to allow 100 at maximum (#16197) (Thanks @KevRitchie!) @rkeithhill!)
  • Improve variable handling when calling Invoke-Command with the $using: expression (#16113) (Thanks @dwtaber!)
  • Add -StrictMode to Invoke-Command to allow specifying strict mode when invoking command locally (#16545) (Thanks @Thomas-Yu!)
  • Add clean block to script block as a peer to begin, process, and end to allow easy resource cleanup (#15177)
  • Add -Amended switch to Get-CimClass cmdlet (#17477) (Thanks @iSazonov)
  • Changed ConvertFrom-Json -AsHashtable to use ordered hashtable (#17405)
  • Removed ANSI escape sequences in strings before sending to Out-GridView (#17664)
  • Added the Milliseconds parameter to New-TimeSpan (#17621) (Thanks @NoMoreFood!)
  • Show optional parameters when displaying method definitions and overloads (#13799) (Thanks @eugenesmlv!)
  • Allow commands to still be executed even if the current working directory no longer exists (#17579)
  • Add support for HTTPS with Set-AuthenticodeSignature -TimeStampServer (#16134) (Thanks @Ryan-Hutchison-USAF!)
  • Render decimal numbers in a table using current culture (#17650)
  • Add type accelerator ordered for OrderedDictionary (#17804) (Thanks @fflaten!)
  • Add find.exe to legacy argument binding behavior for Windows (#17715)
  • Add -noprofileloadtime switch to pwsh (#17535) (Thanks @rkeithhill!)

For a complete list of changes, see the Change Log in the GitHub repository.

Experimental Features

In PowerShell 7.3, following experimental features became mainstream:

  • PSAnsiRenderingFileInfo - This feature adds the $PSStyle.FileInfo member and enables coloring of specific file types.

  • PSCleanBlock - Adds clean block to script block as a peer to begin, process, and end to allow easy resource cleanup.

  • PSAMSIMethodInvocationLogging - Extends the data sent to AMSI for inspection to include all invocations of .NET method members.

  • PSNativeCommandArgumentPassing - PowerShell now uses the ArgumentList property of the StartProcessInfo object rather than the old mechanism of reconstructing a string when invoking a native executable.

    PowerShell 7.3.1 adds sqlcmd.exe to the list of native commands in Windows that use the Legacy style of argument passing.

  • PSExec - Adds the new Switch-Process cmdlet (alias exec) to provide exec compatibility for non-Windows systems.

    PowerShell 7.3.1 changed the exec alias to a function that wraps Switch-Process. The function allows you to pass parameters to the native command that might have erroneously bound to the WithCommand parameter.

PowerShell 7.3 introduces the following experimental features:

PowerShell 7.3 removed the following experimental features:

  • PSNativePSPathResolution experimental feature is no longer supported.
  • PSStrictModeAssignment experimental feature is no longer supported.

For more information about the Experimental Features, see Using Experimental Features.