0

Microsoft.SharePoint.PowerShell snapIn に依存するいくつかのユーティリティ モジュールを作成しました。

私のマシンでスクリプトを実行すると、スクリプトはすべて正しく実行されます。PowerShell を「デフォルトでロード」するためのモジュールやスナップインはプロファイルにありませんが、他のマシンではプロファイルがクリーンであるとは保証できません。

私のモジュールローダー.psd1ファイルでは、次のものを使用しています

NestedModules = @( 'Microsoft.SharePoint.PowerShell',
        '.\Modules\CustomModule.psd1')

ps1 ファイルを使用して、次のモジュールのインポート コマンドを含むこれらのモジュールのインポートをトリガーします。

Import-Module -Name "$dir\.\CustomModules.psd1" -Global -Force -PassThru

この方法で実行すると、スナップインが既に読み込まれているため、プロファイルに Microsoft.SharePoint.PowerShell スナップインが含まれているマシンで名前競合エラーが発生します。

-NoProfile 引数を使用して PowerShell コマンドを実行できることはわかっていますが、これはシナリオでは有効なソリューションではありません。

また、NestedModules セクションからスナップインを削除して、モジュールがインポートされる前に .ps1 ファイルで次を実行しようとしましたが、スナップインが読み込まれていると表示されないため、モジュールのインポートは失敗します。

if ((Get-PSSnapin | ? {$_.Name -eq 'Microsoft.SharePoint.PowerShell'}) -eq $null)
{
    Write-Host "Adding PSSnapin 'Microsoft.SharePoint.PowerShell'"
    Add-PSSnapin 'Microsoft.SharePoint.PowerShell'  }

ユーザー プロファイルに関係なく、スナップインが適切に読み込まれ、モジュールが正常にインポートされるようにするには、このソリューションをどのように作り直すことができますか?

私の理想的なシナリオは次のとおりです。

Task.ps1   (The custom task me or other devs are trying to achieve)
     > Calls ImportModules.ps1   (Hides the importing logic of modules and snap-ins)
           > Imports CustomModules.psd1  (Imports all modules, functions, global vars into the runspace)
4

2 に答える 2

3

NestedModules を介して PSD1 ファイルに snappin をロードさせることをやめます。CustomModules.psm1 ファイルを作成し、ModuleToProcess (または v3 の RootModule) を「CustomModules.psm1」に設定します。NestedModules から SharePoint dll を削除します。次に、次のような内容を CustomModules.psm1 ファイルに追加します。

function AddSnapin
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Name
    )

    Process {
        foreach ($n in $name)
        {
            if (!(Get-PSSnapin $n -ErrorAction SilentlyContinue)) {
                Add-PSSnapin $n
            }
            else {
                Write-Verbose "Skipping $n, already loaded."
            }
        }
    }
}

AddSnapin Microsoft.SharePoint.PowerShell -Verbose
于 2013-02-02T22:47:00.627 に答える
2

アセンブリ名の存在をテストできます

$assemblyname = "Microsoft.SharePoint.PowerShell"
if (([appdomain]::currentdomain.getassemblies() | 
      Where {$_ -match $AssemblyName}) -eq $null )
{
  add-pssnapin Add-PSSnapin 'Microsoft.SharePoint.PowerShell'
}

または、とにかくロードして、すでにロードされている場合はエラーを無視します。

Add-PSSnapin -Name "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue
于 2013-02-02T20:15:49.933 に答える