Windows PowerShell V2 介绍 (8) – 模块

通过之前三篇关于Windows PowerShell v2高级函数的介绍,相信大家对于如何在PowerShell中整合相关代码都有了一定了解。在平时的工作中,相信大家都会把常用的代码整理在一起,以备不时之需。在VBScript时代,如果我们需要在新脚本中重复利用这些代码,唯一的选择就是把它们复制到新的脚本中。而在Windows PowerShell v2中引入了模块的概念,我们可以直接将保存在文件中的相关代码通过特定的cmdlet导入到当前的PowerShell会话中,下面就让我们来看看如何使用Windows PowerShell v2的模块功能。

首先我们还是使用老方法“Get-Command *module* -CommandType cmdlet”来看看和模块相关的cmdlet有哪些。命令的运行结果如下:

大家可以看到命令不是很多,所以使用起来不是很复杂。我们除了使用Windows 7中自带的模块外,也能使用自己创建的模块。在本次介绍中我们主要来看看如何使用自己创建的模块。接下来我们就来看看如何创建模块。

下面我将利用WMI的Win32_UserAccount类提供的信息和功能来编写一个简单的用于演示的本地帐号管理模块。这个模块涉及到两个文件,一个是后缀名为.psm1的模块文件,里面包含三个函数。还有一个是后缀名为.psd1的Manifest文件。下面先来看看后缀名为.psm1中的文件有哪些内容。

$nameSpace = "root\cimv2"
$wmiClass = "Win32_UserAccount"

Function Get-UsersList
{
[CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact="none")]
Param
(
[Parameter(Mandatory=$false,Position=0)]
[boolean]$ShowProperties
)
Process
{
$colUsers = Get-WMIobject -Namespace $nameSpace -Class $wmiClass `
-Filter "LocalAccount='True'"
if ($ShowProperties)
{
$colUsers | Format-List Name,SID,Lockout,Disabled
}
else
{
$colUsers | Format-Table Name,SID -AutoSize
}
}
}

Function Set-User
{
[CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact="High")]
Param
(
[Parameter(Mandatory=$true,Position=0)]
[string]$Name,
[Parameter(Mandatory=$false,Position=1)]
[boolean]$Disabled
)
Process
{
$objUser = Get-WMIobject -Namespace $nameSpace -Class $wmiClass `
-Filter "Name='$Name' And LocalAccount='True'"
if ($Disabled)
{
$objUser.Disabled=$true
$objUser.Put() | Out-Null
}
else
{
$objUser.Disabled=$false
$objUser.Put() | Out-Null
}
}
}

Function Get-LocalAdminName
{
$objUser = Get-WMIobject -Namespace root\cimv2 -class Win32_UserAccount `
-Filter "LocalAccount='True' And SID LIKE '%-500'"
Write-Host "Local Administrator Name:"$objUser.Name
}

在示例模块中,我利用WMI的Win32_UserAccount类一共编写了三个函数,分别是Get-UsersList,Set-User以及Get-LocalAdminName。作用分别是显示用户列表,禁用和启用帐号以及得到本地管理员的名称。其中Get-UsersList和Set-User是高级函数。Get-UsersList的 ShowProperties参数用来控制显示的信息。Set-User的Disabled的参数用来控制是否禁用或者启用账号。相信这些函数的代码大家理解起来困难都不大,因为主要工作都是有Get-WMIObject cmdlet来完成的,这个cmdlet大家应该很熟悉了。最后我们将以上代码保存为lusrmgr.psm1 。

作为示例用的函数虽然很简单,但是一个模块就是由这样的函数累积而成,大家也可以试试扩展下这个模块。接下来我们来看看如何生成后缀名是.psd1的Manifest文件。

首先,Manifest文件的作是用让模块编写者可以提供关于模块的相关信息,比如编写者,编写者所在的公司,关于模块作用的描述等内容。虽然我们可以用Import-Module直接导入后缀名为.psm1的文件,但是很多模块可能不单单只包含一个psm1的文件,有可能还包含dll文件,比如Windows 7中的BitsTransfer模块,这时我们就需要使用Manifest文件了。接下来我们将使用New-ModuleManifest cmdlet来创建该文件。

用于New-ModuleManifest cmdlet参数比较多,而且有些参数是必要参数,大家可以使用“help New-ModuleManifest –full”来查看所有帮助信息。下面我给出的是包含所有必要参数的命令。

New-ModuleManifest ` 
-Author "ghjconan" `
-CompanyName "ITECN" `
-CopyRight "(c) 2009 ghjconan" `
-Description "Local User Account Management" `
-FileList "lusrmgr.psm1" `
-FormatsToProcess @() `
-ModuletoProcess "lusrmgr.psm1" `
-NestedModules @() `
-Path "C:\PowerShell\Modules\Lusrmgr\lusrmgr.psd1" `
-RequiredAssemblies @() `
-TypesToProcess @()

这里需要注意的是ModuletoProcess参数的值是我们的模块文件的名称,通常我们会把psm1文件和Manifest文件放在一起,所以这里直接用的相对路径。而FileList参数的值则是我们要包含在模块中文件集合。而Path参数则是最终Manifest文件的输出路径。最后在执行命令后将生成包含以下内容的文件。

#
# 模块“lusrmgr”的模块清单
#
# 生成者: ghjconan
#
# 生成时间: 2009/6/14
#

@{

# Script module or binary module file associated with this manifest
ModuleToProcess = 'lusrmgr.psm1'

# Version number of this module.
ModuleVersion = '1.0'

# ID used to uniquely identify this module
GUID = '9f6229d5-9bbc-40ee-86dc-9fffcbd6550a'

# Author of this module
Author = 'ghjconan'

# Company or vendor of this module
CompanyName = 'ITECN'

# Copyright statement for this module
Copyright = '(c) 2009 ghjconan'

# Description of the functionality provided by this module
Description = 'Local User Account Management'

# Minimum version of the Windows PowerShell engine required by this module
PowerShellVersion = ''

# Name of the Windows PowerShell host required by this module
PowerShellHostName = ''

# Minimum version of the Windows PowerShell host required by this module
PowerShellHostVersion = ''

# Minimum version of the .NET Framework required by this module
DotNetFrameworkVersion = ''

# Minimum version of the common language runtime (CLR) required by this module
CLRVersion = ''

# Processor architecture (None, X86, Amd64, IA64) required by this module
ProcessorArchitecture = ''

# Modules that must be imported into the global environment prior to importing this module
RequiredModules = @()

# Assemblies that must be loaded prior to importing this module
RequiredAssemblies = @()

# Script files (.ps1) that are run in the caller's environment prior to importing this module
ScriptsToProcess = @()

# Type files (.ps1xml) to be loaded when importing this module
TypesToProcess = @()

# Format files (.ps1xml) to be loaded when importing this module
FormatsToProcess = @()

# Modules to import as nested modules of the module specified in ModuleToProcess
NestedModules = 'lusrmgr.psm1'

# Functions to export from this module
FunctionsToExport = '*'

# Cmdlets to export from this module
CmdletsToExport = '*'

# Variables to export from this module
VariablesToExport = '*'

# Aliases to export from this module
AliasesToExport = '*'

# List of all modules packaged with this module
ModuleList = @()

# List of all files packaged with this module
FileList = 'lusrmgr.psm1'

# Private data to pass to the module specified in ModuleToProcess
PrivateData = ''

}

大家可以看到Manifest文件中的很多属性其实是和基于PowerShell的二次开发有很大关系的,刚才我们的命令只是创建了最基础的属性,为后续的模块导入做准备。

至此,我们已经拥有了lusrmgr.psm1和lusrmgr.psd1这两个文件,我们可以把他们放在名为lusrmgr的文件夹里。如果大家不想复制和粘贴上面的代码的话可以下载文后的附件。

接下来我们来看看如何使用模块。使用模块共分四步:

1. 安装模块
2. 导入模块至PowerShell会话
3. 查找导入的命令
4. 使用导入的命令

1. 安装模块

虽然我们可以从任意文件夹中安装模块,但是为了方便管理,建议大家还是新建一个文件夹来集中放置我们从各种途径得到的模块。我们可以使用new-item来完成新建文件夹的任务,然后使用copy-item将得到模块复制到新建的文件夹中。在PowerShell v2正式发布之后,相信会出现越来越多的模块,到时大家可能得到简单的包含模块的压缩包文件,或者是一个独立的安装文件。无论是安装还是解压缩,我们都需要将模块放置到指定的文件夹,这一过程和我们安装程序类似,因此称之为安装模块。

PowerShell的默认的系统模块文件夹位于$pshome\modules文件夹下,用户模块文件夹则位于%userprofile%\Documents\WindowsPowerShell\Modules或者%userprofile%\My Documents\WindowsPowerShell\Modules。我们可以通过修改环境变量来更改默认模块文件夹的位置,当然为了实现永久修改,我们是需要修改PowerShell的配置文件或者直接修改系统环境变量里的PSModulePath。这个看大家需要。

因此大家可以把附件中的lusrmgr文件夹移动到你创建的专门用来放置模块的文件夹,在我的环境中,我使用的文件夹路径是 C:\PowerShell\Modules\。

2. 导入模块至PowerShell会话

接下来我们就可以使用Import-Module来导入模块了。针对lusrmgr而言,Import-Module使用过程很简单。我们可以在Import-Module后直接更上lusrmgr文件夹的路径,同时我们可以使用-Verbose参数来查看导入过程中具体执行了哪些动作:

3. 查找导入的命令

刚才我们在打开Verbose参数以后,在控制台窗口中已经显示了lusrmgr模块中具体包含了哪些命令。但是如果我们使用cls清屏之后自然就看不到这些信息了,所以还需要另外的方式来查看模块中的命令。当然这个命令大家其实很熟悉,就是我们常用的Get-Command。为了查看模块中的命令,我们需要使用Get-Command的Module参数,具体命令如下

Get-Command –Module lusrmgr

这样,无论我们从何处得到模块,我们都可以通过Get-Command命令来查看模块编写者为我们准备的命令。

4. 使用导入的命令

是否能简单的使用导入的命令,主要看模块编写者提供的方法使用起来是否简单。在之前高级函数的介绍中,我们已经提到了通过使用PowerShell V2中的高级函数可以达到类似cmdlet的操作体验。因此,lusrmgr模块中的命令使用起来并不复杂。下面就来看一下之前提到的几个命令

Get-UsersList及Get-UsersList –ShowProperties

Set-User

Get-LocalAdminName

本次关于如何使用Windows PowerShell v2中模块功能的介绍就到此结束了,敬请期待下一次的介绍。

Advertisements
此条目发表在PowerShel V2 CTP3 intro分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s