Я использую сценарии PowerShell из инструмента C #, например:
using (PowerShell pshell = PowerShell.Create())
{
pshell.AddCommand(scriptFullPath);
pshell.AddParameter("username", user);
pshell.AddParameter("password", pass);
PSDataCollection<PSObject> outputCollection = new PSDataCollection<PSObject>();
PSInvocationSettings settings = new PSInvocationSettings();
settings.ErrorActionPreference = ActionPreference.Stop;
pshell.Invoke(null, outputCollection, settings);
}
Почти все прекрасно работает в скрипте, пока мне не понадобятся специальные командлеты из других сборок. Команда Add-PSSnapin всегда будет с ошибкой:
Exception: The Windows PowerShell snap-in 'Microsoft.SharePoint.Powershell' is not installed on this computer.
Exception: Cannot bind parameter 'Path' to the target. Exception setting "Path": "Cannot find path 'D:\dev\tool\Microsoft.SharePoint.dll' because it does not exist."
при работе
$snapin = Get-PSSnapin | Where-Object {$_.Name -eq "Microsoft.SharePoint.Powershell"}
if ($snapin -eq $null)
{
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
Add-Type -Path "Microsoft.SharePoint.dll"
Add-Type -Path "Microsoft.SharePoint.Runtime.dll"
}
Все работает нормально при запуске Script непосредственно в окне PowerShell, поэтому я предполагаю, что это как-то связано с PATH или Scope, которые не пересылаются из C # Tool. Игра с параметром useLocalScope из AddCommand или других параметров не дала никаких результатов (хотя я не уверен, имеет ли это какое-либо отношение к путям).
Как я могу заставить скрипт работать и находить внешние сборки?