Esegui un cmdlet all'interno di una query foreach
-
13-12-2019 - |
Domanda
Sto tentando di eseguire il seguente comando PowerShell contro il mio server Exchange 2010 SP1:
$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
New-MailboxExportRequest -Mailbox $objItem -FilePath \\server\share$\"$objItem".pst
}
.
Quando lo faccio ricevo l'errore:
.Impossibile localizzare un database adatto per la memorizzazione di questa richiesta. + CategoriaInfo: Invalidargument: (Domain.com .... D / John Doe: MailBoxMoormailUserIDParametro) [New-M AilboxeSportrequest], MailboxDatabase ... ManentException. + CompletoQualifiederrorid: 9322cb6d, microsoft.exchange.management.recipienttasks.newmailBoxeportRequest
Quello che sto tentando di fare è cercare sui miei utenti AD, individuare gli utenti che hanno la stringa exportpst nel campo Office, quindi esporta il comando new-mailboxexportrequest per esportare l'intero contenuto della cassetta postale dell'utente in un PST per ciascuno utente restituito.
Quando aggiungo un host di scrittura a quanto sopra, i valori emessi sono corretti:
.New-MailboxExportrequest -Mailbox JDoe -FilePath "\\ Server \ Condividi $ \ John Doe.pst"
L'output include anche uno spazio extra tra -filepath "e \, che immagino causerò un problema una volta che il problema sopra è stato risolto, c'è un modo per contattare le stringhe senza che aggiunga questo spazio aggiuntivo? Grazie,
Matt
Soluzione
Penso che il tuo citazione sia un po 'fuori.L'espansione della stringa a doppio citata funziona quando circondi completamente la stringa, non solo la parte variabile.
$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
New-MailboxExportRequest -Mailbox $objItem -FilePath "\\server\share$\$objItem.pst"
}
.
Ecco una sintassi alternativa che utilizza la formattazione / sostituzione della stringa .NET:
$colItems = Get-Mailbox -Filter {office -eq "ExportPST"}
ForEach($objItem in $colItems)
{
New-MailboxExportRequest -Mailbox $objItem -FilePath ('\\server\share$\{0}.pst' -f $objItem)
}
.
Per facilitare la risoluzione dei problemi / debug, è possibile assegnare il percorso del file a una variabile, quindi passare la variabile nel parametro -FilePath
.In questo modo puoi vedere esattamente quale valore viene trasmesso.
$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;
}
. Altri suggerimenti
Se $objItem
è una stringa che puoi fare:
-FilePath "\\server\share$\${objItem}.pst"
.
Puoi dire se è una stringa facendo questo:
$objItem.GetType().FullName
.
Anche se non è una stringa, potrebbe ancora funzionare se il metodo ToString()
degli oggetti fornisce il valore che è necessario perché PowerShell chiamerà automaticamente il metodo ToString()
dell'oggetto e metterlo posto nella stringa.Quindi se questo ti dà il valore che desideri: $objItem.ToString()
, allora puoi anche usarlo.Se c'è una proprietà tuttavia come $ objitem.name che devi accedere, è necessario utilizzare la concatenazione delle stringhe, una formattazione della stringa di subaexpression o .net.
- .
- Concatenazione:
-FilePath ("\\server\share$\" + $objItem.Name + ".pst")
- SubExpression:
-FilePath "\\server\share$\$($objItem.Name).pst"
- .NET String Formattazione:
-FilePath ("\\server\share$\{0}.pst" -f $objItem.Name)