C# 为什么这个脚本没有';当它';她在PowerShell ISE工作
我想运行一个C# 为什么这个脚本没有';当它';她在PowerShell ISE工作,c#,powershell,sharepoint,C#,Powershell,Sharepoint,我想运行一个PowerShell脚本,通过C#获取列表的ContentType。 在PowerShell中,以下脚本起作用: $list.ContentTypes[0].Name 在C#中运行时,我希望得到相同的结果,如下所示: powershell.AddScript(string.Format("$web = Get-SPWeb {0}", testWeb)); powershell.AddScript("$web.Lists"); var psObjects = powershell.I
PowerShell
脚本,通过C#获取列表的ContentType
。
在PowerShell中,以下脚本起作用:
$list.ContentTypes[0].Name
在C#中运行时,我希望得到相同的结果,如下所示:
powershell.AddScript(string.Format("$web = Get-SPWeb {0}", testWeb));
powershell.AddScript("$web.Lists");
var psObjects = powershell.Invoke();
foreach (var psObject in psObjects)
{
var currentList = (dynamic)psObject;
powershell.Runspace.SessionStateProxy.SetVariable("list", psObject);
powershellContentTypes.AddScript("$list.ContentTypes");
var psContentTypes = powershellContentTypes.Invoke();
foreach (dynamic psContentType in psContentTypes)
{
// I expect to psContentType to have Name property.
// But its properties are like string.
var name = psContentType.Name
}
}
但是,不幸的是,psContentType
没有任何Name
属性。所有返回的psContentType
类型均为string
,其值为:“Microsoft.SharePoint.SPContentType”
<> P>一个BASIC对象时,我的脚本中的脚本有什么不对?>P>,在这种情况下,您可以考虑以下选项来访问对象属性:
var contentTypeName = psContentType.Members["Name"].Value;
您是否可以在不使用ISE的新powershell会话中测试此功能。部分环境可以在ISE中的脚本执行之间保持。从一个新的shell运行它可能会解释其中的差异。事实上,我不想引用SharePoint库。因此,强制转换为
SPContentType
。另外,第二个解决方案不起作用,并抛出NullReferenceException
。我检查了成员
,它的值类似于拆分、子字符串、长度,
,类似于字符串
的属性。
var contentTypeName = psContentType.Members["Name"].Value;
using (var powershell = PowerShell.Create())
{
powershell.AddScript("Add-PsSnapin Microsoft.SharePoint.PowerShell");
powershell.AddScript(string.Format("$web = Get-SPWeb {0}", webUrl));
powershell.AddScript("$web.Lists");
var psLists = powershell.Invoke();
foreach (var psList in psLists)
{
powershell.Runspace.SessionStateProxy.SetVariable("list", psList);
powershell.AddScript("$list.ContentTypes");
var psContentTypes = powershell.Invoke();
foreach (var psContentType in psContentTypes)
{
//var contentType = psContentType.BaseObject as SPContentType;
//var name = contentType.Name;
var type = psContentType.BaseObject.GetType();
if (type.Name == "SPContentType")
{
var contentTypeName = psContentType.Members["Name"].Value;
}
}
}
}