PowerShell New-MailboxExportRequest变量传参转义问题
PowerShell 调用New-MailboxExportRequest变量传参问题解决方案
问题场景
在PowerShell Studio中开发程序嵌入New-MailboxExportRequest命令时,-IncludeFolders和-ContentFilter参数的转义规则不明确,且每次测试需要完整导出、导入PST才能验证结果,测试周期长。
直接在Exchange命令行Shell中可正常执行的硬编码命令如下:
New-MailboxExportRequest -Mailbox user@domain.com -Name JobName -IncludeFolders "#Inbox#/*","#SentItems#" -ContentFilter {(Received -gt "06/10/2022") -and (Sent -gt "06/10/2022")} -FilePath "\\Server\Folder\MyPST.pst"
最初编写的变量传参版本代码执行异常:
New-MailboxExportRequest -Mailbox $mailbox -Name $jobname -IncludeFolders $IncludeFolders -ContentFilter {(Received -gt "$RecDate") -and (Sent -gt "$SentDate")} -FilePath "$FilePath"
修复方案
两个参数的异常分别来自类型错误和作用域解析问题,不需要额外加转义字符,按以下规则赋值即可:
-IncludeFolders参数处理:该参数接收字符串数组类型,不要将多个路径拼接为单个字符串,也不需要对路径中的#特殊标识加转义符,直接按数组格式赋值:# 正确赋值示例 $IncludeFolders = @("#Inbox#/*", "#SentItems#")-ContentFilter参数处理:原写法用{}脚本块包裹过滤条件时,脚本块内的本地变量不会被远程Exchange会话识别,导致参数解析失败。不要使用脚本块格式,提前将过滤条件拼接为字符串,同时统一日期格式避免区域设置导致的解析错误:# 先将日期格式化为固定的MM/dd/yyyy格式,和硬编码命令格式保持一致 $RecDate = [datetime]::Parse("2022-06-10").ToString("MM/dd/yyyy") $SentDate = [datetime]::Parse("2022-06-10").ToString("MM/dd/yyyy") # 直接构造字符串类型的过滤规则,不要套{} $ContentFilter = "Received -gt '$RecDate' -and Sent -gt '$SentDate'"
完整可运行代码
# 定义所有入参变量 $mailbox = "user@domain.com" $jobname = "JobName" $IncludeFolders = @("#Inbox#/*", "#SentItems#") $RecDate = [datetime]::Parse("2022-06-10").ToString("MM/dd/yyyy") $SentDate = [datetime]::Parse("2022-06-10").ToString("MM/dd/yyyy") $FilePath = "\\Server\Folder\MyPST.pst" # 执行导出命令 New-MailboxExportRequest -Mailbox $mailbox -Name $jobname -IncludeFolders $IncludeFolders -ContentFilter $ContentFilter -FilePath $FilePath
测试效率优化
不需要每次等PST导出完成再验证参数正确性,执行命令时加上-WhatIf参数即可做预校验,该模式下不会实际创建导出任务,只会返回解析后的完整命令,和已知可正常运行的硬编码命令对比即可确认参数是否正确:
# 预校验模式,无实际导出操作 New-MailboxExportRequest -Mailbox $mailbox -Name $jobname -IncludeFolders $IncludeFolders -ContentFilter $ContentFilter -FilePath $FilePath -WhatIf
校验通过后去掉-WhatIf参数即可正式执行。
内容的提问来源于stack exchange,提问作者RK-Works
相关产品推荐
相关产品推荐

