Pergunta

Estou tentando executar o seguinte comando do PowerShell em meu servidor Exchange 2010 SP1:

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

Quando faço isso recebo o erro:

Não foi possível localizar um banco de dados adequado para armazenar esta solicitação.+ Informações da categoria:Argumento inválido:(domain.com .... D/John Doe: MailboxormailUserIDParameter) [New-M AilboxExporTeCest], MailboxDatabase ... Manentexception + TotlyqualifiedErrorId:9322CB6D,Microsoft.Exchange.Management.RecipientTasks.NewMailboxExportRequest

O que estou tentando fazer é pesquisar meus usuários do AD, localizar usuários que possuem a string ExportPST no campo Office e, em seguida, exportar o comando New-MailboxExportRequest para exportar todo o conteúdo da caixa de correio do usuário para um PST para cada usuário retornado.

Quando adiciono um Write-Host acima, os valores gerados estão corretos:

New-MailboxExportRequest -Mailbox jdoe -FilePath "\server\share$\John Doe.pst"

A saída também inclui um espaço extra entre -FilePath " e \, que imagino que causará um problema assim que o problema acima for resolvido. Existe uma maneira de contatar strings sem adicionar esse espaço extra?

Obrigado,

Matt

Foi útil?

Solução

Acho que sua citação está um pouco errada.A expansão de string entre aspas duplas funciona quando você envolve completamente a string, não apenas a parte variável.

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

Aqui está uma sintaxe alternativa que usa formatação/substituição de string .NET:

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

Para facilitar a solução de problemas/depuração, você pode atribuir o caminho do arquivo a uma variável e, em seguida, passar a variável para o -FilePath parâmetro.Dessa forma, você pode ver exatamente qual valor está sendo passado.

$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;
}

Outras dicas

Se $objItem é uma string que você pode fazer:

-FilePath "\\server\share$\${objItem}.pst"

Você pode saber se é uma string fazendo isto:

$objItem.GetType().FullName

Mesmo que não seja uma string, ainda poderá funcionar se os objetos ToString() fornece o valor que você precisa porque o PowerShell chamará automaticamente o ToString() método do objeto e coloque-o em sua string.Então, se isso lhe der o valor que você deseja: $objItem.ToString() então você também pode usá-lo.Se houver uma propriedade como $objItem.Name que você precisa acessar, você precisará usar concatenação de string, uma subexpressão ou formatação de string .NET.

  • Concatenação: -FilePath ("\\server\share$\" + $objItem.Name + ".pst")
  • Subexpressão: -FilePath "\\server\share$\$($objItem.Name).pst"
  • Formatação de string .NET: -FilePath ("\\server\share$\{0}.pst" -f $objItem.Name)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top