当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 将 Office Outlook VBA 宏转换为 PowerShell

作者:精品下载站 日期:2024-12-14 08:14:22 浏览:14 分类:玩电脑

将 Office Outlook VBA 宏转换为 PowerShell


在我的职业生涯中,我总是遇到一些具有挑战性的问题或要求。其中一项挑战是自动化本地 PST 归档(不要与在线归档混淆)。邮箱中的每个文件夹都有一个 MAPI 属性,用于标识该文件夹是否要本地存档。此属性驻留在邮箱本身内,并且在没有用户干预的情况下,没有在邮箱中自动设置此属性的方法。 Outlook 提供了一个按钮,可将所有文件夹设置为本地存档,但创建的新文件夹不会继承该设置。

我能找到的唯一文档位于 MSDN 上的 VBA 格式。我的最终解决方案是创建一个 Outlook 加载项,以避免必须使用组策略来允许外部访问应用程序。如果您正在寻找此解决方案,可以在此处下载该加载项。通过这个过程,我能够将 VBA 宏转换为 VBS、C# 和 PowerShell。以下是将 VBA 转换为 PowerShell 的前后对比,可应用于您可能找到的任何 VBA 宏。

之前的VBA代码:

Function ChangeAgingProperties(oFolder As Outlook.Folder, _ 
 AgeFolder As Boolean, DeleteItems As Boolean, _ 
 FileName As String, Granularity As Integer, _ 
 Period As Integer, Default As Integer) As Boolean 
 
 '6 MAPI properties for aging items in a folder 
 Const PR_AGING_AGE_FOLDER = _ 
 "http://schemas.microsoft.com/mapi/proptag/0x6857000B" 
 Const PR_AGING_DELETE_ITEMS = _ 
 "http://schemas.microsoft.com/mapi/proptag/0x6855000B" 
 Const PR_AGING_FILE_NAME_AFTER9 = _ 
 "http://schemas.microsoft.com/mapi/proptag/0x6859001E" 
 Const PR_AGING_GRANULARITY = _ 
 "http://schemas.microsoft.com/mapi/proptag/0x36EE0003" 
 Const PR_AGING_PERIOD = _ 
 "http://schemas.microsoft.com/mapi/proptag/0x36EC0003" 
 Const PR_AGING_DEFAULT = _ 
 "http://schemas.microsoft.com/mapi/proptag/0x685E0003" 
 
 Dim oStorage As StorageItem 
 Dim oPA As PropertyAccessor 
 
 ' Valid Period: 
 ' 1-999 
 ' 
 ' Valid Granularity: 
 ' 0=Months, 1=Weeks, 2=Days 
 ' 
 ' Valid Default: 
 ' 0=All settings do not use a default setting 
 ' 1=Only the file location is defaulted 
 ' "Archive this folder using these settings" and 
 ' "Move old items to default archive folder" are checked 
 ' 3=All settings are defaulted 
 ' "Archive items in this folder using default settings" is checked 
 
 If (oFolder Is Nothing) Or _ 
 (Granularity < 0 Or Granularity > 2) Or _ 
 (Period < 1 Or Period > 999) Or _ 
 (Default < 0 Or Default = 2 Or Default > 3) _ 
 Then 
 ChangeAgingProperties = False 
 End If 
 
 On Error GoTo Aging_ErrTrap 
 
 'Create or get solution storage in given folder by message class 
 Set oStorage = oFolder.GetStorage( _ 
 "IPC.MS.Outlook.AgingProperties", olIdentifyByMessageClass) 
 Set oPA = oStorage.PropertyAccessor 
 
 If Not (AgeFolder) Then 
 oPA.SetProperty PR_AGING_AGE_FOLDER, False 
 Else 
 'Set the 6 aging properties in the solution storage 
 oPA.SetProperty PR_AGING_AGE_FOLDER, True 
 oPA.SetProperty PR_AGING_GRANULARITY, Granularity 
 oPA.SetProperty PR_AGING_DELETE_ITEMS, DeleteItems 
 oPA.SetProperty PR_AGING_PERIOD, Period 
 If FileName  "" Then 
 oPA.SetProperty PR_AGING_FILE_NAME_AFTER9, FileName 
 End If 
 oPA.SetProperty (PR_AGING_DEFAULT), Default 
 End If 
 'Save changes as hidden messages to the associated portion of the folder 
 oStorage.Save 
 ChangeAgingProperties = True 
 Exit Function 
 
Aging_ErrTrap: 
 Debug.Print Err.Number, Err.Description 
 ChangeAgingProperties = False 
End Function 
 

之后的 PowerShell 代码:


Function ChangeAgingProperties ( [string]$Folder, [boolean]$AgeFolder, [boolean] $DeleteItems, [string]$FileName, [int]$Granularity, [int]$Period, [int]$Default)
{
	#6 MAPI properties for aging items in a folder
	$PR_AGING_AGE_FOLDER = "http://schemas.microsoft.com/mapi/proptag/0x6857000B"
	$PR_AGING_PERIOD = "http://schemas.microsoft.com/mapi/proptag/0x36EC0003"
	$PR_AGING_GRANULARITY = "http://schemas.microsoft.com/mapi/proptag/0x36EE0003"
	$PR_AGING_DELETE_ITEMS = "http://schemas.microsoft.com/mapi/proptag/0x6855000B"
	$PR_AGING_FILE_NAME_AFTER9 = "http://schemas.microsoft.com/mapi/proptag/0x6859001E"
	$PR_AGING_DEFAULT = "http://schemas.microsoft.com/mapi/proptag/0x685E0003"
	
	# Valid Period: 
 	# 1 - 999
	# 
	# Valid Granularity:
	# 0=Months, 1=Weeks, 2=Days 
	#
	# Valid Default: 
 	# 0 = All settings do not use a default setting
	# 1=Only the file location is defaulted 
	# "Archive this folder using these settings" and
	# "Move old items to default archive folder" are checked 
	# 3 = All settings are defaulted
	# "Archive items in this folder using default settings" is checked 
	
	if (($objFolder -eq $null) -or ($Granularity -lt 0 -or $Granularity -gt 2) -or ($Period -lt 1 -or $Period -gt 999) -or ($Default -lt 0 -or $Default -eq 2 -or $Default -gt 3))
	{
		return $False
	}
	
	Try
	{
		$app = New-Object -ComObject Outlook.Application
		$namespace = $app.GetNamespace("MAPI")
		$objFolder = $namespace.GetFolder($Folder)
		$oStorage = $objFolder.GetStorage("IPC.MS.Outlook.AgingProperties", $olIdentifyByMessageClass)
		$oPA = $oStorage.PropertyAccessor
		
		If ($AgeFolder -eq $false)
		{
			oPA.SetProperty PR_AGING_AGE_FOLDER, False
		}
		Else
		{
			#Set the 6 aging properties in the solution storage
			$oPA.SetProperty($PR_AGING_AGE_FOLDER, $True)
			$oPA.SetProperty($PR_AGING_GRANULARITY, $Granularity)
			$oPA.SetProperty($PR_AGING_DELETE_ITEMS, $DeleteItems)
			$oPA.SetProperty($PR_AGING_PERIOD, $Period)
			if ($FileName -ne $null)
			{
				$oPA.SetProperty($PR_AGING_FILE_NAME_AFTER9, $FileName)
			}
			$oPA.SetProperty($PR_AGING_DEFAULT, $Default)
		}
		
		#Save changes as hidden messages to the associated portion of the folder
		$oStorage.Save()
		return $True
	}
	
	Catch
	{
		Write-Output $_
		return $False
	}
}

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯