[英]PowerShell Modules and SnapIns
我創建了幾個實用程序模塊,它們都依賴於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)
我將不再通過NestedModules使PSD1文件加載卡扣。 創建一個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
您可以測試程序集名稱的存在
$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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.