Blog (6)
Komentarze (3)
Recenzje (0)
@blindroodZapisz załączniki z plików MSG

Zapisz załączniki z plików MSG

20.01.2012 14:57, aktualizacja: 04.02.2012 17:58

Dzisiaj dzwoni do mnie Pani, że ma dokumenty w wielu(setki) folderach i musi je wszystkie wydrukować...

Okazało się, że te foldery to były pliki Outlooka w formacie MSG (ups). Żeby to normalnie wydrukować, trzeba by było każdy plik otworzyć i zapisać załączniki. Roboty mnóstwo. No więc przychodzi mi z pomocą Powershell (jak zawsze).

Napisałem skrypt, który z każdego pliku wyciąga załączniki i zapisuje je w tym samym folderze. Skrypt działa bardzo prosto. Otwórz plik w Outlooku, zapisz wszystkie załączniki, zamknij plik. Dla uproszczenia pominąłem podawanie ścieżki do zapisu, czy sprawdzanie czy plik już istnieje. Funkcję można znacznie rozbudować.

Po wykonaniu takiego skryptu można wszystkie pliki zaznaczyć i puścić do druku lub skorzystać z mojego poprzedniego wpisu i przerobić wszystkie pliki na jeden plik PDF(jeśli są otwieralne w Wordzie).

Miłego skryptowania:


Function Export-MSGAttachments{
	<#
		.SYNOPSIS
			Export mail attachments and save as files

		.DESCRIPTION
			Function takes .msg files as parameter and foreach retrieves attachments and saves in the same folder as .msg file

		.PARAMETER  file
			.msg file. Can be piped.

		.EXAMPLE
			PS C:\> Get-Childitem | Export-MSGAttachments
                .NOTES
                        Author: BlinDRooD
	#>

	Param(
		[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
		#Test to see if it is a file with .msg extension
		[ValidateScript({(-not $_.psiscontainer)-and ($_.Extension -eq ".msg")})]
		$file
	)

	Begin{
		#enum for closing file without saving
		$close = [Microsoft.Office.Interop.Outlook.OlInspectorClose]::olDiscard
		#outlook object
		$ol = New-Object -ComObject Outlook.Application
	}
	Process{
		#to open msg file you have to treat it as template
		$temp = $ol.CreateItemFromTemplate($file.FullName)
		#saving every attachment
		$temp.Attachments | ForEach-Object { $_.SaveAsFile( (Join-Path $file.Directory $_.FileName))}
		#closing file
		$temp.Close($close)
	}
	End{
		#closing outlook
		[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ol)
	}
}

Proste prawda?

Wybrane dla Ciebie
Komentarze (13)