使用 Exchange 命令行管理程序编写脚本

 

适用于: Exchange Server 2007 SP3, Exchange Server 2007 SP2, Exchange Server 2007 SP1, Exchange Server 2007

上一次修改主题: 2009-12-18

对于大多数常见的任务,一次运行一个 cmdlet 或通过管道一起运行就足够了。但是,有时可能希望自动执行任务。Exchange 命令行管理程序支持非常丰富的脚本语言,这些语言基于 Microsoft .NET Framework,与其他命令行管理程序中的脚本语言类似。通过 Exchange 命令行管理程序可以创建各种脚本,从非常简单的脚本到非常复杂的脚本。循环、条件、流控制和变量赋值的语言结构全部可以支持。

每个组织都有各自独特的任务。使用执行这些任务的脚本文件库,管理员可以节省时间,并且可以在任何安装了 Exchange 命令行管理程序的计算机上运行这些脚本。

有关如何使用脚本的详细信息,请参阅 Scripting with Windows PowerShell (使用 Windows PowerShell 编写脚本)。由于 Exchange 命令行管理程序基于 Microsoft Windows PowerShell 技术,所以,Windows PowerShell 的脚本编写指导适用于 Exchange 命令行管理程序。

在 Exchange 命令行管理程序内部运行脚本

熟悉 Cmd.exe 环境的用户知道如何运行命令行管理程序脚本。这些脚本只是文件扩展名为 .bat 的文本文件。与批处理文件类似,可以使用文本编辑器(例如记事本)创建 Exchange 命令行管理程序脚本文件。Exchange 命令行管理程序脚本文件使用 .ps1 文件扩展名。

Exchange 命令行管理程序在调用脚本文件时使用脚本文件的根目录。默认情况下,根目录是 <root drive>:\Program Files\Microsoft\Exchange Server\bin 目录。还可以通过从命令行运行 $PSHome,验证任何正在运行 Exchange 命令行管理程序的计算机上的当前 PSHome 目录。这两个目录均在 PATH 环境变量中。

如果将脚本文件保存到根目录,则可以使用脚本名调用脚本。如果脚本文件不在当前位置,则必须使用路径和脚本名。如果脚本文件在当前位置,则必须使用以 .\ 为前缀的脚本名。

下列示例显示调用三个不同脚本的命令语法要求。这些示例全部使用 Get-Date cmdlet,从三个不同的位置运行。

[PS] C:\>Get-Date-Script-A.ps1
Friday, January 20, 2006 3:13:01 PM

脚本文件 Get-Date-Script-A.ps1$PSHhome 指定的目录中,只需要提供脚本名即可运行。

[PS] C:\>c:\workingfolder\Get-Date-Script-B.ps1
Friday, January 20, 2006 3:13:25 PM

脚本文件 Get-Date-Script-B.ps1C:\workingfolder 目录中,所以,必须提供完整路径才能运行。

[PS] C:\>.\Get-Date-Script-C.ps1
Friday, January 20, 2006 3:13:40 PM

脚本文件 Get-Date-Script-C.ps1 在当前位置 C:\。因此,必须以 .\ 为前缀才能运行。

[PS] C:\>Get-Date-Script-C.ps1
'Get-Date-Script-C.ps1' is not recognized as a Cmdlet, function, operable program, or script file.
At line:1 char:21
+ Get-Date-Script-C.ps1 <<<<

在最后一个示例中,在没有前缀 .\ 的情况下调用相同的脚本 Get-Date-Script-C.ps1, 时,显示预期的结果。

最好始终为脚本文件指定一个描述性名称,并在脚本中包含注释,描述其用途并标识每个关注点。还应包含作者的一些信息,以备运行脚本的用户对脚本的使用有疑问时使用。在脚本正文内使用井号 (#) 作为注释行的开头。

通过 Cmd.exe 运行脚本

如果希望通过 Windows 任务计划程序服务定期运行脚本,则可以调用 Exchange 命令行管理程序,并使用要运行的脚本作为参数。由于 Exchange 命令行管理程序是 Windows PowerShell 的一个管理单元,所以,若要运行任何与 Exchange 有关的 cmdlet,在运行该命令时还必须加载 Exchange 命令行管理程序管理单元。若要加载 Exchange 命令行管理程序管理单元并通过 Cmd.exe 命令运行脚本,需要使用以下语法:

PowerShell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\Bin\ExShell.Psc1" -Command ". '<Path to Your Script>'"

例如,若要从 C:\My Scripts 运行脚本 RetrieveMailboxes.ps1,请使用以下命令:

PowerShell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\Bin\ExShell.Psc1" -Command ". 'C:\My Scripts\RetrieveMailboxes.ps1'"

有关在 Cmd.exe 环境中调用 Exchange 命令行管理程序时要使用的其他选项,请键入 PowerShell.exe /?

从 Exchange 管理控制台获得提示

在 Microsoft Exchange Server 2007 中,可以使用 Exchange 管理控制台查看用于执行特定任务的特定 Exchange 命令行管理程序命令的详细信息。在 Exchange 管理控制台中运行向导时,向导将获取您输入的信息并创建一个 Exchange 命令行管理程序命令,然后由计算机运行该命令。可以将此命令直接复制并粘贴到 Exchange 命令行管理程序,也可以将其复制到文本编辑器中,然后在其中修改此命令。如果体验了 Exchange 管理控制台如何创建命令,可以更好地了解如何构建或修改这些命令,以满足未来的需要。

例如,如果为名为 Frank Lee 的用户新建一个邮箱,新建邮箱向导的“完成”页上将显示以下信息:

图 1   新建邮箱向导的“完成”页

新建邮箱“完成”页

“完成”页上显示的信息使您可以了解必要的信息,以确保在 Exchange 命令行管理程序中运行的类似命令可以成功地完成。在“完成”页上,按 Ctrl+C 将此信息复制到剪贴板上。然后可以使用文本编辑器检查该命令,以确定要添加更多邮箱时必须更改的内容。还可以自定义命令,使其可以作为脚本的一部分使用,使用逗号分隔值 (CSV) 文件或其他输入源自动创建许多邮箱。

测试脚本

在新建脚本时,始终应先在实验室环境中测试脚本,然后再应用于生产环境。在实验室中测试脚本时,以及在生产环境中部署脚本时,可以使用 WhatIf 参数验证脚本是否可以正常执行,Exchange 命令行管理程序中的许多 cmdlet 都可以使用该参数。WhatIf 参数指示运行应用此参数的命令,但是只显示运行该命令所影响的对象以及对这些对象所作的更改,而不实际更改任何对象。

有关 WhatIf 参数的详细信息,请参阅 WhatIf、Confirm 和 ValidateOnly 参数

脚本疑难解答

脚本无法正常工作可能有许多原因。可能很难确定出现问题的位置以及问题的根源。Exchange 命令行管理程序可以通过报告故障点的行和字符,帮助您发现常见的语法错误。如果脚本的语法正确但是其行为不正常,可能会更难以诊断问题。Exchange 命令行管理程序具有简单的调试功能,可以通过检查执行脚本时完成的每个步骤来解决脚本文件的问题。此功能称为跟踪。

若要启用跟踪并检查脚本中的每个命令步骤,请使用将 Trace 参数的值设置为 1Set-PSDebug cmdlet。若要检查每个步骤以及完成每个步骤时每个变量赋值,请将 Trace 参数的值设置为 2。若要禁用跟踪,请将 Trace 参数的值设置为 0

若要逐行检查脚本中的每个命令,请使用包含 Step 参数的 Set-PSDebug cmdlet。每个步骤将提示您继续操作。Step 模式下可以使用下列选项:

[Y] Yes (continue to the next step)
[A] Yes to All (continue to the end of the script)
[N] No (stop this step)
[L] No to All (stop all remaining steps)
[S] Suspend (suspend at this point and drop to a prompt)

使用 Suspend 可以退出到提示符下,在提示符下可以运行任何命令,例如在脚本访问对象之前检查或设置对象的值。准备好继续执行脚本时,键入 Exit,控制权将立即返回挂起脚本时的位置。