在ForEach查询中执行cmdlet

时间:2012-03-14 13:18:04

标签: powershell exchange-server-2010

我正在尝试对Exchange 2010 SP1服务器运行以下PowerShell命令:

$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
New-MailboxExportRequest -Mailbox $objItem -FilePath \\server\share$\"$objItem".pst
}

当我这样做时,我收到错误:

  

无法找到适合存储此请求的数据库。       + CategoryInfo:InvalidArgument:(domain.com .... d / John Doe:MailboxOrMailUserIdParameter)[New-M ailboxExportRequest],   MailboxDatabase ... manentException       + FullyQualifiedErrorId:9322CB6D,Microsoft.Exchange.Management.RecipientTasks.NewMailboxExportRequest

我尝试做的是搜索我的AD用户,在Office字段中找到具有字符串ExportPST的用户,然后导出命令New-MailboxExportRequest以将用户邮箱的全部内容导出到每个用户的PST用户返回。

当我向上面添加一个Write-Host时,输出的值是正确的:

  

New-MailboxExportRequest -Mailbox jdoe -FilePath“\\ server \ share $ \ John Doe.pst”

输出还包括-FilePath“和\之间的额外空格,我想这会在上面的问题得到解决后引起问题,有没有办法在不添加额外空间的情况下连接字符串?

谢谢,

马特

2 个答案:

答案 0 :(得分:2)

我认为你的报价有点偏。双引号字符串扩展在完全包围字符串时起作用,而不仅仅是变量部分。

$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
  New-MailboxExportRequest -Mailbox $objItem -FilePath "\\server\share$\$objItem.pst"
}

这是使用.NET字符串格式化/替换的替代语法:

$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
  New-MailboxExportRequest -Mailbox $objItem -FilePath ('\\server\share$\{0}.pst' -f $objItem)
}

为了简化故障排除/调试,您可以将文件路径分配给变量,然后将变量传递给-FilePath参数。这样你就可以确切地看到传入了哪个值。

$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
  $FilePath = '\\server\share$\{0}.pst' -f $objItem;
  Write-Host -Object ('$FilePath value is: {0}' -f $FilePath);
  New-MailboxExportRequest -Mailbox $objItem -FilePath $FilePath;
}

答案 1 :(得分:0)

如果$objItem是一个字符串,你可以这样做:

-FilePath "\\server\share$\${objItem}.pst"

你可以通过这样做判断它是否是一个字符串:

$objItem.GetType().FullName

即使它不是字符串,如果对象ToString()方法提供了您需要的值,它仍然可以工作,因为PowerShell会自动调用对象的ToString()方法并将其放在字符串中。因此,如果这样可以为您提供所需的值:$objItem.ToString()那么您也可以使用它。如果有一个属性,但是你必须访问$ objItem.Name,那么你将需要使用字符串连接,子表达式或.NET字符串格式化。

  • 连接:-FilePath ("\\server\share$\" + $objItem.Name + ".pst")
  • Subexpression:-FilePath "\\server\share$\$($objItem.Name).pst"
  • .NET字符串格式:-FilePath ("\\server\share$\{0}.pst" -f $objItem.Name)