Eksportuj skrzynki pocztowe Exchange z określonej bazy danych Exchange iz określonego zakresu dat za pomocą PowerShell do plików PST z unikalnymi nazwami
- Chcę, aby ten skrypt eksportował skrzynkę pocztową tylko z określonej bazy danych
ze wszystkich baz danych. Próbowałem „-Database Databasename” w skrypcie
ale to daje błąd.
- Skrypt powinien eksportować wszystkie skrzynki pocztowe z wyżej wymienionej bazy danych dla
każdego miesiąca. Powiedz Jeśli uruchom ten skrypt 9 grudnia 2015 r. Powinien wyeksportować
od 9 listopada do 9 grudnia 2015. Daty muszą zostać zmienione automatycznie
według daty kompilacji.
- Dolna część skryptu nie uruchomi się, gdy status żądania eksportu.
Na pytanie nr 1. Wygląda na to, że musisz tylko wpisać Get-Mailbox -Database $ExchangeDB
polecenia, a następnie potokuj to do reszty logiki, itp. To by było, gdy ustawiłeś zmienną $ExchangeDB
i ustaw ją na nazwę Exchange DB. Z jakiegoś powodu musisz ustawić tę komendę jako zmienną, a następnie ją potokować lub jest jakiś problem z jednoczesnym potokowaniem itd.
Na pytanie nr 2. Wydaje się, że zmienna danych nie radzi sobie dobrze z -ContentFilter
Parametr z łańcuchem daty z jakiegoś powodu, ale robi to, jeśli umieścisz datę minus dni w zmiennej i złączysz ją jako część polecenia, a następnie użyjesz tego polecenia, gdy zostanie wykonane.
Na pytanie nr 3. Wygląda na to, że David odpowiedział na to pytanie i może to być literówka w tej części, w której masz problemy. W przeciwnym razie możesz przetestować tę składnię w pętli, aby zobaczyć, jakie wyniki uzyskasz, ponieważ nie sądzę, że potrzebujesz -Mailbox $Export
części w poleceniu:
Get-MailboxExportRequest -resultsize "unlimited" -Status Completed | Remove-MailboxExportRequest -confirm:$false
PUNKTY PAMIĘCI SCRIPT
- Zmienna o jednej dacie ustawiona liczbą dni do odjęcia od bieżącej daty
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
ponieważ otrzymasz dane z tej daty do bieżącej daty.
- The
Get-Mailbox -Database $ExchangeDB
komenda musi być ustawiona jako zmienna, a następnie ta zmienna jest przesyłana do innych części [komendy dynamicznej] $DynCMD
zmienna lub występuje problem z jednoczesnym potokowaniem.
- Użyj obu
Received -ge
i Sent -ge
z -or
zamiast -and
z -ContentFilter
parametr - zapewnia to, że otrzymasz zarówno datę otrzymania, jak i wysłaną dla wiadomości e-mail w obu kierunkach.
- Stało się to dla mnie dość dużym zadaniem, więc skończyło się na tym, że dynamicznie buduje skrypt PowerShell ze wszystkimi właściwymi zmiennymi itp., A następnie wykonuje ten skrypt. Skrypt jest wstawiany do
%temp%
Zmienna środowiskowa systemu operacyjnego Windows i jeśli istnieje przed uruchomieniem, usuwa ją, a następnie buduje.
Uwaga do wydania
(Myślałem Invoke-Command
zadziałałoby, ale zabrakło mi czasu, więc łatwiej i szybciej mogłem przekazać wszystko do skryptu PowerShell ze wszystkimi odpowiednimi zmiennymi ustawionymi zgodnie z kryteriami i po prostu wykonać go później.
The Invoke-Command
ma problemy ze zmiennymi połączonymi z innymi zmiennymi i tworzy dynamiczne komendy, więc to było proste i potwierdzone, aby działać zgodnie z oczekiwaniami, aby rozwiązać twoje problemy, inne niż # 3, które nadal nie są w 100% pewne tego problemu dokładnie tak, zakładając, że literówka, jak sugerował David, chyba że Na pytanie nr 3. podana przeze mnie składnia rozwiązuje.)
PRZYKŁAD POWERSHELL PRZYKŁAD (PIPELINE LOOP)
(Eksportuj wszystkie skrzynki pocztowe programu Exchange z określonej bazy danych Exchange do udziału plików w plikach PST z nazwą pliku będącą nazwą aliasu konta skrzynki pocztowej)
UWAGA: Będziesz musiał zmienić dwie zmienne w tym skrypcie, aby wskazać, z czym jest skonfigurowane twoje środowisko 1.
nazwa Exchange DB [ $ExchangeDB = "<Exchange_DB_Name>"
i 2.
ścieżka UNC, do której mają być eksportowane pliki PST [ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"
] więc te dwie zmienne muszą zostać zmienione. Gdy zostaną one zmienione, uruchom je z okna konsoli programu Exchange Server PowerShell, tak jak je przetestowałem i potwierdziłem, że działa zgodnie z oczekiwaniami.
$TempDir = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB = "Mail04-Original"
$ExportDir = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'
If (Test-Path $TempPSScript){
Remove-Item $TempPSScript
}
'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"
& "$TempPSScript"
PRZYKŁAD POWERSHELL PRZYKŁAD (FOREACH LOOP)
$TempDir = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB = "Mail04-Original"
$ExportDir = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD1 = 'ForEach ($u in (Get-Mailbox -database ' + $ExchangeDB + ')) {'
$DynCMD2 = 'New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -Mailbox $u -FilePath "' + $ExportDir + '\$($u.alias).pst"}'
If (Test-Path $TempPSScript){
Remove-Item $TempPSScript
}
$DynCMD1 | Out-File -Append -Force "$TempPSScript"
$DynCMD2 | Out-File -Append -Force "$TempPSScript"
& "$TempPSScript"
Print Print Exchange Management Console i PowerShell Console
Testowe uruchomienie
Poniżej możesz wkleić do konsoli Exchange PowerShell Management, aby dynamicznie budować skrypt Windows PowerShell dla każdego uruchomienia (przy spełnieniu kryteriów spotkania). Po uruchomieniu w powłoce Exchange PowerShell Management Shell, na serwerze Exchange, ale nie w PS, przejdź do Start
- & gt; Run
- & gt; i wpisz %Temp%
i naciśnij Wchodzić .
Stamtąd sprawdź, czy PS1
plik został nazwany TempMBExport.ps1
i otwórz go za pomocą Notatnika i spójrz na logikę. Zobacz, co się stanie, jeśli skopiujesz zawartość tego skryptu do konsoli Exchange PowerShell Management i wciśniesz Wchodzić .
Nie jestem pewien, czy istnieje problem z tym, że nie przechodzę do folderu zmiennych środowiskowych Windows Temp, jeśli plik nie istnieje lub konsola PS nie ma dostępu do wykonania z tego miejsca lub jeśli Twoja wersja Exchange nie lubi z tych poleceń zacznij od tego i zobaczmy, co się stanie, aby rozwiązać problem.
Poniższy skrypt wyklucza & "$TempPSScript"
część więc NIE wykonuje dynamicznie zbudowanego i kompilowanego %temp%\TempMBExport.ps1
skrypt potwierdzający, że znajduje się w lokalizacji i czy ta logika będzie uruchamiana w konsoli Exchange PS Management to dobry następny krok do rozwiązania problemu.
Trudno jest rozwiązać problem na piśmie bez dostępu lub zdalnie, więc jestem trochę ograniczony i muszę niestety spekulować. Nie jestem pewien, jakie dalsze opcje masz, ale są to szybkie myśli.
$TempDir = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB = "Mail04-Original"
$ExportDir = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'
If (Test-Path $TempPSScript){
Remove-Item $TempPSScript
}
'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"
W KOŃCU
Kiedy uruchamiam PS tak, jak powiedziałem powyżej i otwieram go za pomocą notatnika, aby zobaczyć logikę, buduje go w tym formacie za pomocą tego sytaxu, więc może spróbuj uruchomić to w powłoce zarządzania PS Exchange i zobaczyć, jakie wyniki uzyskasz. Jeśli działa w ten sposób, problem ma związek z wykonaniem skryptu, ale nie ma żadnych błędów, ale może to również rzucić nieco światła na ten temat.
$GetMBCMD = Get-Mailbox -Database Mail04-Original
$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "11/12/2015 00:00:00") -or (Sent -ge "11/12/2015 00:00:00")} -FilePath "\\FileServer\Emailbackups\ExportTest\MonthTest2\$($_.alias).pst"}