在ForEach查询中执行cmdlet
-
13-12-2019 - |
题
我正在尝试对我的Exchange2010SP1服务器运行以下PowerShell命令:
$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
New-MailboxExportRequest -Mailbox $objItem -FilePath \\server\share$\"$objItem".pst
}
当我这样做时,我收到错误:
找不到适合存储此请求的数据库。+分类信息 :无效的,无效的:(domain.com....d/李四:MailboxOrMailUserIdParameter)[New-M ailboxExportRequest], 邮箱数据库。..manentException异常 +完全资格 :9322cb6d,微软。交换。管理。RecipientTasks.NewMailboxExportRequest
我试图做的是在我的AD用户中搜索,找到在Office字段中具有字符串ExportPST的用户,然后导出命令New-MailboxExportRequest以将用户邮箱的全部内容导出到返回的每个用户的PST。
当我在上面添加一个Write-Host时,输出的值是正确的:
New-MailboxExportRequest-Mailbox jdoe-FilePath"\\server\share$\John Doe。pst"
输出还包括-FilePath"和\之间的额外空间,我想一旦上述问题得到解决就会导致问题,有没有办法在没有它添加这个额外空间的情况下联系字符串?
谢谢,
马特
解决方案
我认为你的报价有点偏离。双引号字符串扩展在完全围绕字符串时,不仅仅是变量部分。
$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
即使它不是一个字符串,它仍然可能工作,如果对象 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)