什么是PowerShell模块?
PowerShell模块是一个可复用的包,包含部分PowerShell功能。 PowerShell 里的所有东西(函数、变量、DSC 资源等)都可以打包在模块里。 通常,模块是包含特定路径上特定类型文件的文件夹。 市面上有几种不同类型的PowerShell模块。
什么是PowerShell脚本?
PowerShell 脚本是一系列存储在 .ps1 文件中的命令,用于实现重用和共享。 PowerShell 的工作流程也是 PowerShell 脚本,它列出一组任务并为这些任务提供顺序。 欲了解更多信息,请访问“ 使用PowerShell工作流程入门”。
PowerShell 脚本和 PowerShell 模块有何不同?
模块通常更适合分享,但我们支持脚本共享,是为了让你更容易向社区贡献工作流程和脚本。 更多信息,请参阅以下博客:
我如何发布到 PowerShell 库?
您必须在 PowerShell 库 注册账户,才能将包发布到该库。 这是因为发布包需要一个 NuGetApiKey,而该 NuGetApiKey 在注册时提供。 注册时,请使用个人、工作或学校账户登录PowerShell 库。 首次登录时需完成一次性注册流程。 之后,你的NuGetApiKey会在你的个人资料页上显示。
注册完毕后,请使用 Publish-Module 或 Publish-Script cmdlet将你的软件包发布到图库。 如需了解更多如何运行这些指令的细节,请访问发布标签,或阅读 发布模块 和 发布脚本 文档。
安装或保存包无需注册或登录画廊。
我收到了“未能处理请求”的邮件。 当我尝试将一个包发布到 PowerShell 库 时。 那是什么意思?
完整的错误信息是:“未能处理请求。”“指定的 API 密钥无效或无权访问指定的包。” 远程服务器返回错误:(403)禁止。”
出现该错误的原因可能如下:
- 指定的API密钥无效。 确保你已经指定了账户中的有效API密钥。 要获取你的API密钥,请查看你的个人资料页面。
- 指定的包名不属于你。 如果你确认了你的 API 密钥是正确的,那么可能已经存在与你试图使用的包同名的包。 包裹可能已被所有者取消发布,这种情况下它将不会出现在任何搜索结果中。 要确定同名包是否已经存在,打开浏览器并导航到包的详细信息页面:
https://www.powershellgallery.com/packages/<packageName>。 例如,直接导航到 会https://www.powershellgallery.com/packages/pester带你进入 Pester 模块的详细信息页面,无论它是否未公开。 如果已有名称冲突且未列出的包,你可以:- 为您的包裹选择另一个名称。
- 请联系现有套餐的所有者。
为什么我不能用个人账户登录,但昨天却能登录?
请注意,您的画廊账户无法更改您的主要邮箱别名。 更多信息请参见 Microsoft 电子邮件别名。
为什么我在包裹标签页中选择所有类别复选框时,看不到所有画廊包裹?
通过选择“类别”复选框,你表示“我想查看该类别中的所有包裹”。只显示所选类别的包裹。 同样地,通过选择所有类别复选框,你是在说“我想看到任何类别中的所有包裹”。但画廊中的部分包裹不属于列出的任何类别,因此不会出现在结果中。 要查看画廊中的所有包裹,取消勾选所有类别,或再次选择包裹标签。
将模块发布到 PowerShell 库 有哪些要求?
任何类型的PowerShell模块(脚本模块、二进制模块或manifest模块)都可以发布到画廊。 要发布一个模块,PowerShellGet 需要了解一些相关信息——版本、描述、作者以及它的授权方式。 这些信息在发布过程中可以从 模块清单 (.psd1)文件读取,或从 Publish-Module 命令的 LicenseUri 参数值读取。 所有发布到画廊的模块必须包含模块清单。 任何在清单中包含以下信息的模块都可以发布到画廊:
- 版本
- 说明
- 作者
- 模块许可条款中的URI,可以作为清单的PrivateData部分的一部分,或Publish-Module命令的LicenseUri参数中。
我该如何创建一个格式正确的模块清单?
创建模块清单最简单的方法是运行 New-ModuleManifest cmdlet。 在PowerShell 5.0及更新版本中,New-ModuleManifest 生成一个格式正确的模块清单,包含空白字段,用于存储有用的元数据,如 ProjectUri、 LicenseUri和 Tags。 只需填写空白,或使用生成的清单作为格式正确示例即可。
为了验证所有必需的元数据字段是否已正确填写,请使用 Test-ModuleManifest cmdlet。
要更新模块 manifest 文件字段,请使用 Update-ModuleManifest cmdlet。
将剧本发布给画廊有哪些要求?
任何类型的PowerShell脚本(脚本或工作流)都可以发布到画廊。 要发布脚本,PowerShellGet 需要了解一些相关信息——版本、描述、作者以及它的授权方式。 这些信息作为发布过程的一部分,可以从脚本文件的 PSScriptInfo 部分读取,或从 Publish-Script 命令的 LicenseUri 参数值读取。 所有发布到画廊的脚本必须包含元数据信息。 任何包含以下信息的PSScriptInfo板块脚本都可以发布到画廊:
- 版本
- 说明
- 作者
- 脚本许可条款的URI,可以作为脚本的PSScriptInfo部分的一部分,或Publish-Script cmdlet的LicenseUri参数中。
我该如何搜索?
在文本框中输入你要找的内容。 例如,如果你想查找与 Azure SQL 相关的模块,只需输入“azure sql”。 我们的搜索引擎会在所有已发布的软件包中寻找这些关键词,包括标题、描述以及跨元数据。 然后,基于加权质量评分,它会显示最接近的匹配。 你也可以在搜索查询中使用field:“value”语法按特定字段搜索以下字段:
- 标记
- Functions
- Cmdlets(命令行小程序)
- DSC资源
- PowerShellVersion
例如,当你搜索PowerShellVersion:“2.0”时,只显示与PowerShellVersion 2.0兼容(基于模块/脚本清单)的结果。
我该如何创建一个格式正确的脚本文件?
创建格式正确脚本文件最简单的方法是运行 New-ScriptFileInfo cmdlet。 在PowerShell 5.0中,New-ScriptFileInfo 生成一个格式正确的脚本文件,并为有用的元数据(如 ProjectUri、 LicenseUri和 Tags)设置空字段。 只需填补空白,或者使用生成的脚本文件作为格式正确的示例。
要验证所有必需的元数据字段是否已正确填写,请使用 Test-ScriptFileInfo cmdlet。
要更新脚本元数据字段,请使用 Update-ScriptFileInfo cmdlet。
还有哪些其他类型的PowerShell模块存在?
PowerShell模块一词也指实现实际功能的文件。 脚本模块文件(.psm1)包含PowerShell代码。 二进制模块文件(.dll)包含编译后的代码。
这里有一种理解方式:封装模块的文件夹就是模块文件夹。 模块文件夹可以包含一个模块清单(.psd1),描述文件夹内容。 真正完成工作的文件是脚本模块文件(.psm1)和二进制模块文件(.dll)。 DSC 资源位于特定的子文件夹中,并以脚本模块文件或二进制模块文件的形式实现。
Gallery 中的所有模块都包含模块清单,大多数模块包含脚本模块文件或二进制模块文件。 由于这些不同的含义,“模块”一词可能令人混淆。 除非另有明确说明,本页所有“module”一词的使用均指包含这些文件的 module 文件夹。
PackageManagement 与 PowerShellGet 有什么关系? (高层次回答)
PackageManagement 是与任何包管理器协作的常见接口。 最终,无论你是处理PowerShell模块、MSI、Ruby gem、NuGet包还是Perl模块,你都能用PackageManagement的命令(Find-Package 和 Install-Package)找到并安装它们。 PackageManagement通过为每个包管理器配备一个包提供者来实现这一点,这些管理器连接到PackageManagement。 提供者承担所有实际工作;他们从仓库获取内容,并在本地安装内容。 通常,包提供商只是包裹现有的包管理器工具,针对特定包类型进行了包包管理。
PowerShellGet 是 PowerShell 包的管理器。 有一个PSModule包提供商通过PackageManagement暴露PowerShellGet功能。 因此,你可以运行 Install-Module,或者Install-Package -Provider PSModule从 PowerShell 库 安装模块。
某些PowerShellGet功能,包括 Update-Module 和 Publish-Module,无法通过PackageManagement命令访问。
总之,PowerShellGet 专注于为 PowerShell 内容提供高级包管理体验。 PackageManagement 专注于通过一套通用工具展示所有包管理体验。 如果你觉得这个答案不满意,可以在文档底部的“ PackageManagement 究竟如何与 PowerShellGet 相关?” 部分有一篇详细的回答。
欲了解更多信息,请访问 包管理项目页面。
NuGet 和 PowerShellGet 有什么关系?
PowerShell 库 是 NuGet Gallery 的修改版本。 PowerShellGet 使用 NuGet provider来配合基于 NuGet 的仓库,比如 PowerShell 库。
你可以在任何有效的NuGet仓库或文件共享中使用PowerShellGet。 你只需通过运行 Register-PSRepostory cmdlet 添加仓库即可。
这是不是意味着我可以用 NuGet.exe 来和画廊合作?
Yes.
PackageManagement 实际上和 PowerShellGet 有什么关系? (技术细节)
PowerShellGet 在底层高度利用了包管理基础设施。
在PowerShell cmdlet层, 安装模块 实际上是一个薄 Install-Package -Provider PSModule包裹的。
在PackageManagement包提供者层,PSModule包提供者实际上调用其他PackageManagement包提供者。 例如,当你使用基于 NuGet 的画廊(如 PowerShell 库)时,PSModule 包提供者使用 NuGet 包提供商来处理仓库。
图1:PowerShellGet 架构
运行PowerShellGet需要具备什么?
一般来说,我们建议选择最新版本的PowerShellGet模块(注意它需要.NET 4.5)。
PowerShellGet 模块需要 PowerShell 3.0 或更新版本。
因此, PowerShellGet 需要以下操作系统之一:
- Windows 10操作系统
- Windows 8.1 专业版
- Windows 8.1 企业版
- Windows 7 SP1
- Windows Server 2016
- Windows Server 2012 R2
- Windows Server 2008 R2 SP1
PowerShellGet 还需要 .NET Framework 4.5 及以上版本。 有关详细信息,请参阅 安装面向开发人员的 .NET Framework。
是否有可能为未来发布的包保留名称?
无法用字来抄截包名。 如果你觉得现有包裹采用了更适合你包裹的名字,试着 联系包裹的所有者。 如果几周内没有回复,可以联系客服,PowerShell 库团队会帮你处理。
我该如何申报包裹的所有权?
详情请查看 PowerShellGallery.com 上的“管理套餐所有者 ”。
我该如何应对一个违反我包装许可的包裹所有者?
我们鼓励PowerShell社区共同努力,解决包所有者与其他包所有者之间可能出现的任何争议。 我们制定了争议 解决程序 ,请您在 PowerShellGallery.com 管理员介入前遵循。