前言
日常开发的powershell的函数,可以保存为脚本文件(.ps1
)和模块文件(.psm1
和.psd1
),方便后续导入使用。
参考官方文档。
导入脚本文件
假设有个脚本文件Get-MrPSVersion.ps1
,使用Dot-Sourcing
函数导入命令如下:
#相对路径
. .\Get-MrPSVersion.ps1
#绝对路径
. C:\Demo\Get-MrPSVersion.ps1
导入模块文件
假设写了几个函数,并保存在MyScriptModule.psm1
模块文件中,使用Import-Module
函数导入模块如下:
Import-Module C:\MyScriptModule.psm1
要利用模块自动加载,需要将脚本模块保存在与.psm1
文件具有相同基名称
的文件夹中,并保存在 $env:PSModulePath
中指定的位置。
$env:PSModulePath
模块清单
所有模块都应该有一个模块清单。New-ModuleManifest
用于创建模块清单。 Path
是所需的唯一值。 但是,如果未指定RootModule
,则该模块将不起作用。 如果决定使用 PowerShellGet 将模块上传到 NuGet 存储库,最好指定Author
和Description
,因为该情况需要这些值 。Update-ModuleManifest
用于更新清单。
New-ModuleManifest -Path $env:ProgramFiles\WindowsPowerShell\Modules\MyScriptModule\MyScriptModule.psd1 -RootModule MyScriptModule -Author 'Mike F Robbins' -Description 'MyScriptModule' -CompanyName 'mikefrobbins.com'
定义公共和专用函数
有两种方法定义公共和专用函数。
在.psm1
模块文件使用Export-ModuleMember
函数
function Get-MrPSVersion {
$PSVersionTable
}
function Get-MrComputerName {
$env:COMPUTERNAME
}
Export-ModuleMember -Function Get-MrPSVersion
在.psd1
模块清单文件使用FunctionsToExport
函数
FunctionsToExport = 'Get-MrPSVersion'
不需要在
.psm1
文件和模块清单的FunctionsToExport
部分同时使用两个Export-ModuleMember
。
使用其中一个已足够。
发布脚本或者模块
在gallery上创建API Key
在gallery上注册账户,然后在API Keys
下面创建和复制API Key。
创建脚本或者模块的清单模板
New-ModuleManifest
和New-ScriptFileInfo
cmdlet 将创建清单模板,内含所有清单元素的占位符。根据需要进行修改。
预验证项
Test-ModuleManifest
可捕获导致已安装的模块不可用的常见问题。 必须先对每个模块运行此命令,然后才能将其发布到 PowerShell 库中。同样,Test-ScriptFileInfo
可用于验证脚本中的元数据。必须先对与模块分开发布的每个脚本运行此命令,然后才能将其发布到 PowerShell 库中。
发布
必须使用 Publish-Script
或 Publish-Module
将项发布到 PowerShell 库中。 这两个命令都需要:
- 将发布的项的路径。 对于模块,使用为模块指定的
文件夹
。 如果指定的文件夹包含同一模块的多个版本,必须指定 RequiredVersion。 - Nuget API 密钥。 这是 PowerShell 库的“我的帐户”页面上显示的 API 密钥。
为了避免出错,强烈建议在发布之前尝试使用 -WhatIf -Verbose 运行命令。 这将节省相当多的时间,因为每次将项发布到 PowerShell 库时,都必须更新项的清单部分中的版本号。
Publish-Module -Path ".\MyModule" -NugetAPIKey "GUID" -WhatIf -Verbose
Publish-Script -Path ".\MyScriptFile.PS1" -NugetAPIKey "GUID" -WhatIf -Verbose
仔细检查输出,如果没有看到任何错误或警告,请重复运行命令,而不使用 -WhatIf。
建议发布时使用最新的powershell和NuGet,否则可能发布失败。
最终效果
使用命令下载便可以使用了: