我正在尝试对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“和\之间的额外空格,我想这会在上面的问题得到解决后引起问题,有没有办法在不添加额外空间的情况下连接字符串?
谢谢,
马特
答案 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")
-FilePath "\\server\share$\$($objItem.Name).pst"
-FilePath ("\\server\share$\{0}.pst" -f $objItem.Name)