Выполнить командлет в запросе ForEach - PullRequest
0 голосов
/ 14 марта 2012

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

$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 / Джон Доу: MailboxOrMailUserIdParameter) [New-M ailboxExportRequest], MailboxDatabase ... manentException + FullyQualifiedErrorId: 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 "и \, который, как я думаю, вызовет проблему после устранения вышеуказанной проблемы. Есть ли способ связать строки без добавления этого дополнительного пробела?

Спасибо

Мэтт

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Я думаю, что ваши цитаты немного не в порядке.Расширение строки в двойных кавычках работает, когда вы полностью окружаете строку, а не только переменную часть.

$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;
}
0 голосов
/ 14 марта 2012

Если $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)
...