사서함을 내보내는 Power Shell 스크립트

사서함을 내보내는 Power Shell 스크립트

나는 작동하는 스크립트를 가지고 있으며 한 달 동안 모든 사서함에 대해 백업을 수행하여 로컬 공유 드라이브에 저장하도록 프로그래밍되어 있습니다. 스크립트를 실행하면 지정된 날짜 범위 대신 전체 데이터베이스를 내보냅니다. 나는 프로그래머가 아닙니다. Google에서 많이 검색했지만 100% 성공하지는 못했습니다. 나는 다음과 같은 수정을 원한다

  1. 해당 스크립트가 모든 데이터베이스가 아닌 특정 데이터베이스에서만 사서함을 내보내도록 하고 싶습니다. 스크립트에서 "-Database Databasename"을 시도했지만 오류가 발생합니다.

  2. 스크립트는 위에서 언급한 데이터베이스의 모든 사서함을 매월 내보내야 합니다. 2015년 12월 9일에 이 스크립트를 실행하면 2015년 11월 9일부터 12월 9일까지 내보내야 합니다. 날짜는 컴파일 날짜에 따라 자동으로 변경되어야 합니다.

  3. ImportRequest가 시작되는 스크립트의 하단 부분은 실행되지 않습니다.

이것은 스크립트입니다

$Export = Get-Mailbox

$endDate = Get-Date "00:00:00"

$startDate = $endDate.AddDays(-30)

$month = "{0:D2}" -f [int]$startDate.Month

$year = "{0:D4}" -f [int]$startDate.Year

Write-Host -NoNewline "Exporting items between $startDate and $endDate..."

$Export|%{$_|New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -FilePath "\\FileServer\EmailBackups\ExportTest\Test\$($_.alias).pst"}

Write-Host "Done."

Write-Host -NoNewline "Waiting for export to complete..."

이 스크립트 후에 오류가 발생했습니다. 그러나 사서함은 전체 내보내기됩니다.

While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))

{

    #Sleep for a  few minutes
    Write-Host -NoNewline "."
    Start-Sleep -s 60
}

Write-Host "Done."

Write-Host -NoNewline "Removing Export Request..."

Get-MailboxExportRequest -Mailbox $Export -Status Completed | Remove-MailboxExportRequest

Write-Host "Done."

이 스크립트를 완벽하게 만들 수 있도록 도와주세요. 감사해요

답변1

PowerShell을 사용하여 특정 Exchange DB 및 특정 날짜 범위의 Exchange 사서함을 고유한 이름을 가진 PST 파일로 내보내기

  1. 해당 스크립트가 모든 데이터베이스가 아닌 특정 데이터베이스에서만 사서함을 내보내도록 하고 싶습니다. 스크립트에서 "-Database Databasename"을 시도했지만 오류가 발생합니다.
  2. 스크립트는 위에서 언급한 데이터베이스의 모든 사서함을 매월 내보내야 합니다. 2015년 12월 9일에 이 스크립트를 실행하면 2015년 11월 9일부터 12월 9일까지 내보내야 합니다. 날짜는 컴파일 날짜에 따라 자동으로 변경되어야 합니다.
  3. ImportRequest가 시작되는 스크립트의 하단 부분은 실행되지 않습니다.

질문 #1의 경우.명령을 입력한 Get-Mailbox -Database $ExchangeDB다음 이를 나머지 논리 등에 연결하기만 하면 됩니다. 여기에서 변수를 설정 $ExchangeDB하고 이를 Exchange DB 이름으로 설정합니다. 어떤 이유로 이 명령을 변수로 설정한 다음 파이프해야 하거나 동시 파이프라이닝 등에 문제가 있습니다.

질문 #2의 경우.데이터 변수는 -ContentFilter어떤 이유로 날짜 문자열이 포함된 매개변수와 잘 어울리지 않는 것 같지만, 날짜에서 일수를 뺀 값을 변수에 넣고 이를 명령의 일부로 연결한 다음 해당 명령을 사용하면 문제가 발생합니다. 실행되면.

질문 #3의 경우.David가 이에 대해 답변한 것으로 보이며 문제가 있는 부분에 대한 오타 문제일 수도 있습니다. 그렇지 않은 경우 루프에서 다음 구문을 사용하여 자유롭게 테스트하여 -Mailbox $Export명령에 해당 부분이 필요하지 않다고 생각하므로 어떤 결과를 얻는지 확인하세요.

Get-MailboxExportRequest -resultsize "unlimited" -Status Completed | Remove-MailboxExportRequest -confirm:$false

스크립트 노트 포인트

  • $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")해당 날짜부터 현재 날짜까지의 데이터를 가져오므로 현재 날짜에서 뺄 일수로 설정된 날짜 변수 1개 .
  • 명령 Get-Mailbox -Database $ExchangeDB을 변수로 설정한 다음 해당 변수를 [동적 명령] $DynCMD변수의 다른 부분으로 파이프해야 합니다. 그렇지 않으면 동시 파이프라인에 문제가 있습니다.
  • 매개 변수 대신 BOTH Received -geSent -gewith를 사용하면 양방향으로 이메일 항목의 수신 날짜와 전송 날짜 이후를 모두 얻을 수 있습니다.-or-and-ContentFilter
  • 이것은 나에게 상당한 작업으로 바뀌었기 때문에 적용 가능한 모든 변수 등이 설정된 PowerShell 스크립트를 동적으로 구축한 다음 나중에 해당 스크립트를 실행하도록 만들었습니다. 해당 스크립트는 Windows OS 환경변수 위치에 넣어두고 %temp%, 실행되기 전에 존재했다면 삭제한 후 빌드합니다.

이슈노트

(이것이 효과가 있을 것이라고 생각했지만 Invoke-Command시간이 부족했기 때문에 기준에 따라 모든 적용 가능한 변수가 설정된 PowerShell 스크립트에 모든 것을 연결하고 나중에 실행하는 것이 더 쉽고 시기적절했습니다. Invoke-Command변수에 문제가 있습니다. 다른 변수에 연결하고 동적 명령을 작성했기 때문에 이것은 간단하고 문제를 해결하기 위해 예상대로 작동하는 것으로 확인되었습니다. #3을 제외하고는 여전히 문제가 100% 확실하지 않으므로 David가 제안한 오타를 가정합니다. 않는 한질문 #3의 경우.내가 제공한 구문이 해결되었습니다.)


POWERSHELL 예제 스크립트(파이프라인 루프)

(특정 Exchange DB의 모든 Exchange 사서함을 파일 이름이 사서함 계정 별칭 이름인 PST 파일에 대한 파일 공유로 내보냅니다.)

메모:환경이 무엇으로 구성되어 있는지 가리키도록 이 스크립트에서 두 개의 변수를 변경해야 합니다.1. Exchange DB 이름[ $ExchangeDB = "<Exchange_DB_Name>"그리고2. PST 파일을 내보낼 UNC 경로[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"] 따라서 두 변수를 변경해야 합니다. 변경한 후에는 Exchange Server PowerShell 명령 콘솔 창에서 실행하여 테스트하고 예상대로 작동하는지 확인했습니다.

$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"

POWERSHELL 예제 스크립트(FOREACH 루프)

$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"

스크린 인쇄 Exchange 관리 콘솔 및 PowerShell 콘솔

여기에 이미지 설명을 입력하세요


테스트 실행

다음은 Exchange PowerShell 관리 콘솔에 붙여넣어 실행할 때마다 동적으로 Windows 임시 PowerShell 스크립트를 빌드할 수 있는 내용입니다(완료 기준 충족). PS가 아닌 Exchange Server의 Exchange PowerShell 관리 셸에서 실행되면 Start--> Run-->로 이동하여 를 입력 %Temp%하고 키를 누릅니다 Enter.

거기에서 PS1이름이 지정된 파일이 생성되었는지 확인 TempMBExport.ps1하고 메모장으로 열어 논리를 살펴보세요. 해당 스크립트의 내용을 Exchange PowerShell 관리 콘솔에 복사하고 키를 누르면 어떻게 되는지 확인하세요 Enter.

파일이 존재하지 않거나 PS 콘솔이 해당 폴더에서 파일을 실행할 수 없거나 Exchange 버전이 마음에 들지 않는 경우 Windows Temp 환경 변수 폴더로 이동하지 않는 데 문제가 있는지 확실하지 않습니다. 이러한 명령 중 이것부터 시작하여 문제를 해결하려면 어떻게 되는지 살펴보겠습니다.

아래 스크립트는 해당 & "$TempPSScript"부분을 제외하므로 동적으로 구축되고 컴파일된 스크립트를 실행하지 않으므로 %temp%\TempMBExport.ps1해당 위치에 있는지 확인하고 Exchange PS 관리 콘솔에서 이 논리가 실행되는지 여부를 확인하는 것이 문제를 파악하는 데 좋은 다음 단계입니다.

액세스나 원격 지원 없이 서면으로 문제를 해결하는 것은 어렵기 때문에 여기에는 약간 제한이 있고 불행히도 일부 추측을 해야 합니다. 어떤 추가 옵션이 있는지 확실하지 않지만 이는 몇 가지 간단한 생각입니다.

$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"

마지막으로

위에서 설명한 대로 PS를 실행하고 로직을 보기 위해 메모장으로 열면 이 구문을 사용하여 이 형식으로 빌드되므로 Exchange PS 관리 셸에서 이를 실행하여 어떤 결과가 나오는지 확인해 보세요. 이런 식으로 작동하는 경우 문제는 스크립트 실행과 관련이 있지만 오류는 발생하지 않지만 주제에 대한 정보도 어느 정도 밝힐 수 있습니다.

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

답변2

그 후 스크립트에서 오류가 발생합니다.

While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))

맞춤법 오류가 있는 것 같습니다.

$Exprot다음으로 교체 $Export:

While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))

관련 정보