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]脚本引擎,可以使用兼容的VBscript
和JScript
来编写,调用其他应用程序的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-GridView
和Show-Command
,以及 Windows 附带的许多角色管理模块。更多信息可查看 PowerShell 7.0 的模块兼容性表。
官方表示,PowerShell 7 标志着与 Windows PowerShell 的向后兼容性最大化的旅程已完成,“PowerShell 7 及其以后的版本将是真正的 PowerShell ”。
- 使用
目前Windows 10 上自带的版本是5.1
[^1]:一种可以采用各种语言以及固定格式等实现、并能与其他 ActiveX 控件(可以理解为一种互联网插件)交互的脚本