来自模块中的函数的Add-pssnapin不起作用(范围问题?)

时间:2011-06-03 17:36:52

标签: powershell

我有这个功能:

function start-sqlsnap
{
                add-pssnapin SqlServerCmdletSnapin100
}

无论加载函数的方法如何,get-pssnapin都会显示加载的snapin。但是:

  1. 如果粘贴在shell中,则会识别函数(如invoke-sqlcmd)
  2. 如果来自文件的点,则识别功能
  3. 如果放在psm1文件中(在模块文件夹内,在其自己的文件夹中,与psm1文件同名)并加载了import-module,则无法识别特定于管理单元的功能 - 但运行get-pssnapin将显示加载的模块。
  4. 错误:

    The term 'invoke-sqlcmd' is not recognized as the name of a cmdlet, function, script file, or operable program. Check t
    he spelling of the name, or if a path was included, verify that the path is correct and try again.
    At line:1 char:14
    + invoke-sqlcmd <<<<
        + CategoryInfo          : ObjectNotFound: (invoke-sqlcmd:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    

    我使用不同的snapin尝试了同样的事情:Microsoft.EnterpriseManagement.OperationsManager.Client并且具有完全相同的结果。 我在2008 R2上运行PowerShell 2.

    这是一个已知的错误或功能吗?我能以某种方式解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

如果您只添加单行,而不是将该函数添加到模块文件中:

add-pssnapin SqlServerCmdletSnapin100

我试过了,似乎有效。

答案 1 :(得分:0)

如果您的函数只执行一行,则只需在脚本中添加一行即可。但是,如果您的函数有很多行,并且您需要根据已安装的SQL版本检查某些要求或加载不同版本的PsSnapin,则可能会出现问题。

在这种情况下,解决方案是创建PowerShell脚本文件(.ps1)并在此文件中移动您的函数。当你调用一个函数时,将加载所有包含的modules / pssnapins。

从外面无法获得充电的pssnapins和模块:

Import-Module "MyCustomModule" #(.psm1)

收费的pssnapins和模块可从外面获取:

Import-Module "MyCustomModule.ps1