我希望通过从C#运行Powershell命令在Microsoft Online的GAL中创建多个mailcontacts(外部联系人)。下面的代码有效,但速度很慢,需要大约15-20分钟来运行400个邮件联系。
foreach(EmailAdressVM emailAddressVM in emailList.emailAddresses1)
{
//Create New MailContact.
Pipeline pplNewMailContact = runspace.CreatePipeline();
Command cmdNewMailContact = new Command("New-MailContact");
cmdNewMailContact.Parameters.Add("Name", emailAddressVM.sExternalEmailAddress);
cmdNewMailContact.Parameters.Add("Displayname", emailAddressVM.sFullName.Trim());
cmdNewMailContact.Parameters.Add("Lastname", emailAddressVM.sLastName.Trim());
cmdNewMailContact.Parameters.Add("Firstname", emailAddressVM.sFirstName.Trim());
cmdNewMailContact.Parameters.Add("ExternalEmailAddress", emailAddressVM.sExternalEmailAddress.Trim());
pplNewMailContact.Commands.Add(cmdNewMailContact);
pplNewMailContact.Invoke();
pplNewMailContact.Stop();
pplNewMailContact.Dispose();
}
我猜这很慢,因为我为每个添加的新邮件联系创建了一个新的管道,并且自运行以来必须有一种更有效的方法来执行此操作......
import-csv <filename> | ForEach {
new-mailcontact -name $_.emailaddress -displayname $_.FullName -lastname $_.lastname -firstname $_.firstname -externalemailaddress $_.emailaddress -alias $_.alias
}
...要快得多。
我在网上搜索了几个小时之后发现了一些参考资料,你可以在从C#运行Powershell命令时执行类似于使用CSV的操作,即将一个列表(或数组)值发送到命令(在这种情况下, “new-mailcontact”命令)。但是,我没有找到任何关于如何向命令发送多个值的好例子,我需要提供许多值(例如:-name $ .emailAddress -displayname $ .FullName等。)到“new-mailcontact”命令。
是否可以以与“import-csv”命令类似的方式发送列表(或数组)(使用常规PowerShell时)并且这会更快,还是有更好的方法?如果我使用Powershell 3而不是1(我现在正在使用),我会获得更好的性能。
请提供工作示例代码i C#!
请注意我无法将CSV文件保存到磁盘和执行powershell来自CMD,因为我没有对磁盘的写入权限,而且我认为我不能远程运行整个脚本(因为远程脚本可能已被禁用)在Exchange Online上。)
答案 0 :(得分:0)
我认为最大的原因是因为对于每个地址,您正在创建一个新的Powershell实例而且您不是多线程的。
您的代码从上面看起来像这样:
Foreach email address{
Declare a new Powershell process
Add attributes to call later
Start Powershell and pipe stuff in
Close Powershell instance
}
我认为你最好先创建一个Powershell实例/管道,然后将每个对象发送到它。更多的是:
Create PS Pipe
Foreach email address{
PS.SendArguments(Email, Name, DN, etc.);
}
我现在不在某个环境中工作或测试,所以希望这至少可以为您提供所需的大部分内容......