gpt4 book ai didi

powershell - #Requires 在模块脚本中工作吗?

转载 作者:行者123 更新时间:2023-12-02 16:23:19 26 4
gpt4 key购买 nike

考虑以下模块脚本:

MyWebApp.psm1:

#Requires -Version 4
#Requires -Modules WebAdministration

function Test-MyWebApp() {
return ((Get-WebApplication 'myapp') -ne $null)
}

(为了简单起见,省略了Export-ModuleMember。没有它,脚本仍然可以作为模块运行。)

如果这是一个 ps1 脚本,则顶部的 #Requires 注释将强制 PowerShell 在以下情况下抛出错误

  • 版本低于4
  • 无法加载(导入)WebAdministration 模块

但是如果我尝试使用Import-Module导入它,这些有什么作用吗? The #Requires documentation只是说“脚本”,但它并没有澄清脚本模块是否算作“脚本”。如果不行我该怎么办?

最佳答案

不,它被视为普通评论

否,通过调用 Import-Module 执行 psm1 脚本时,不会处理 #Requires 注释。

如果我们在缺少 WebAdministration 模块的计算机上将问题中的脚本同时保存为 MyWebApp.psm1MyWebApp.ps1,我们得到以下结果:

PS> .\MyWebApp.ps1
.\MyWebApp.ps1 : The script 'MyWebApp.ps1' cannot be run because the following modules that are specified by the
"#requires" statements of the script are missing: WebAdministration.
At line:1 char:1
+ .\MyWebApp.ps1
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (MyWebApp.ps1:String) [], ScriptRequiresException
+ FullyQualifiedErrorId : ScriptRequiresMissingModules

PS> Import-Module .\MyWebApp.psm1
PS>

导入模块成功,并且该函数现在存在于当前作用域中。但该功能将失败:

PS> Test-MyWebApp
Get-WebApplication : The term 'Get-WebApplication' is not recognized as the name of a cmdlet, function, script file,
or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and
try again.
At .\MyWebApp.psm1:5 char:14
+ return ((Get-WebApplication 'myapp') -Eq $null)
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-WebApplication:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

甚至连 -Version 检查也会被忽略。如果我们在仅使用 PowerShell 4 的计算机上将其提高到 5:

PS> .\MyWebApp.ps1
.\MyWebApp.ps1 : The script 'MyWebApp.ps1' cannot be run because it contained a "#requires" statement for Windows
PowerShell 5.0. The version of Windows PowerShell that is required by the script does not match the currently running
version of Windows PowerShell 4.0.
At line:1 char:1
+ .\MyWebApp.ps1
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (MyWebApp.ps1:String) [], ScriptRequiresException
+ FullyQualifiedErrorId : ScriptRequiresUnmatchedPSVersion

PS> Import-Module .\MyWebApp.psm1
PS>

使用模块 list

正确验证需求的唯一方法是使用 module manifest 。不幸的是,这必须是与 psm1 文件一起的单独文件。以下 list 将实现 #Requires 注释的目的:

MyWebApp.psd1:

#
# Module manifest for module 'MyWebApp'
#

@{
ModuleVersion = '1.0'
PowerShellVersion = '4.0'
RequiredModules = @('WebAdministration')
RootModule = @('.\MyWebApp.psm1')
}

导入此文件会出现我们想要的错误:

PS> Import-Module .\MyWebApp.psd1
Import-Module : The required module 'WebAdministration' is not loaded. Load the module or remove the module from 'RequiredModules' in the file
'.\MyWebApp.psd1'.
At line:1 char:1
+ Import-Module .\MyWebApp.psd1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (.\MyWebApp.psd1:String) [Import-Module], MissingMemberException
+ FullyQualifiedErrorId : Modules_InvalidManifest,Microsoft.PowerShell.Commands.ImportModuleCommand

不幸的是,您不能在同一文件中声明该函数。您必须使用单独 psd1 文件,然后将原始 psm1 脚本显式声明为“根模块”。根模块表示为相对于 psd1 文件的路径

其他属性:

  • ModuleVersion 是必需的。它必须存在。
  • PowerShellVersion 实现了 #Requires -Version 4 的预期。
  • RequiredModules 实现了 #Requires -Modules WebAdministration 的目的。

请注意,Test-MyWebApp 会在 psm1psd1 文件中隐式导出。这通常由 psm1 文件中的 Export-ModuleMember -Function 控制;模块 list 中的等效项是 FunctionsToExport。我发现从 list 中省略 FunctionsToExport 并在 psm1 脚本中使用 Export-ModuleMember 控制导出内容会更简单。

关于powershell - #Requires 在模块脚本中工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42283014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com