可移植的模块Portable Modules

移植 PSSnapInPorting a PSSnapIn

在 PowerShell Core 中不支持 PowerShell 管理单元 (PSSnapIn)。但是,很容易将 PSSnapIn 转换为 PowerShell 模块。通常情况下,PSSnapIn 注册代码处于单个源文件的类派生自PSSnapIn从生成; 中删除此源文件不再需要它。

使用若要创建新的模块清单,即无需 PSSnapIn 注册代码。一些 PSSnapIn (如说明) 中的值可以在模块清单中重复使用。

模块清单中的属性应设置为实现 cmdlet 的程序集 (dll) 的名称。

.NET 可移植性分析器 (又称 APIPort)The .NET Portability Analyzer (aka APIPort)

为端口模块为 Windows PowerShell,若要使用 PowerShell Core,开始编写。对已编译程序集以确定是否与.NET Framework、.NET Core 和其他.NET 运行时兼容的模块中使用的.NET Api 运行此工具。如果它们存在,则该工具建议备用 Api。否则,可能需要添加运行时检查并限制在特定的运行时中不可用的功能。

如果创建一个新的模块,建议是使用。

一旦安装了.NET CLI,安装的模板库生成一个简单的 PowerShell 模块。该模块将与 Windows PowerShell、 PowerShell Core、 Windows、 Linux 和 macOS 兼容。

下面的示例演示如何安装模板:

  1. Restoring packages for C:\Users\Steve\.templateengine\dotnetcli\v2.1.302\scratch\restore.csproj...
  2. Installing Microsoft.PowerShell.Standard.Module.Template 0.1.3.
  3. Generating MSBuild file C:\Users\Steve\.templateengine\dotnetcli\v2.1.302\scratch\obj\restore.csproj.nuget.g.props.
  4. Generating MSBuild file C:\Users\Steve\.templateengine\dotnetcli\v2.1.302\scratch\obj\restore.csproj.nuget.g.targets.
  5. Restore completed in 1.66 sec for C:\Users\Steve\.templateengine\dotnetcli\v2.1.302\scratch\restore.csproj.
  6. Usage: new [options]
  7. Options:
  8. -h, --help Displays help for this command.
  9. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates.
  10. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used.
  11. -o, --output Location to place the generated output.
  12. -i, --install Installs a source or a template pack.
  13. --nuget-source Specifies a NuGet source to use during install.
  14. --type Filters templates based on available types. Predefined values are "project", "item" or "other".
  15. --force Forces content to be generated even if it would change existing files.
  16. -lang, --language Filters templates based on language and specifies the language of the template to create.
  17. Templates Short Name Language Tags
  18. ----------------------------------------------------------------------------------------------------------------------------
  19. Console Application console [C#], F#, VB Common/Console
  20. Class library classlib [C#], F#, VB Common/Library
  21. PowerShell Standard Module psmodule [C#] Library/PowerShell/Module

创建新的模块项目Creating a New Module Project

生成模块Building the Module

使用标准.NET CLI 命令来生成项目。

  1. dotnet build

在生成该模块之后, 可以将其导入并执行示例 cmdlet。

  1. ipmo .\bin\Debug\netstandard2.0\myModule.dll
  2. Test-SampleCmdlet -?
  3. Test-SampleCmdlet -FavoriteNumber 7 -FavoritePet Cat

以下各节详细说明某些使用此模板的技术。

.NET standard是所有.NET 实现中可用的.NET Api 的正式规范。管理面向.NET Standard 适用于与该版本的.NET Standard 兼容的.NET Framework 和.NET Core 版本的代码。

备注

虽然 API 可能存在于.NET Standard,.NET Core 中的 API 实现可能会引发PlatformNotSupportedException在运行时,因此若要验证与 Windows PowerShell 和 PowerShell Core,兼容性的最佳做法是为你的模块在这两个环境中运行测试。如果你的模块是要将跨平台还在 Linux 和 macOS 上运行测试。

面向.NET Standard 可帮助确保,随着该模块后,不兼容的 Api 不会意外地获取引入到模块。在编译时,而不是运行时发现不兼容问题。

库是所有的 PowerShell 版本大于或等于该标准的版本中提供的 PowerShell Api 的正式规范。

例如, PowerShell Standard 5.1兼容 Windows PowerShell 5.1 和 PowerShell Core 6.0 或更高版本。

我们建议你使用 PowerShell 标准库模块编译。该库可确保 Api 的可用性和在 Windows PowerShell 和 PowerShell Core 6 中实现。PowerShell 标准旨在始终是向前兼容。使用 PowerShell 标准库 5.1 构建的模块将始终与将来版本的 PowerShell 兼容。

指示使用 Windows PowerShell 和 PowerShell Core 的兼容性Indicating Compatibility With Windows PowerShell and PowerShell Core

在验证之后,您的模块中适用于 Windows PowerShell 和 PowerShell Core,模块清单应显式指示兼容性通过使用CompatiblePSEditions属性。值为Desktop意味着该模块是使用 Windows PowerShell,而值兼容Core意味着该模块与 PowerShell Core 兼容。包括DesktopCore意味着该模块是使用 Windows PowerShell 和 PowerShell Core 兼容。

备注

Core 并不意味着该模块适用于 Windows、 Linux 和 macOS。CompatiblePSEditions PowerShell v5 中引入了属性。模块清单,使用CompatiblePSEditions属性无法加载 PowerShell v5 之前的版本中。

指示操作系统兼容性Indicating OS Compatibility

首先,请验证您的模块中适用于 Linux 和 macOS。接下来,指示与在模块清单中的这些操作系统的兼容性。这使用户更轻松地找到你的模块时发布到其操作系统PowerShell 库

例如:

  1. @{
  2. GUID = "4ae9fd46-338a-459c-8186-07f910774cb8"
  3. Author = "Microsoft Corporation"
  4. CompanyName = "Microsoft Corporation"
  5. Copyright = "(C) Microsoft Corporation. All rights reserved."
  6. HelpInfoUri = "https://go.microsoft.com/fwlink/?linkid=855962"
  7. ModuleVersion = "1.2.4"
  8. PowerShellVersion = "3.0"
  9. ClrVersion = "4.0"
  10. RootModule = "PackageManagement.psm1"
  11. Description = 'PackageManagement (a.k.a. OneGet) is a new way to discover and install software packages from around the web.
  12. It is a manager or multiplexer of existing package managers (also called package providers) that unifies Windows package management with a single Windows PowerShell interface. With PackageManagement, you can do the following.
  13. - Discover software packages
  14. - Seamlessly install, uninstall, and inventory packages from one or more software repositories'
  15. CmdletsToExport = @(
  16. 'Find-Package',
  17. 'Get-Package',
  18. 'Get-PackageProvider',
  19. 'Get-PackageSource',
  20. 'Install-Package',
  21. 'Import-PackageProvider'
  22. 'Find-PackageProvider'
  23. 'Install-PackageProvider'
  24. 'Register-PackageSource',
  25. 'Set-PackageSource',
  26. 'Unregister-PackageSource',
  27. 'Uninstall-Package'
  28. 'Save-Package'
  29. )
  30. FormatsToProcess = @('PackageManagement.format.ps1xml')
  31. PrivateData = @{
  32. PSData = @{
  33. Tags = @('PackageManagement', 'PSEdition_Core', 'PSEdition_Desktop', 'Windows', 'Linux', 'macOS')
  34. ProjectUri = 'https://oneget.org'
  35. }
  36. }