Выполнение командлета в запросе ForEach
-
13-12-2019 - |
Вопрос
Я пытаюсь запустить следующую команду 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)