Powershell 在ForEach查询中执行cmdlet

Powershell 在ForEach查询中执行cmdlet,powershell,exchange-server-2010,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 } 执行此操作时,我收到错误: 找不到适合存储此请求的数据库。

我正在尝试对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:MailboxOrmalUserIdParameter)[New-M MailboxExportRequest], MailboxDatabase…manentException +FullyQualifiedErrorId:9322CB6D,Microsoft.Exchange.Management.RecipientTasks.NewMailboxExportRequest

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

当我向上面添加写主机时,输出的值是正确的:

新建邮箱ExportRequest-邮箱jdoe-文件路径“\\server\share$\John Doe.pst”

输出在-FilePath“和\”之间还包含一个额外的空间,我想这会在上述问题解决后引起问题。有没有办法在不添加额外空间的情况下联系字符串

谢谢


Matt

我认为你的引用有点不恰当。当你完全围绕字符串,而不仅仅是变量部分时,双引号字符串扩展就可以工作

$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;
}

如果
$objItem
是字符串,则可以执行以下操作:

-FilePath "\\server\share$\${objItem}.pst"
通过执行以下操作,可以判断它是否为字符串:

$objItem.GetType().FullName
即使它不是字符串,如果objects
ToString()
方法提供了您所需的值,它仍然可以工作,因为PowerShell将自动调用对象的
ToString()
方法并将其放入字符串中。因此,如果这给了您所需的值:
$objItem.ToString()
然后您也可以使用它。如果您必须访问类似$objItem.Name的属性,则需要使用字符串连接、子表达式或.NET字符串格式

  • 连接:
    -FilePath(“\\server\share$\”+$objItem.Name+“.pst”)
  • 子表达式:
    -FilePath“\\server\share$\$($objItem.Name).pst”
  • .NET字符串格式:
    -FilePath(\\server\share$\{0}.pst)-f$objItem.Name)

只要通过强制转换“$objItem”返回的值不包含空格,它就会按照您期望的方式工作。我同意Trevor的建议,并确保对整个路径进行双引号引用。