目前我有一个Powershell脚本,可以使用以下查询创建一个会话,然后查询Exchange电子邮件:
Get-MessageTrace -StartDate "10/07/2017 12:00 AM" -EndDate "11/06/2017 11:59 PM" -PageSize 5000 -Page $Page | Select Received,SenderAddress,RecipientAddress,Size
我想要更新此脚本,以便它在C#中运行,以便我可以将其作为服务运行,其中包含自动更新开始日期和结束日期等字段。为此,我将它与服务器创建会话,然后运行以下方法:
private static List<PSObject> RetrieveCurrentEmailList(string previousDate, DateTime currentDate, int pageSize,
int currentPage, IReadOnlyList<PSObject> psConnection, Runspace runspace)
{
var powershell = PowerShell.Create();
var command = new PSCommand();
command.AddCommand("Invoke-Command");
command.AddParameter("ScriptBlock",
ScriptBlock.Create(
"Get-MessageTrace -StartDate \"" + previousDate
+ "\" -EndDate \"" + currentDate.ToString("MM/dd/yyyy", CultureInfo.CreateSpecificCulture("en-US"))
+ "\" -pageSize " + pageSize
+ " -Page " + currentPage));
//+ " | Select Received,SenderAddress,RecipientAddress,Size"));
command.AddParameter("Session", psConnection[0]);
powershell.Commands = command;
powershell.Runspace = runspace;
Console.WriteLine("Executing query for page: " + currentPage);
return powershell.Invoke().ToList();
}
返回整个PSObject。但是,当我尝试包含“| Select Received,SenderAddress,RecipientAddress,Size”过滤时,它会停止返回结果。除此之外,还有一个问题,我必须处理运行空间并在每次运行此方法时重新创建它(或任何查询,它似乎是1个运行空间,1个查询)。它通常会带来大约30,000个结果,我一次可以获得的最大尺寸为5,000,这使得该过程非常耗时。
我是这种Powershell / C#集成的新手,所以我不确定我缺少什么。如果你们中的任何人知道如何在处理这类操作时包含过滤或有任何建议/最佳实践,我将非常感激。
答案 0 :(得分:0)
您应该不需要使用Invoke-Command,假设您的运行空间通过New-PSSession&amp; amp;进口的PSSession。请参阅此帖子,了解如何执行此操作:Exchange PowerShell commands through C#。
添加“| Select ...”失败的原因是它需要在ScriptBlock.Create()字符串中。无论如何,下面是(imho)更简洁的方法:
using (var powershell = PowerShell.Create())
{
powershell.Runspace = runspace;
powershell
.AddCommand("Get-MessageTrace")
.AddParameter("StartDate", previousDate)
.AddParameter("EndDate", currentDate)
.AddParameter("PageSize", pageSize)
.AddParameter("Page", currentPage)
.AddCommand("Select-Object")
.AddParameter("Property", new string[] { "Received", "SenderAddress", "RecipientAddress", "Size" });
Console.WriteLine("Executing query for page: " + currentPage);
return powershell.Invoke().ToList();
}
您应该能够重新使用您的运行空间,而无需每次都重新创建它。但是,另一种方法是使用PowerShell对象而不是运行空间。有关详细信息,请参阅上面的链接。