我正在编写专门针对Office 365的PowerShell应用程序,但我遇到了一个问题。
var result = pipeline.Invoke();
// close the runspace
runspace.Close();
// convert the script result into a single string
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("<----------------Results---------------->");
foreach (var item in result)
{
stringBuilder.AppendLine(item.ToString());
}
现在,一切都很好,直到我得到我的结果。问题是,如果我收到这样的回复:
UserPrincipalName DisplayName isLicensed
----------------- ----------- ----------
johnsonadmin@johnsoncom... Jack M***** False
如果我在Powershell中运行相同的命令,我会得到相同的结果,但有一些更有条理的格式。它不会说“johnsonadmin @ johnsoncom ...”,而是会给我整个电子邮件地址。
我认为这可能是集合如何自动格式化我的字符串的问题,但我不确定。当我试图解析电子邮件地址的文本时,这就成了一个大问题;)
任何帮助都将不胜感激!!
谢谢!
答案 0 :(得分:5)
如果您尝试将管道的结果解析为字符串,那么您完全错过了powershell的 raison d'etre :您不必解析字符串即可。这就是1970年1月1日。当你坐在现代Windows机器前时,awk,sed和grep正在佛罗里达州的一个养老院。如果你觉得自己正在接触Cygwin,那你做错了。
我这样做是以你的脚本作为起点,但你会得到重点(我希望):
//...
// result is a Collection<PSObject>
foreach (PSObject item in result)
{
// properties are not case-sensitive
string userPrincipalName = item.Properties["userprincipalname"].Value as string;
string displayName = item.Properties["displayname"].Value as string;
bool isLicensed = item.Properties["islicensed"].Value as bool;
// ...
}
Geddit?顺便说一句,你看到输出中切断的一切是因为你正在捕获显示友好的格式化输出,这是针对狭窄的控制台窗口进行优化的。
答案 1 :(得分:1)
而不是item.ToString()
,访问实际属性。
答案 2 :(得分:0)
我很欣赏整个物业的帮助 - 我不知道我能做到这一点。
我最近的问题是在对象引用问题中。我最终使用this thread解决了这个问题。
结合使用不同类型的Powershell,我可以调用两次并通过ISS连接到MSOnline服务,我能够在不解析文本的情况下获取用户列表:)