microsoft/migrating-powershell-sdk
> Migrates the legacy System.Management.Automation (PowerShell SDK) references from obsolete .NET Framework (Windows PowerShell 5.1) to modern .NET (PowerShell 7+). Replaces Windows PowerShell Reference Assemblies or GAC references with the cross-platform System.Management.Automation NuGet package. Use ONLY when the legacy Windows PowerShell SDK has been flagged as obsolete or deprecated and must be replaced — not for version-bump scenarios where existing PowerShell packages are still supported. Triggers for "migrate PowerShell SDK", "upgrade cmdlet project", "PowerShellStandard.Library", project files (.csproj, .vbproj, .fsproj) with PowerShell references, and .psd1 module manifests.
npx skills add https://github.com/microsoft/upgrade-agent-plugins --skill migrating-powershell-sdk
Migrate PowerShell cmdlet projects from .NET Framework (Windows PowerShell 5.1) to modern .NET (.NET 6+). The core change is replacing the Windows PowerShell reference assembly with the cross-platform System.Management.Automation NuGet package. Most code remains unchanged because the SDK types (PSCmdlet, Cmdlet, PSObject, attributes) are identical across both packages.
<!-- GAC/file reference -->
<Reference Include="System.Management.Automation" />
<!-- Windows PowerShell ref assemblies NuGet -->
<PackageReference Include="Microsoft.PowerShell.5.ReferenceAssemblies" Version="1.1.0" />
<!-- Cross-platform NuGet package; use version matching target framework -->
<PackageReference Include="System.Management.Automation" Version="{version-for-target-framework}" />
<!-- OR for dual-targeting Windows PowerShell 5.1 + PowerShell 7 -->
<PackageReference Include="PowerShellStandard.Library" Version="{stable-version}" />
| Package | When to Use |
|---------|-------------|
| System.Management.Automation | Targeting a specific PowerShell 7.x version. Provides full API surface. |
| PowerShellStandard.Library | Must support both Windows PowerShell 5.1 and PowerShell 7+ from a single binary. Targets netstandard2.0. |
Use tools or PowerShell releases to find the latest stable package version for the target framework.
Migration Progress:
- [ ] Step 1: Detect PowerShell SDK usage
- [ ] Step 2: Determine target framework and package version
- [ ] Step 3: Update project file references
- [ ] Step 4: Handle API differences
- [ ] Step 5: Update module manifest
- [ ] Step 6: Build and verify
Scan the project for:
using System.Management.Automation; statementsCmdlet or PSCmdlet[Cmdlet(...)] attributesMicrosoft.PowerShell.5.ReferenceAssemblies NuGet, or direct file referenceIf the project already uses the cross-platform NuGet package, no migration is needed.
<TargetFramework> or <TargetFrameworks> from the project file or Directory.Build.propsSystem.Management.Automation package version for that frameworkPowerShellStandard.Library instead — it targets netstandard2.0 so a single binary works in both hostsRemove old references and add the new package reference (see "Package Reference Changes" above).
Most SDK types are identical, but these APIs changed:
| Windows PowerShell | PowerShell 7+ | Action |
|-------------------|---------------|--------|
| PSSnapIn classes | Not supported | Convert to module manifests (.psd1). Snap-ins were deprecated because modules provide better isolation and discoverability. |
| PSHost.NotifyBeginApplication | May not be implemented | Guard with try/catch or remove the call |
| WinRM remoting APIs | Limited on non-Windows | Use SSH remoting for cross-platform scenarios |
If the project produces a PowerShell module, update the .psd1:
@{
PowerShellVersion = '7.0'
CompatiblePSEditions = @('Core')
ProcessorArchitecture = 'None'
}
dotnet build
Import-Module ./bin/Debug/{target-framework}/MyModule.dll
Get-Command -Module MyModule
Ensure the assembly contains [Cmdlet] attributes and the namespace is correctly exported in the module manifest.
Another loaded module may bundle a different System.Management.Automation version. Use assembly load contexts or module isolation boundaries to resolve.
Some Windows PowerShell APIs have no PowerShell 7 equivalent. Check the PowerShell 7 SDK docs for alternatives.
PowerShell 7 does not support snap-ins. Remove PSSnapIn-derived classes and replace with:
.psd1) for metadataRequiredModules in the manifest for dependency managementTake microsoft/migrating-powershell-sdk from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.