运行 来自 C# 的 PowerShell 脚本时,Add-PSSnapin 的路径不正确
Path for Add-PSSnapin not correct when running PowerShell Script from C#
我是 运行 来自 C# 工具的 PowerShell 脚本,如下所示:
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);
}
在我需要来自其他程序集的特殊 Cmdlet 之前,在脚本中几乎一切正常。 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"
}
直接在 PowerShell window 中 运行 脚本时一切正常,所以我猜它与未从 C# 工具转发的 PATH 或范围有关。使用 AddCommand 的参数 useLocalScope 或其他参数没有产生任何结果(尽管我不确定这是否与路径有关)。
如何使脚本工作并找到外部程序集?
SharePoint PowerShell 管理单元仅在 64 位中可用。您的 C# 工具可能 运行 宁作为 x86 进程,因此会给您错误 "not installed"。此外,您可能必须 运行 程序 "as Administrator" 因为某些命令需要它才能工作。
第二个错误是,您是对的,默认情况下没有为 SharePoint 设置 PATH 变量。解决方法是指定 .dll 的完整路径(并更改安装的版本号)例如
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.dll"
我是 运行 来自 C# 工具的 PowerShell 脚本,如下所示:
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);
}
在我需要来自其他程序集的特殊 Cmdlet 之前,在脚本中几乎一切正常。 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"
}
直接在 PowerShell window 中 运行 脚本时一切正常,所以我猜它与未从 C# 工具转发的 PATH 或范围有关。使用 AddCommand 的参数 useLocalScope 或其他参数没有产生任何结果(尽管我不确定这是否与路径有关)。
如何使脚本工作并找到外部程序集?
SharePoint PowerShell 管理单元仅在 64 位中可用。您的 C# 工具可能 运行 宁作为 x86 进程,因此会给您错误 "not installed"。此外,您可能必须 运行 程序 "as Administrator" 因为某些命令需要它才能工作。
第二个错误是,您是对的,默认情况下没有为 SharePoint 设置 PATH 变量。解决方法是指定 .dll 的完整路径(并更改安装的版本号)例如
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.dll"