我使用单独的源文件创建PowerShell脚本模块.从其他内部源文件引用模块内部源函数的规范方法是什么?
例如,如果我的模块是从文件"foo"和"bar"中的PS源代码创建的; 并且"foo"中的函数需要调用"bar"中的函数,这样做的最佳方法是什么?
看起来点源并不是一个好主意.也没有制作组件文件("foo"和"bar")psm1文件.这是psd1文件中"ScriptsToProcess"字段背后的想法吗?
我在考虑这个错误(非"PowerShelly")吗?我应该把所有东西都放到一个psm1吗?
Mar*_*agg 10
我亲自按照RamblingCookieMonster在他的博客中提出的做法:http://ramblingcookiemonster.github.io/Building-A-PowerShell-Module/
这是组织功能下的子文件夹分别名为.ps1文件\Public和\Private.Public包含用户应该能够直接调用的函数,Private是PowerShell内部的函数.
然后在.psm1文件中通过循环和点源加载函数,如下所示:
#Get public and private function definition files.
$Public = @( Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -ErrorAction SilentlyContinue )
$Private = @( Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -ErrorAction SilentlyContinue )
#Dot source the files
Foreach($import in @($Public + $Private))
{
Try
{
. $import.fullname
}
Catch
{
Write-Error -Message "Failed to import function $($import.fullname): $_"
}
}
# Here I might...
# Read in or create an initial config file and variable
# Export Public functions ($Public.BaseName) for WIP modules
# Set variables visible to the module and its functions only
Export-ModuleMember -Function $Public.Basename
Run Code Online (Sandbox Code Playgroud)
然后,您还应该在FunctionsToExport设置下的.psd1模块清单文件中明确列出您的公共函数名称.这样做可以发现这些功能,并且模块在使用时可以自动加载.
由于我最近不得不自己做这件事,所以我正在分享我的解决方案。我最近开始在 psm1 文件中对函数进行分组。这些可以编译成具有单个清单的单个模块。
这允许我拥有可以与多个模块打包的功能组。
Write-BarFunctions.psm1
Function Write-Bar {
return "Bar"
}
Function Write-Baz {
return "Baz"
}
Run Code Online (Sandbox Code Playgroud)
写 FooFunctions.psm1
Function Write-Foo {
return "Foo"
}
Function Write-FooBar {
$foo = Write-Foo
$bar = Write-Bar
return ("{0}{1}" -f $foo, $bar)
}
Function Write-FooBarBaz {
$foobar = Write-FooBar
$baz = Write-Baz
return ("{0}{1}" -f $foobar, $baz)
}
Run Code Online (Sandbox Code Playgroud)
将它们组合成这样的单个模块:(为了可读性而格式化)
New-ModuleManifest
-Path .\Write-FooBarBazCombos
-NestedModules @('.\FooFunctions\Write-FooFunctions.psm1', '.\BarFunctions\Write-BarFunctions.psm1')
-Guid (New-Guid)
-ModuleVersion '1.0.0.0'
-Description 'demonstrate multiple psm1 files as 1 powershell module with 1 powershell module manifest'
-PowerShellVersion $PSVersionTable.PSVersion.ToString()
-FunctionsToExport @('Write-Foo', 'Write-Bar','Write-FooBar', 'Write-FooBarBaz')
Run Code Online (Sandbox Code Playgroud)
PowerShell 输出:
PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> New-ModuleManifest -Path .\Write-FooBarBazCombos.psd1
-NestedModules @('.\Write-FooFunctions.psm1', '.\Write-BarFunctions.psm1') -Guid (New-Guid) -ModuleVersion '1.0.0.0' -D
escription 'demonstrate multiple psm1 files as 1 powershell module with 1 powershell module manifest' -PowerShellVersio
n $PSVersionTable.PSVersion.ToString() -FunctionsToExport @('Write-Foo', 'Write-Bar','Write-FooBar', 'Write-FooBarBaz')
PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Import-Module .\Write-FooBarBazCombos.psd1
PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Get-Command -Module Write-FooBarBazCombos
CommandType Name Version Source
----------- ---- ------- ------
Function Write-Bar 1.0.0.0 Write-FooBarBazCombos
Function Write-Foo 1.0.0.0 Write-FooBarBazCombos
Function Write-FooBar 1.0.0.0 Write-FooBarBazCombos
Function Write-FooBarBaz 1.0.0.0 Write-FooBarBazCombos
Run Code Online (Sandbox Code Playgroud)
PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Write-FooBar
FooBar
Run Code Online (Sandbox Code Playgroud)
目录中剩下的内容:
PS C:\LWC\scripting-misc\module-manifest-multiple-files-example> Get-ChildItem | Select-Object Name
Name
----
Write-BarFunctions.psm1
Write-FooBarBazCombos.psd1
Write-FooFunctions.psm1
Run Code Online (Sandbox Code Playgroud)
附录 - 我在另一个问题中扩展了这个答案 - 在这里:
| 归档时间: |
|
| 查看次数: |
5814 次 |
| 最近记录: |