【问题标题】:Import-Module not working when called after a param() statement在 param() 语句后调用 Import-Module 不起作用
【发布时间】:2017-06-20 09:34:54
【问题描述】:

我有一个脚本,它使用参数向它传递详细信息,并且需要导入 WebAdministration 模块。

脚本的开头是:

param(
    [parameter(position=0)]
    [string]$iisAppName
)

Import-Module -name WebAdministration

但是,当我运行脚本时,我从那些使用模块的 cmdlet 中得到错误,说它们没有找到,因为模块显然还没有被加载。

如果我将 Import-Module 语句放在 param() 之前,则不会加载该参数。如果我根本没有 param() 语句,它可以正常工作。

此脚本用于删除网站,但配套创建脚本(不使用参数)可以正常工作。事实上,如果我运行那个它可以工作,然后如果我运行这个(模块仍然从第一个加载)它工作正常(令人讨厌......因为我没有在测试中发现问题!),所以我知道我正确调用了这些 cmdlet。

我需要调用其中一个或两个以允许它们都在我的脚本中工作吗?

【问题讨论】:

    标签: powershell parameters import-module


    【解决方案1】:

    我认为这与会话状态有关,但需要更多信息才能确定。

    https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/import-module#-global

    默认情况下,模块中的命令,包括来自嵌套模块的命令,都被导入到调用者的会话状态中。

    当您从全局会话状态导入模块时,控制台和所有模块都可以使用它。当模块从另一个模块导入时,它只对导入它的模块可用。我认为当您包含 Params 时,它会以不同的方式处理它,可能在脚本状态会话而不是全局状态会话中运行它。

    尝试使用Import-Module -Name WebAdministration -Global,无论在哪里调用它,都应该将其导入到全局状态会话中,并使其可供所有用户使用。

    【讨论】:

    • 啊哈,不,我是个白痴……尽管你走在正确的轨道上。刚刚意识到,失败的位实际上需要 :[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Management") 隐藏在另一个脚本中,而不是 webadmin 模块中。显然,与模块一样,程序集被加载到会话中,因此可用于在该会话中运行的其他脚本。看了这么久的代码,我终于在发帖一个小时后发了条! :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多