Windows PowerShell:共享您的脚本 - 轻松实现

08/17/2016

本文内容

Don Jones

Windows PowerShell v1 的一项限制是它不能轻松实现脚本共享。当然,您可以轻松将 .ps1 脚本文件复制到另一台计算机,甚至将其压缩起来并通过电子邮件发送给同事,可是早在十年前您就能对 VBScript 执行这样的操作了。但是如果您的脚本包含可重用的函数,收到该脚本的人就必须知道如何对其执行 dot-source 操作,否则就必须对其进行修改才能执行那些函数。

总而言之,虽然并不理想,但这种情况还是可以接受的。但是对于伴随着自定义格式视图或类型扩展的脚本而言,这种情况就不那么容易接受了,因为那些额外的文件不得不手动加载到 Shell 中,才能被脚本所使用。

而由于 Windows PowerShell v2 引入了模块,我们几乎实现了一种理想状况。

独立 Shell 块的优点

模块只不过是一组相互关联的文件。有两类广义的模块:二进制文件和脚本。

二进制模块包含一个或多个 DLL 文件,这些文件是从 C#、Visual Basic 等 Microsoft .NET Framework 语言编译生成的。在 v1 的时代,我们把这些文件称为 PSSnapin。事实上,Visual Studio 中编写这样的文件没有很大的变化。但是,管理单元还要求您编写一个安装程序,以便在 Shell 中注册您的 DLL。而对于模块,不需要进行安装。模块附带了一个 .psd1 文件 - 模块清单。清单只是一些 XML 代码,这些代码指示应该加载哪些 DLL。清单还可以指定附带的类型扩展文件 (.ps1xml) 或视图文件 (.format.ps1xml)。

下面介绍它的工作原理:模块必须安装在 Windows PowerShell \modules 文件夹的子目录中。默认情况下,此文件夹位于 c:\windows\system32\windowspowershell\v1.0\modules 中。因此,名为“MyModule”的模块将位于 c:\windows\system32\windowspowershell\v1.0\modules\mymodule 中,而其清单文件为 mymodule.psd1。与模块相关的任何文件通常分组放在同一个文件夹中,从而使所有内容均自我包含。

若要加载模块,您只需运行 Import-Module MyModule。默认情况下,Shell 将查看 \modules 文件夹(但如果您的模块位于其他位置,您也可以向 Import-Module 传递完整的路径),查看是否存在 .psd1 文件,读取该文件,并加载该文件中引用的文件。分发模块非常轻松:只需将所有文件压缩起来,并将 .zip 文件复制到另一台计算机,而无需进行安装。

动手创建自己的模块

那么,这如何帮助您更轻松地分发脚本?答案是第二种模块:脚本模块。这不过是一个普通的 Windows PowerShell 脚本,其文件扩展名为 .psm1,而不是一般的 .ps1。将 mymodule.psm1 放到 \modules 文件夹中之后,就可以运行 Import-Module MyModule,这将执行您的脚本。

通常,脚本模块完全由函数组成。也就是说,在导入该模块时,实际上不会执行任何操作,而仅仅将脚本模块中的函数加载到 Shell 中,并供整个 Shell 使用。假设您有一个类似下面的脚本模块:

Function Get-Inventory {

# (some code goes here)

}

Function Test-Connectivity {

# (some code goes here)

}

Function Write-Inventory {

# (some code goes here)

}

导入此模块将使 Get-Inventory、Test-Connectivity 和 Write-Inventory 函数可供整个 Shell 使用,就像 cmdlet 一样(事实上,我将在下个月讲解如何编写函数,使其几乎完全像“真的”cmdlet 一样)。您的函数甚至能包含基于注释的帮助(我在上一期专栏中进行了演示),这样其他人就可以导入该模块,并运行 Help Get-Inventory 来查看有关使用该函数的说明。

您有时需要一些私密性

有时您可能会拥有一个复杂的脚本模块,其中包含一些函数,仅供其他函数使用,而不由用户使用。例如,我可能希望 Test-Connectivity 和 Write-Inventory 是模块所“私有”的。这意味着它们将被 Get-Inventory 调用,但我不希望它们直接被 Shell 用户调用。

默认情况下,Import-Module 会导入模块中的所有内容,从而使 Shell 用户能够看到所有函数。只需指定您希望对用户可见的函数列表,即可替代此行为;除了您指定的函数以外,Shell 用户将无法看到其他任何内容。为此,只需在脚本模块末尾执行 Export-ModuleMember:

Export-ModuleMember –function Get-Inventory

如果需要,您还可以导出脚本中定义的 cmdlet、变量和别名。 有关详细信息,请运行 Help Export-ModuleMember 或查看 Export-ModuleMember。

模块的不足

对于我来说,v2 模块唯一令人失望的是 Shell 似乎只有一个默认模块位置,而且该位置位于 Windows 系统文件夹下 - 您肯定不希望养成修改此文件夹的习惯。但是随后我查看了 PSModulePath 环境变量,并发现 Shell 还会查看您的“文档”文件夹(位于名为 WindowsPowerShell\Modules 的子文件夹中)。现在,我将我编写的所有模块都存放在该文件夹中。

将来,您很可能会看到 cmdlet 从基于 Internet 的资源库下载更多模块,而不像 Unix 系统中的 Pear 功能一样。这样的 cmdlet 更有可能会下载到您的“文档”文件夹或其他非操作系统的位置,因此让 Shell 在您的“文档”文件夹中搜索模块是一种相当聪明的默认设置。

到处都是模块

由于它们不需要安装就能被 Shell“看到”,因此模块的使用越来越多。事实上,在 Windows Server 2008 R2 中,几乎所有 Windows PowerShell 扩展都被封装为模块 - 唯一的例外是用于自动执行 Windows Server 备份的 PSSnapin(请运行 Get-PSSnapin –registered 来查看它是否安装在服务器上)。而以模块的形式发布的第三方代码更多,包括需要通过 PoshCode.org 访问社区代码资源库的 cmdlet。

事实上,如果您是一位经验丰富的 Windows PowerShell 用户,希望编写自己的 cmdlet,但是不希望深入研究 Visual Studio 中的 .NET Framework 编程,则高级函数(这是下个月的专栏主题)和模块的组合将使您能够完全用脚本来编写自己的 Shell 管理单元。只需将您的高级函数(外观和功能均与 cmdlet 一样)封装到脚本模块中,您就会得到一个易于分发的可重用代码库。

Windows PowerShell v2 现已公开推出

尽管它已经预装在 Windows Server 2008 R2 和 Windows 7 中,Windows PowerShell v2 及其附带的 Management Framework 组件现在已经可以在 Windows XP、Windows Server 2003、Windows Vista 和 Windows Server 2008 上使用。请访问 support.microsoft.com/kb/968929,以便获取针对您使用的操作系统的下载链接。在大多数情况下,这应该与您的 v1 脚本兼容;因此,我将来的专栏将假设您使用的是 2.0。

Don Jones是 Concentrated Technology 的创始人,他会在ConcentratedTech.com 解答有关 Windows PowerShell 和其他技术的问题。他还是Nexus.Realtimepublishers.com的撰稿人,并且他的许多著作还在此网站上以电子版的形式提供。

相关内容

powershell共享服务器写文件,Windows PowerShell:共享您的脚本 - 轻松实现相关推荐

  1. python定时开关机的代码_用python写一个windows下的定时关机脚本(推荐)

    由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦.正好最近在学习Python,于是决定用python写一个定时关机 ...

  2. powershell执行c语言文件,Windows Powershell 执行文件和脚本

    象运行可执行文件一样,Powershell运行文件和脚本,也必须使用绝对路径或者相对路径,或者要运行的文件必须定义在可受信任的环境变量中. 关于脚本 脚本和批处理都属于伪可执行文件,它们只是包含了若干 ...

  3. powershell提取html字段,Windows PowerShell:PowerShell 中的 HTML 报告

    Windows PowerShell:PowerShell 中的 HTML 报告 08/17/2016 本文内容 事实上,您可以使用 Microsoft Windows PowerShell Cmdl ...

  4. 用python写一个windows下的定时关机脚本

    由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦.正好最近在学习python,于是决定用python写一个定时关机 ...

  5. Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能

    Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能 Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能 ...

  6. Windows PowerShell™ 用户手册(zz)

    Windows PowerShell™ 用户手册 Microsoft Corporation 发布日期:2006 年 9 月 摘要 Windows PowerShell™ 是专为系统管理员设计的新 W ...

  7. Windows PowerShell™ 用户手册

    Windows PowerShell™ 用户手册 Microsoft Corporation 发布日期:2006 年 9 月 摘要 Windows PowerShell™ 是专为系统管理员设计的新 W ...

  8. win7禁用powershell_简述Windows 7中的Windows PowerShell功能

    Win7之家( www.win7china.com):简述Windows 7中的Windows PowerShell功能 也许有人会问,这么多的Windows版本过去了,命令提示符怎么还是那样啊?以前 ...

  9. 易学易用的Windows PowerShell(转)

    出处:http://www.cnblogs.com/shanyou/archive/2007/02/12/648204.html Windows PowerShell 是微软为 Windows 环境所 ...

最新文章

  1. 设计建造者模式java代码,Java设计模式-建造者模式
  2. Banana PI A20开发板 通过了CE,FCC,RoHS认证
  3. js源生惯性滚动与回弹(备用)
  4. 算法 求和为n的连续正整数序列 C
  5. C++练习 | C++中Vector的使用
  6. azure webjob java_Executing Java Web Jobs on Azure
  7. android 实例源码解释,Android Handler 原理分析及实例代码
  8. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表
  9. ef mysql code first_MVC5+EF+MYSQL(连接):code first
  10. mysql索引和redis比较_聊聊Mysql索引和redis跳表
  11. 依赖编程内部知识的C语言习惯用法
  12. 斐波那契数列。古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少?
  13. Open-Unmix - A Reference Implementation for Music Source Separation
  14. 数据化、信息化、数字化和智能化之间联系和区别解析(建设收藏)
  15. JSON字符串和JSON对象的相互转换
  16. python手机号归属地查询
  17. workbench动力学周炬_ANSYSWorkbench有限元分析实例详解(动力学)
  18. android 7.0楷体字体,Win7系统怎么设置字体为楷体gb2312
  19. 【转】GB2312汉字分区及内码表
  20. 解压zip,z01,z02

热门文章

  1. Linux中常用C/C++一些头文件的作用
  2. WPFWCFWF打造HelloWorld程序
  3. 什么时间回复客户邮件最有效?
  4. iphone同步助手_教你如何用爱思助手给你的苹果手机设置自己喜欢的铃声
  5. 【学习笔记】20、日期和时间模快
  6. 【转】对服务采购订单的条目确认
  7. Excel单元格里面提取或去掉某些字符
  8. Webservice soap wsdl区别之个人见解
  9. EWM RF 开发常用代码
  10. 将ALV GRID中改变的值更新到ALV内表中