抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Powershell入门指南(一)·PowerShell及CLI发展

不知各位有没有注意,从Windows 10开始,在开始按钮上右键,菜单里面的CMD不见了,取而代之的是一个叫PowerShell的东西。


也许你也曾经打开过它,但是不知道它有什么用;
或者你了解一些CMD命令,但是你发现在这个PowerShell里面有些命令好像不能执行了。
而且这个PowerShell相比CMD启动也不算快,微软为什么要拿这个替换CMD呢
这要从早期的Windows的命令行背景说起:

背景

用于个人计算机的每个Windows版本都包含一个用于管理操作系统的命令行解释程序(CLI);Windows系统的前身,即MS-DOS,完全依赖CLI支持。在MS-DOS和Windows9x系列系统里面提供CLI功能的程序是COMMAND.COM,在Windows NT以及之后的各种系统是CMD.exe提供CLI支持的。这两者都支持一些内部命令。
它们还包括基本的脚本语言(batch file)支持,这些脚本可以完成多种自动化工作,但是对于用户交互界面(GUI)的自动化工作,它们就完全无能为力了。这是因为对GUI这些操作对应脚本的等价操作来说是受限的,毕竟这是最基本的脚本环境,支持的功能不全。到了Windows Sever 2003发布的时候,这一情况有所改善,但是仍令人不满意。

其实Microsoft在1998年就试图通过对Windows 98引入Windows脚本宿主(WSH)来解决其中一些缺点,这个程序在系统中名叫cscript.exe,它集成了Active script[^1]脚本引擎,可以使用兼容的VBscriptJScript来编写,调用其他应用程序的API或者COM。然而,它有其自身的不足之处:
的文档不是很容易获得,并且在几个有名的计算机病毒利用其安全协议中的弱点之后,迅速获得了作为脆弱的系统漏洞荣誉(大雾)。不同版本的Windows提供了各种专用命令行解释器(例如netsh和WMIC)及其只适用自己的命令,但它们之间不可互操作。


开发人员的设想

在9月13日发表的一次采访中,Jeffrey Snover(PowerShell之父)解释了开发该项目的动机:

“我一直推动管理的变更,然后我开始把一些UNIX工具适配到Windows平台,结果它们却不能工作,对吧?因为Windows 和Linux的核心架构有很大区别。在Linux上,一切都是ASCII文本文件,因此所有支持这种文件的软件都可以作为管理软件。想想看,使用AWK(文本处理工具)、grep(文本搜索工具)、sed(类似于AWK)管理你的系统是多么美好的事请!
我把这些工具移植到Windows,结果它们对于系统的管理没有任何作用,因为所有的API返回的都是结构化的数据,因此那些UNIX软件没什么帮助。
……
我突然有了就是现在powershell这样子的想法,告诉别人说:‘嘿!没准我们可以把这个做得更好!’”


开发历程

  • 2002年,微软开始开发一种新的命令行管理方法,名为Monad(也称为Microsoft Shell或MSH)的CLI。其背后的想法于2002年8月发表在一份名为Monad Manifesto的白皮书中。Monad将成为一个新的可扩展CLI,其设计新颖,能够自动执行各种核心管理任务。

  • 微软于2003年10月在洛杉矶举行的专业发展大会上首次展示Monad。几个月后开始私人测试计划,最终推出公共测试计划。

  • Microsoft 于2005年6月17日发布了第一个Monad公共测试版,

  • 2005年9月11日发布了Beta 2

  • 2006年1月10日发布了Beta 3。

  • 不久之后,2006年4月25日,Microsoft正式宣布Monad已重命名为Windows PowerShell,将其定位为其管理技术产品的重要组成部分。 名称更改和RC的一个重要方面是,它现在是Windows的一个组件,而不是附加产品。

  • PowerShell版本1的候选版本2于2006年9月26日发布,最终发布于2006年11月14日,并在TechEd Barcelona上发布。

  • 早期版本的Windows PowerShell于2007年1月30日发布。

  • PowerShell v2.0开发在PowerShell v1.0发布之前就开始了。在开发过程中,Microsoft发布了三个社区技术预览(CTP)。Microsoft向公众提供了这些版本。

  • Windows PowerShell v2.0的最后一个CTP版本于2008年12月推出。

  • 适用于Ubuntu 14.04 x64 上的Linux 6.0 Alpha 9的PowerShell

  • PowerShell v2.0已于2009年8月完成并发布,作为Windows 7和Windows Server 2008 R2的组成部分。适用于Windows XP,Windows Server 2003,Windows Vista和Windows Server 2008的PowerShell版本于2009年10月发布,可供32位和64位平台下载。

  • Windows 10提供了PowerShell的测试框架

  • 2016年8月18日,微软宣布他们开发了PowerShell开源和跨平台,支持Windows,macOS,CentOS和Ubuntu。源代码发布在GitHub上。转向开源创建了PowerShell的第二个版本,称为“PowerShell Core”,它运行在 .NET Core上。它与“Windows PowerShell”不同,后者在完整的 .NET Framework上运行。

  • 从版本5.1开始,PowerShell Core与Windows Server 2016 Nano Server捆绑在一起


简介

PowerShell是Microsoft的任务自动化和配置管理框架,由命令行shell和相关的脚本语言组成。最初只是一个Windows组件,称为Windows PowerShell,它于2016年8月18日通过PowerShell Core的推出而成为开源和跨平台。前者构建于 .NET Framework上,后者构建于 .NET Core上。

在PowerShell中,管理任务通常由cmdlet(发音为command-lets)执行,cmdlet是实现特定操作的专用 .NET 类。这些工作通过访问不同数据存储中的数据(如文件系统或注册表),这些数据存储通过提供程序提供给PowerShell 。第三方开发人员可以向PowerShell添加cmdlet和提供程序。自定义的脚本可以使用Cmdlet ,还可以打包成模块作为新的Cmdlet使用。

PowerShell提供对COM和WMI的完全访问,使管理员能够在本地和远程Windows系统以及WS-Management和CIM上执行管理任务,从而实现远程对Linux系统和网络设备的管理。PowerShell还提供了一个托管API,PowerShell运行时可以使用该API嵌入到其他应用程序中。然后,这些应用程序可以使用PowerShell功能来实现某些操作,包括通过图形界面公开的操作。Microsoft Exchange Server 2007 使用此功能将其管理功能公开为PowerShell指令和提供程序并实现作为PowerShell主机的图形管理工具,可通过调用必要的cmdlet来使用Exchange Sever 2007。其他Microsoft应用程序(包括Microsoft SQL Server 2008)也通过PowerShell cmdlet公开其管理界面。

PowerShell含有广泛的,基于控制台的自身帮助(类似于手册页在Unix外壳)通过键入Get-Help命令即可轻松获取使用方法。你可以通过Update-Help cmdlet 从Internet升级本地帮助内容,还能通过Get-Help <命令名> -online获取来自网络的帮助。


以上内容来自PowerShell - Wikipedia,背景和开发人员设想部分为笔者翻译(翻译如有问题欢迎指出),开发历程和简介由Google提供翻译服务,笔者进行了校对。


版本

了解更多请参考: PowerShell - Wikipedia

最初使用代号“Monad”,PowerShell于2003年9月首次在专业开发者大会上公开展示。所有主要版本仍然受支持,并且每个主要版本都具有与先前版本的向后兼容性。

  • PowerShell 1.0

    PowerShell 1.0于2006年11月发布,适用于Windows XP SP2,Windows Server 2003 SP1和Windows Vista。它还是Windows Server 2008的可选组件。

  • PowerShell 2.0

    PowerShell 2.0与Windows 7和Windows Server 2008 R2集成,适用于Windows XP Service Pack 3,Windows Server 2003 Service Pack 2和Windows Vista Service Pack 1.

    PowerShell v2除了包含240多个新cmdlet之外,还包括对脚本语言和托管API的更改。

  • PowerShell 3.0

    PowerShell 3.0与Windows 8和Windows Server 2012集成在一起。Microsoft还为Windows 7 Service Pack 1,Windows Server 2008 Service Pack 1和Windows Server 2008 R2 Service Pack 1 提供了PowerShell 3.0 。

    PowerShell 3.0是更大的软件包Windows Management Framework 3.0(WMF3)的一部分,它还包含支持远程处理的WinRM服务。Windows Management Framework 3.0的早期社区技术预览2(CTP 2)版本于2011年12月2日发布。 Windows Management Framework 3.0于2012年12月发布,并默认包含在Windows 8和Windows Server 2012中。

  • PowerShell 4.0

    PowerShell 4.0与Windows 8.1和Windows Server 2012 R2集成在一起。Microsoft还为Windows 7 SP1,Windows Server 2008 R2 SP1和Windows Server 2012提供了PowerShell 4.0。

  • PowerShell 5.0

    包含PowerShell 5.0的Windows Management Framework(WMF)5.0 RTM于2016年2月24日在发布严重错误的初始版本后重新发布到Web。主要功能包括OneGet PowerShell cmdlet,支持Chocolatey基于存储库的包管理,并将对交换机管理的支持扩展到第2层网络交换机。

  • PowerShell 5.1

    它与2016年8月2日的Windows 10 周年更新以及Windows Server 2016一起发布。PackageManagement现在支持代理,PSReadLine现在支持ViMode,并添加了两个新的cmdlet:Get-TimeZone和Set-TimeZone。LocalAccounts模块允许添加/删除本地用户帐户。 PowerShell 5.1的预览版已于2016年7月16日针对Windows 7,Windows Server 2008,Windows Server 2008 R2,Windows Server 2012和Windows Server 2012 R2 发布,并于2017年1月19日发布正式版。

    PowerShell 5.1是第一个有两个版本的PowerShell,包括“桌面”和“核心”版本。“桌面”版本是在完整的 .NET Framework堆栈上运行的传统Windows PowerShell的延续。“Core”版本在 .NET Core上运行,并与Windows Server 2016 Nano Server捆绑在一起。为了减少占用空间,后者缺少一些功能,例如用于管理剪贴板的cmdlet或将计算机加入域,WMI版本1 cmdlet,事件日志cmdlet和配置文件。这是专为Windows制作的PowerShell的最终版本。

  • PowerShell 6.0

    PowerShell Core 6.0于2016年8月18日首次发布,当时微软公布了PowerShell Core并决定使该产品跨平台,独立于Windows,而且是免费和开源的。

    它于2018年1月10日实现了Windows,macOS和Linux的普遍可用性。它有自己的支持生命周期,并遵循Windows 10引入的Microsoft生命周期策略:仅支持最新版本的PowerShell Core。微软希望每六个月为PowerShell Core 6.0发布一个次要版本。

    此版本PowerShell中最重要的变化是扩展到其他平台。对于Windows管理员,此版本的PowerShell没有任何主要的新功能。在2018年1月11日的社区访谈中,PowerShell团队被要求列出将从Windows PowerShell 5.1迁移到PowerShell Core 6.0的Windows IT专业人员可能发生的十大最令人兴奋的事情。作为回应,微软的Angel Calvo只能说出两个:跨平台和开源(这两个就足够了)。

  • PowerShell 7.0

    PowerShell 7.0 GA 正式发布了。 除了常见的新 cmdlet/API 和错误修复之外,PowerShell 7.0 还引入了许多新功能,主要包括:

    • 使用 ForEach-Object -Parallel 进行管道并行化
    • 新的运算符
    • 三元运算符: a ? b : c
    • Pipeline 主运算符:||&&
    • 空分配和合并运算符 :????=
    • 简化的动态错误视图和 Get-Error cmdlet,可更轻松地调查错误
    • 兼容性层,使用户能够在隐式 Windows PowerShell 会话中导入模块
    • 自动化新版本通知
    • 直接从 PowerShell 7 调用以调用 DSC 资源的能力(实验性)
    • 从 PowerShell Core 6.x 到 7.0 的转变也标志着从 .NET Core 2.x 到 3.1 的转变。.NET Core 3.1 带来了许多 .NET Framework API(特别是在 Windows 上),从而使与现有 Windows PowerShell 模块的向后兼容性大大提高。这包括 Windows 上需要 GUI 功能的许多模块,例如 Out-GridViewShow-Command,以及 Windows 附带的许多角色管理模块。更多信息可查看 PowerShell 7.0 的模块兼容性表。

    官方表示,PowerShell 7 标志着与 Windows PowerShell 的向后兼容性最大化的旅程已完成,“PowerShell 7 及其以后的版本将是真正的 PowerShell ”。

目前Windows 10 上自带的版本是5.1

[^1]:一种可以采用各种语言以及固定格式等实现、并能与其他 ActiveX 控件(可以理解为一种互联网插件)交互的脚本

评论