Вопрос

Я пытаюсь запустить следующую команду PowerShell на своем сервере Exchange 2010 SP1:

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

Когда я это делаю, я получаю сообщение об ошибке:

Не удалось найти базу данных, подходящую для хранения этого запроса.+Информация о категории:Недействительным аргумент:(Domain.com .... D/John Doe: MailboxormailUseridParameter) [new-M ailboxexportrequest], MailboxDatabase ... ManentException + FullqualifiedErrorid:9322CB6D,Microsoft.Exchange.Management.RecipientTasks.NewMailboxExportRequest

Я пытаюсь выполнить поиск среди моих пользователей AD, найти пользователей, у которых есть строка ExportPST в поле Office, а затем экспортировать команду 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 String Форматирование / замена:

$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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top