PowerShell 概述

虽然用了几年PowerShell,但是却没用系统的了解过它的发展由来,最近看了维基百科PowerShell - Wikipedia(百度百科感觉写的有点乱),打算汉化下(其实大多是谷歌翻译(✿◡‿◡),有能力还是看原文,感觉单词也不是太难),毕竟是翻译就分类转贴吧,自勉.

欢饮关注我的公众号

欢饮关注我的公众号

-------------------------------------------------------------------------------------------------------------

PowerShell

PowerShell是一个来自微软的任务自动化和配置管理框架,由一个命令行shell和相关的脚本语言组成。 最初只是一个Windows组件,称为Windows PowerShell. 2016年8月18日推出PowerShell Core(What's New in PowerShell Core 6.0 )后其开始开源和跨平台. 前者(PowerShell)是建立在.NET Framework上的,而后者(PowerShell Core)是在.NET Core上建立的。

在PowerShell中,管理任务通常由cmdlets(发音为command-lets)执行,这些cmdlets其实就是实现特定操作的专用.NET类.   通过访问不同数据存储中的数据(如文件系统file system或注册表registry),使得PowerShell能够借由数据提供商(providers)来完成这些工作. 第三方开发人员可以开发自己的cmdlets并将其添加到PowerShell中. 多个cmdlets可一起合并到脚本中工作.

PowerShell提供了可以完全访问COMWMI的权限,使得管理员能够在本地和远程Windows系统以及WS-Management 和 CIM上执行管理任务,从而实现对远程Linux系统和网络设备的管理。PowerShell还提供了一个托管API,PowerShell运行时可以将其用于其他应用程序中。然后,这些应用程序可以使用PowerShell功能来实现某些操作,包括在图形界面展现出来的部分。此功能已在Microsoft Exchange Server 2007中使用, 其已将管理功能公开为PowerShell cmdlets和供应商,并且可加载图形化管理工具作为PowerShell托管,从而调用必要的cmdlets. 其他Microsoft应用程序(包括Microsoft SQL Server 2008)也通过PowerShell cmdlets实现了其在管理界面能够实现的操作。

PowerShell含有基于自身控制台的大量帮助(类似于Unix shell中的手册页),可以通过Get-Help cmdlet访问。 本地帮助内容可以通过执行Update-Help cmdlet从Internet上获取到本地从而离线使用。 此外也可以可以通过 -online参数直接从网上获取最新帮助信息.

1. 背景(Background)

用于个人计算机的每个Microsoft Windows版本都包含用于管理操作系统的命令行解释程序(command line interpreter(CLI))。它的前身MS-DOS完全依赖CLI。具体为MS-DOSWindows 9x中的COMMAND.COM,以及Windows NT系列操作系统中的cmd.exe(这个应该是大家最熟悉的黑色窗口,哈哈)。两者都支持一些基本的内部命令,只是出于别的一些目的,才设计成了单独的控制台应用程序。他们还包括一个基本的脚本语言(批处理文件batch files),用来自动执行各种任务。然而它们并不能自动化处理图形用户界面(Graphical user interface-GUI)功能的所有方面,部分原因是命令行的操作等同于有限的操作,并且脚本语言只是基本的。 虽然在Windows Server 2003中,情况有所改善,但脚本支持仍然不尽人意。

Microsoft试图在1998年的Windows 98操作系统中引入Windows Script Host以及基于命令行的宿主:cscript.exe来解决其中的一些缺点。它集成了Active Script引擎,并允许兼容的语言(如JScriptVBScript)编写脚本,通过利用COM应用程序提供公开的API。然而,它仍有其自身的不足之处:其文档不易获取,并且在几个高调的计算机病毒利用其安全规定中的弱点之后,它迅速成为了系统漏洞载体的代名词。不同版本的Windows提供了各种专用的命令行解释器(如netshWMIC)以及它们自己的命令集,但它们不能互操作彼此。

在2017年9月13日发表的一篇采访中,Jeffrey Snover(powershell项目创始人)解释了这个项目的动机:

我一直在推动一系列的管理变更,最初我尝试直接把UNIX工具放在Windows上,然而它们就是不能工作。对嘛!因为Windows和Linux之间存在核心体系架构差异。在Linux上,一切都是ASCII文本文件,所以任何可以操纵的东西都是一个管理工具。 AWK,grep,sed? 真是快乐的时光啊!

我将这些工具带到Windows上却未能帮助管理Windows,因为在Windows中,所有东西都是API,它们返回的是结构化数据。 所以,这没有帮助。 于是我就想到了PowerShell的这个点子,我说:“嘿,我们可以做得更好。”

微软在2002年就已经着手开发一种新的命令行管理方法,其中就包括称为Monad(也被称为Microsoft Shell或MSH)的CLI。其中的思想是在2002年8月发表的一篇名为“Monad Manifesto”的白皮书中发表的.其背后的思想是在2002年8月发表的一篇名为“Monad Manifesto”的白皮书中发表的。 Monad旨在成为全新的可扩展CLI,其全新的设计将能够自动执行全面的核心管理任务。 在2003年10月洛杉矶举办的专业发展会议上,微软首次展示了Monad。几个月后,一个内部测试版程序已具雏形,并最终演变为了一个公开的测试版程序。

微软于

2005年6月17日发布了第一个Monad公开测试版

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

2006年1月10日发布了Beta 3版

不久之后,2006年4月25日,微软正式宣布Monad已被重命名为Windows PowerShell,将其定位为其管理技术产品的重要组成部分。并同时发布了PowerShell的候选版本1。

PowerShell版本1的候选版本2于2006年9月26日发布,最终于2006年11月14日发布到网络(RTW),并在TechEd Barcelona上宣布。 早期版本的Windows的PowerShell于2007年1月30日发布.

早在PowerShell v1.0发布之前就,PowerShell v2.0的开发就已经开始了。在开发过程中,微软发布了三个社区技术预览(CTP)并供公开获取。 Windows PowerShell v2.0的最后一个CTP版本已于2008年12月发布。

作为Windows 7和Windows Server 2008 R2的集成部分,PowerShell v2.0于2009年8月完全完成并发布到生产工作环境中。适用于Windows XP,Windows Server 2003,Windows Vista和Windows Server 2008的PowerShell版本已于2009年10月发布,同时提供32位和64位平台下载。

Windows 10提供了PowerShell的测试框架(What is Pester and Why Should I Care?)

2016年8月18日,微软宣布他们已将PowerShell开源并且跨平台,支持Windows,OS X,CentOS和Ubuntu。源代码业已发布到GitHub上. 开源此举创建了一个名为“PowerShell Core”的PowerShell的第二化身,它运行在.NET Core。其与在完整.NET Framework上运行的“Windows PowerShell”是完全不同的。

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

2. 设计(Design)

PowerShell的开发人员基于POSIX 1003.2(POSIX  可移植操作系统接口)的工具核心语法.

Windows PowerShell可以执行四种命名命令:

  • cmdlets(用于与PowerShell交互的.NET Framework程序)
  • PowerShell脚本(以.ps1为后缀的文件)
  • PowerShell功能函数
  • 独立的可执行程序

如果一个命令是一个独立的可执行程序,PowerShell将在一个单独的进程中启动它; 如果它是一个cmdlet,它将在当前PowerShell进程中执行。PowerShell提供了一个交互式命令行界面,用于输入命令并输出执行结果。基于Win32控制台的用户界面提供可自定义tab 补全(tab completion)。PowerShell可以为cmdlet创建别名,在运行时PowerShell会将别名转换为原始命令执行。PowerShell既可通过参数名称又可通过参数位置来获取其传入的参数值。在执行cmdlet时,参数值绑定到参数的工作是由PowerShell本身完成的,但是对于外部可执行文件,参数由外部可执行文件解析,而与PowerShell解释无关。

PowerShell扩展类型系统(ETS)虽然基于.NET类型系统,但却 具有扩展的语义(例如propertySets和第三方扩展性)。例如,它通过仅暴露数据字段,属性和方法的子集以及指定自定义格式和排序行为来启用对象的不同视图的创建。 这些视图使用基于XML的配置文件映射到原始对象。

(我理解如下所示,查看notepad++,选择不同属性,视图也不一样,前者默认, 后者自定义)

PS C:\Users\ChaoYue> ps notepad++

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    416      42    21636      41208       2.98  15244   2 notepad++



PS C:\Users\ChaoYue> ps notepad++|select StartTime,MainWindowTitle

StartTime          MainWindowTitle
---------          ---------------
2018/1/31 21:56:40 *new 1 - Notepad++

2.1 Cmdlets

Cmdlets是PowerShell环境中实现特定功能的专用命令,是PowerShell堆栈中的本地命令。Cmdlets遵循动词-名词(Verb-Noun)命名模式,如Get-ChildItem,有助于使其具有自描述性(就是看到它,就知道它大概是要干啥的,如Get-Date 就是获取日期的)。Cmdlets将其结果作为对象输出,还可以接收对象作为输入,使其无论在管道(|)左边还是右边都能正常工作。如果一个cmdlet输出多个对象,那么在处理下一个对象之前,集合中的每个对象都会在整个管道中依次向下传递。

Cmdlets是专门的.NET类,在运行时PowerShell将其实例化调用。Cmdlets派生自Cmdlet 或 PSCmdlet,后者在cmdlet需要与PowerShell交互运行时使用。这些基类指定了某些方法 -  BeginProcessing()ProcessRecord() 和 EndProcessing() - cmdlet会将其重写并提供相同功能。无论何时运行cmdlet,PowerShell都会依次调用这些方法,如果接收到管道输入,则会调用 ProcessRecord()。如果一个对象的集合被传入管道,那么针对该集合中的每个对象都会调用该方法。实现Cmdlet的类必须具有一个.NET属性 -  CmdletAttribute - 它指定构成该cmdlet名称的动词和名词。 常见的动词是作为枚举提供的.

如果cmdlet接收任一管道输入或命令行参数输入,则必须在类中具有相应的属性,并使用mutator实现.PowerShell使用参数值或管道输入来调用mutator,mutator实现保存在类变量中。这些值然后由实现该功能的方法引用。映射到命令行参数的属性由 ParameterAttribute标记,并在调用 BeginProcessing()之前设置。 那些映射到管道的输入的也会被 ParameterAttribute触及,但是 ValueFromPipeline属性参数集。

这些cmdlet类的实现可以引用任何.NET API,并且可以使用任何.NET语言。另外,PowerShell还提供了一些可用的API,比如 WriteObject(),其用于访问PowerShell特有的功能,比如将结果对象写入管道。Cmdlets可以直接使用.NET数据访问API,也可以使用PowerShell提供商的PowerShell基础结构,这使得数据存储可以使用唯一路径进行寻址(ls HKCU:\ 查看注册表)。数据存储使用驱动器号和其中的层次结构进行访问,并作为目录进行寻址。 Windows PowerShell附带提供了文件系统,注册表,证书存储以及命令别名,变量和函数的命名空间。Windows PowerShell还包括各种用于管理各种Windows系统(包括文件系统)的cmdlet,或者使用Windows Management Instrumentation来控制Windows组件。 其他应用程序可以使用PowerShell注册cmdlet,从而允许它管理它们,如果它们包含任何数据存储(如数据库),则可以添加特定的提供程序。

PowerShell V2添加了一个更便携的Cmdlet版本,称为模块(Modules)。 PowerShell V2发行说明指出:

模块允许脚本开发人员和管理员以自包含的,可重用的单元对Windows PowerShell代码进行分区和组织,模块中的代码在自己独立的上下文中执行,不会影响模块之外的状态。 它也可以让你通过使用脚本来定义受限制的运行空间环境.

2.2 管道(Pipeline)

PowerShell实现了管道的概念,该管道可以将一个cmdlet的输出作为输入传输到另一个cmdlet。 例如,Get-Process cmdlet的输出可以通过管道传递到Where-Object,以过滤任何少于1 MB分页内存的进程,然后过滤到Sort-Object cmdlet(例如,通过句柄 计数),然后最后到Select-Object cmdlet,只选择前10个(即基于句柄计数的10个进程)。

(我的少于1 MB分页内存的进程只有5个,所以只选取前三个,作为演示)

PS C:\Users\ChaoYue> Get-Process|?{$_.PM -lt 1MB}|Sort-Object Handles|select -First 3

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
      0       0       52          8                 0   0 Idle
      0       0       32          4              2920   0 Memory Compression
     39       4      584       2660              7088   0 Locator

与Unix管道一样,PowerShell管道可以使用 |构造复杂的命令连接命令的不同阶段。 但是,PowerShell管道与Unix管道的不同之处在于,在PowerShell运行时间内执行的阶段不是由操作系统协调的一组进程执行,而是将结构化的.NET对象(而不是字节流)从一个阶段传递到下一个阶段。 在PowerShell运行环境中使用对象并执行阶段消除了序列化数据结构的需要,或者通过显式解析文本来输出提取它们。 对象自身也可以封装某些在包含的数据上工作的函数,这些函数反过来可以再被命令使用。对于管道中的最后一个cmdlet,PowerShell会自动将其输出对象传递给 Out-Defaultcmdlet,该cmdlet将对象转换为格式对象流,然后将其输出到屏幕。

因为所有PowerShell对象都是.NET对象,所以它们共享一个 .ToString()方法,但调用该方法时,其将检索对象中数据的文本表示并输出给下一个命令。 另外,PowerShell允许自定义格式化输出,因此可以通过选择显示哪些数据元素以及以何种方式来定制对象的文本表示。 但是,为了保持向后兼容性,如果在管道中使用外部可执行文件,它将接收代表对象的文本流,而不是直接与PowerShell类型系统集成

PS C:\Users\ChaoYue> Get-Date # 原始输出
(Get-Date).ToString() # 字符串输出
ps powershell_ise|ft # 表格输出
ps powershell_ise|fl # 目录输出

2018年2月1日 23:00:10
2018/2/1 23:00:10



Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    895      76   149856     171776       9.19   9448   1 powershell_ise




Id      : 9448
Handles : 886
CPU     : 9.1875
SI      : 1
Name    : powershell_ise

2.3 脚本(Scripting)

Windows PowerShell包含一个动态类型的脚本语言,可以使用命令执行复杂的操作。脚本语言支持变量,函数,分支(if-then-else),循环(while,do,for和foreach),结构化错误/异常处理和闭包/ lambda表达式,并且也集成了.NET。PowerShell脚本中的变量前缀为$。可以分配任何值,包括cmdlet的输出到变量中。 字符串可以用单引号或双引号引起来:使用双引号时,即使引号位于引号内,变量也会被展开。 用美元符号(如$ {C:\ foo.txt})括起来的大括号中的文件路径将创建一个对文件内容的引用。 如果将它用作L值(=号左边),则分配给它的任何内容都将写入该文件。 当用作R值时(=号右边),文件的内容将被读取。 如果是分配一个对象到变量中,这一对象会先被序列化然后再被存储到变量中。

PS C:\Users\ChaoYue> $n=1
write-host "--I'm $n--, this won't print `$n in this line"
$ps=Get-Process powershell_ise
Write-Host "--Out put variable from cmdlet--"
$ps
write-host "----------------------R-Value-------------------------"
write-host ${D:\temp\new.txt} # 等价于 cat D:\temp\new.txt
${D:\temp\new.txt}="powershell left value"
write-host "----------------------L-Value-------------------------"
write-host ${D:\temp\new.txt} # 等价于 cat D:\temp\new.txt

--I'm 1--, this won't print $n in this line
--Out put variable from cmdlet--

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    968      83   151172     176624      14.34   9448   1 powershell_ise
----------------------R-Value-------------------------
powershell learning
----------------------L-Value-------------------------
powershell left value

就像在C#语法中一样, 对象成员的值可以使用 .符号来访问。PowerShell提供了特殊的变量,比如 $args,它是从命令行传递给函数的所有命令行参数的集合数组,以及 $_,它指代管道中的当前对象。 

PS C:\Users\ChaoYue> $ps=Get-Process powershell_ise
$ps.MainWindowTitle
function test($first, $second){
    write-host "$first is the first paramter"
    write-host "$second is the second paramter"
    $cnt=1
    $args|%{
        write-host "I'm the $cnt parameter: $_ that provided to 'test' function"
        $cnt++
    }
}
write-host "----------test function with position paramters----------"
test a b c d e
write-host "----------test function with named paramters----------"
test -second b -first a c d e
Windows PowerShell ISE
----------test function with position paramters----------
a is the first paramter
b is the second paramter
I'm the 1 parameter: c that provided to 'test' function
I'm the 2 parameter: d that provided to 'test' function
I'm the 3 parameter: e that provided to 'test' function
----------test function with named paramters----------
a is the first paramter
b is the second paramter
I'm the 1 parameter: c that provided to 'test' function
I'm the 2 parameter: d that provided to 'test' function
I'm the 3 parameter: e that provided to 'test' function

PowerShell还提供了数组和关联数组。 PowerShell脚本语言还可以立即评估在命令行中输入的算术表达式,并解析常用缩写,如GB,MB和KB。

PS C:\Users\ChaoYue> 1..5|%{
    write-host "I'am $_ in this array"
}
1024 / 1KB
1048576 / 1MB
1073741824 / 1GB
I'am 1 in this array
I'am 2 in this array
I'am 3 in this array
I'am 4 in this array
I'am 5 in this array
1
1
1

PowerShell使用 function关键字来创建函数(如上文中的test函数所示),可以通过位置或者制定名称来获取传入参数对应的值,同时PowerShell还支持开关参数和动态参数.

PS C:\Users\ChaoYue> function test([switch]$on){
    if($on){
        Write-Host "switch on"
    }else{
        Write-Host "switch off"
    }
}
test ; test -on
switch off
switch on

PowerShell允许通过提供括号([])中的名称空间来调用任何.NET方法,然后使用一对冒号(::)来指示静态方法。 例如, [System.Console]::WriteLine("PowerShell")。 对象是使用 New-Object cmdlet创建的。 调用.NET对象的方法是通过使用 . 来实现的,和C#语法一样.

PS C:\Users\ChaoYue> New-Object System.DateTime

0001年1月1日 0:00:00



PS C:\Users\ChaoYue> (New-Object System.DateTime).AddDays(1)

0001年1月2日 0:00:00

PowerShell接受字符串,包括原始和转义的。 包含在单引号之间的字符串是原始字符串,而用双引号括起来的字符串是转义字符串。 PowerShell将直线和曲线引号视为等同(个人理解 是中英文的双引号都认同为英文状态下的双引号"" “”)。

PS C:\Users\ChaoYue> $str='powershell'
'this is $str'
"this is $str"
this is $str
this is powershell

对于错误处理,PowerShell提供了一个基于.NET的异常处理机制。 如果发生错误,则抛出带有错误信息的异常,这些对象将使用 try ... catch构造捕获(尽管也支持trap 构造捕获)。 PowerShell可以配置为静默恢复执行,而不会抛出异常; 这可以通过单个命令,单个会话或者永久的完成。(就是忽略错误异常一直执行下去,并且这些发生的错误不会被捕获也不会记录在系统变量$error里面的).

使用PowerShell编写的脚本可以保存在.ps1文件或.psm1文件(后者用于实现模块)中的会话之间。之后,可以使用整个脚本或保存在其中的单个函数。 脚本和函数类似于cmdlet操作,因为它们可以用作管道中的命令,也可以给其绑定参数。管道对象可以在函数,脚本和cmdlet之间无缝传递。 为了防止意外运行脚本,默认情况下禁用PowerShell执行脚本,并且必须显式启用脚本执行。 脚本的启用可以在系统,用户或会话级别执行(Get-ExecutionPolicy & Set-ExecutionPolicy)。 可以对PowerShell脚本进行签名以验证其完整性,并受到代码访问安全性的约束。

PowerShell脚本语言支持与C系列中许多编程语言所支持的科学记法类似的二进制前缀记法.(暂时不懂这个)

2.4 托管(Hosting)

还可以将PowerShell嵌入到其他管理应用程序中,该应用程序使用PowerShell运行时来实现管理功能。为此,PowerShell提供了托管宿主API。 通过这些API,应用程序可以在自己的进程中实例化运行空间(PowerShell运行时的一个实例),并作为Runspace对象公开。运行空间的状态被封装在一个SessionState对象中。 在创建运行空间时,Windows PowerShell运行时将初始化实例,包括:初始化供应商;枚举cmdlet,并相应地更新SessionState对象。开启的运行空间要么进行同步处理要么异步处理。之后,它才可以用来执行命令。

为了执行一个命令,必须创建一个管道(由一个管道对象 Pipeline表示)并且与这个管理空间相关联。然后使用组成管道的cmdlet填充管道对象。对于顺序操作(如在PowerShell脚本中),将为每个语句创建一个管道对象,并嵌套在另一个管道对象内。在创建管道时,Windows PowerShell将调用管道处理器,该处理器将cmdlet解析为各自的程序集(命令处理器),并将其引用添加到管道,并将它们与InputPipeOutputpipe 和 ErrorOutputPipe对象相关联,以表示 与管道连接。类型和参数使用反射来验证。 一旦建立了管道,托管调用 Invoke()方法来运行这些命令,或者它的异步等价的 InvokeAsync()。 如果管道在管道末端具有 Write-Host cmdlet,则会将结果写入控制台屏幕。 如果没有,结果将交给托管,这可能要么进一步处理或显示输出本身。

Microsoft Exchange Server 2007使用托管API来提供其管理GUI。 GUI中公开的每个操作都映射到一系列PowerShell命令(或管道)。 宿主创建管道并执行它们。 事实上,交互式PowerShell控制台本身就是一个PowerShell宿主,它可以解释在命令行输入的脚本,并创建必要的管道对象并调用它们。

3. 预期状态配置(Desired State Configuration )

DSC允许声明性地指定如何配置软件环境。 在运行配置时,DSC(和配置调用的资源)将“使其如此”,确保系统处于配置所布局的状态。 DSC 配置也是幂等的:无论配置声明什么状态,本地配置管理器 (LCM) 都将继续确保计算机已配置为该状态。

4. 版本(Versions)

最初使用代码名称“Monad”,PowerShell首次在2003年9月的专业开发人员大会上公开发布。所有主要版本仍然受支持,每个主要版本都具有与之前版本的向后兼容性。

4.1 PowerShell 1.0

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

4.2 PowerShell 2.0

PowerShell 2.0集成在了Windows 7(2009年发布)和Windows Server 2008 R2中,并针对带有Service Pack 3的Windows XP,带有Service Pack 2的Windows Server 2003和带有Service Pack 1的Windows Vista进行了发布。

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

以下为PowerShell 2.0的新特性:

  • PowerShell远程处理:使用WS-Management,PowerShell 2.0允许在远程机器或大量远程机器上调用脚本和cmdlet。
  • 后台作业:也称为PSJob,它允许一个命令序列(脚本)或管道异步调用。 作业可以在本地机器或多个远程机器上运行。 PSJob中的交互式cmdlet会阻止作业的执行,直到读取用户输入为止。
  • 事件:使得cmdlet和开发人员可以执行事件操作。 PowerShell 2.0包括用于启动,提交和回滚PSTransaction的事件cmdlet,以及用于管理和指导事件到参与的cmdlet和提供商操作的功能。 PowerShell Registry提供商支持事件。
  • 高级函数:这些是使用PowerShell脚本语言编写的cmdlet。 最初被称为“脚本cmdlet”,这个功能后来改名为“高级函数”。[60]
  • 步级管道(这是我根据英文SteppablePipelines自创的,百度查了下好像没这个词): 这允许用户在管道流中运行cmdlet时,可以控制何时其 BeginProcessing()ProcessRecord() 和EndProcessing()函数。
  • 模块:它允许脚本开发人员和管理员在自包含的可重用单元中组织和分割PowerShell脚本。 来自模块的代码在自己独立的上下文中执行,不会影响模块外部的状态。 模块可以使用脚本定义受限制的运行空间环境。 他们持久化运行,包含公有和私有成员变量。
  • 数据语言:PowerShell脚本语言的特定于域的子集,允许将数据定义与脚本分离,并允许在运行时(脚本国际化)将本地化的字符串资源导入到脚本中。
  • 脚本调试:它允许在PowerShell脚本或函数中设置断点。 可以在行,行列,命令以及变量的读取或写入访问权限上设置断点。 它含有一系列通过脚本控制断点的cmdlet。
  • 事件:此功能允许监听,转发和处理管理和系统事件。 当其管理实体的状态更改时,事件会将这一变动通知给PowerShell宿主。 它还使PowerShell脚本可以订阅ObjectEventsPSEvents, 和WmiEvents,并以异步方式同步处理它们。
  • Windows PowerShell集成脚本环境(ISE):PowerShell 2.0包括一个基于GUI的PowerShell主机,它提供集成的调试器,语法高亮显示,制表符完成功能以及在标签式UI中最多支持8个PowerShell启用Unicode的控制台(运行空间),以及只运行脚本中选定的部分。
  • 网络文件传输:本地支持使用后台智能传输服务(BITS)在计算机之间进行 优先/节制/异步 文件传输。
  • 新的cmdlet:包括 Out-GridView,它在WPF GridView对象中, 允许的系统上,以及启用这一功能的ISE上显示表格数据。
  • 新的操作符:  -Split-Join, and 包装 (这个splatting不是太好翻译,暂译'包装'吧,详见about_Splatting,相信看完自然就了解了) (@)操作符
  • 带有Try-Catch-Finally的异常处理:与其他.NET语言不同,现在一个catch块即可捕获多个异常类型。
  • 嵌套字符串: PowerShell Here-Strings已经改进,现在可以嵌套。
    PS C:\Users\ChaoYue> $str=@"
    this is a 
    Nestable Here-Strings
    that will show in multi-lines
    "@
    write-host $str
    this is a 
    Nestable Here-Strings
    that will show in multi-lines
  • 块注释:PowerShell 2.0支持使用<#和#>作为分隔符的块注释。
  • 新的API:新的API包括将更多的PowerShell解析器和运行时控制权交给宿主,创建和管理Runspaces(RunspacePools)集合以及创建有限的运行空间,使得只能运行配置好的PowerShell子集。 新的API还支持参与Windows PowerShell管理事件。

4.3 PowerShell 3.0

PowerShell 3.0集成在了 Windows 8 (2012年发布)和Windows Server 2012中. 同时Microsoft还使PowerShell 3.0可用于Windows 7 Service Pack 1,Windows Server 2008 Service Pack 1和Windows Server 2008 R2 Service Pack 1.

PowerShell 3.0是一个更大的软件包Windows Management Framework 3.0(WMF3)的一部分,它还包含支持远程处理的WinRM服务。微软制作了几个WMF3社区技术预览版。 Windows Management Framework 3.0的早期社区技术预览2(CTP 2)版本于2011年12月2日发布。Windows Management Framework 3.0已于2012年12月发布,可供常规使用,默认情况下包含在Windows 8和Windows Server 2012中。

以下为PowerShell 3.0的新特性:

  • 计划作业:可以安排作业在预设的时间和日期上运行(类似于Windows上的计划任务)。
  • 会话连接:会话可以断开连接并重新连接。 远程会话已经变得更容忍临时网络故障。
  • 改进的代码编写:添加代码完成(智能感知)和片段。 PowerShell ISE允许用户使用对话框填写PowerShell cmdlet的参数。
  • 委派支持:可以将管理任务委派给没有该类型任务权限的用户,而不授予他们永久的额外权限。
  • 帮助更新:可以通过更新帮助命令(Update-Help)更新帮助文档。
  • 自动模块检测:无论何时调用来自该模块的命令,都会隐式加载模块。 代码完成也适用于卸载的模块。
  • 新命令:增加了数十个新模块,包括管理先前通过WMI执行的磁盘,卷,防火墙,网络连接和打印机管理的功能(现在用CimInstance来操作).

4.4 PowerShell 4.0

PowerShell 4.0集成在Windows 8.1(2013年发布)和Windows Server 2012 R2中。 同时微软还为Windows 7 SP1,Windows Server 2008 R2 SP1和Windows Server 2012提供了PowerShell 4.0。

以下为PowerShell 4.0的新特性:

  • 预期状态配置:声明性语言扩展和工具,可以为使用DMTF管理标准和WS-Management协议的系统配置和管理配置数据
  • 新的默认执行策略:在Windows服务器上,默认执行策略现在是RemoteSigned。
  • 保存帮助:现在可以为安装在远程计算机上的模块保存帮助。
  • 增强的调试功能:调试器现在支持调试工作流程,远程脚本执行以及跨PowerShell会话重新连接时仍保留调试会话。
  • -PipelineVariable开关:一个新的无处不在的参数,将当前的管道对象作为变量进行编程
  • 网络诊断: 管理物理和Hyper-V的虚拟化网络交换机
  • Where和ForEach 方法语法提供了对对象进行过滤和迭代的替代方法。

4.5 PowerShell 5.0

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

以下为PowerShell 5.0的新特性:

  • PowerShell类的定义(属性,方法)
  • PowerShell .NET枚举
  • 调试远程进程中的PowerShell运行空间
  • 调试PowerShell后台作业
  • 所需的状态配置(DSC)本地配置管理器(LCM)版本2.0
  • DSC部分配置
  • DSC本地配置管理器元配置
  • 使用PowerShell类创作DSC资源

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

从PowerShell 5.1版本开始,其迎来更加细化的“桌面”和“核心”两个版本。“桌面”版本是在完整的.NET Framework堆栈上运行的传统Windows PowerShell的延续。 “核心”版本运行在.NET Core上,与Windows Server 2016 Nano Server捆绑在一起。 为了减少占用空间,后者缺少一些功能,例如管理剪贴板的cmdlet或将计算机加入域,WMI版本1中的 cmdlets,事件日志cmdlets和配置文件。

4.6 PowerShell Core 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只能命名为两个:跨平台和开放源代码。

5. 命令类似的cmdlets比较(Comparison of cmdlets with similar commands)

下表包含了PowerShell附带的cmdlet的集合,在其他众所周知的命令行解释器中记录了类似的命令。 这些类似的许多命令都是在PowerShell中定义为别名的,这使熟悉其他常见shell的人们可以很容易地开始工作。

PowerShell cmdlet与其他命令行解释器的内部和外部命令的比较

PowerShell (Cmdlet)PowerShell (Alias)Windows Command PromptUnix shellDescription
Get-ChildItemgci, dir, lsdirlsLists all files and folders in the current or given folder
Test-Connection[a]N/ApingpingSends ICMP echo requests to the specified machine from the current machine, or instructs another machine to do so
Get-Contentgc, type, cattypecatGets the content of a file
Get-CommandgcmhelptypewhichcompgenLists available commands
Get-Helphelp, manhelpaproposmanPrints a command's documentation on the console
Clear-Hostcls, clearclsclearClears the screen[b]
Copy-Itemcpi, copy, cpcopyxcopyrobocopycpCopies files and folders to another location
Move-Itemmi, move, mvmovemvMoves files and folders to a new location
Remove-Itemri, del, erase, rmdir, rd, rmdelerasermdirrdrm, rmdirDeletes files or folders
Rename-Itemrni, ren, mvrenrenamemvRenames a single file, folder, hard link or symbolic link
Get-Locationgl, cd, pwdcdpwdDisplays the working path (current folder)
Pop-LocationpopdpopdpopdChanges the working path to the location most recently pushed onto the stack
Push-LocationpushdpushdpushdStores the working path onto the stack
Set-Locationsl, cd, chdircdchdircdChanges the working path
Tee-ObjectteeN/AteePipes input to a file or variable, passing the input along the pipeline
Write-Outputecho, writeechoechoPrints strings or other objects to the standard output
Get-Processgps, pstlist,[c] tasklist[d]psLists all running processes
Stop-Processspps, killkill,[c] taskkill[d]kill[e]Stops a running process
Select-StringslsfindstrfindgrepPrints lines matching a pattern
Set-Variablesv, setsetenv, export, set, setenvCreates or alters the contents of an environment variable
Invoke-WebRequestiwr, curl, wget[f]N/AwgetcurlGets contents from a web page on the Internet

注意:

  1. 虽然外部ping命令仍然可用于PowerShell,但Test-Connection的输出是一个结构化对象,可以通过程序检查

  2. Clear-Host被实现为预定义的PowerShell功能

  3. 1、2在Windows NT4,Windows 98资源工具包,Windows 2000支持工具中可用.

  4. 1、2在Windows XP专业版及更高版本中可用

  5. 还用于在UNIX中发送进程的任何信号,“终止”信号仅仅是默认的

  6. curl和wget不在PowerShell Core中,以免干扰调用非Windows操作系统的名称相似的组件。

6. 文件扩展名(File extensions)

  • PS1 - Windows PowerShell外壳脚本[85]
  • PSD1 - Windows PowerShell数据文件(用于版本2)
  • PSM1 - Windows PowerShell模块文件(用于版本2)
  • PS1XML - Windows PowerShell格式和类型定义
  • CLIXML - Windows PowerShell序列化数据
  • PSC1 - Windows PowerShell控制台文件
  • PSSC - Windows PowerShell会话配置文件

7. 应用支持(Application support)

Snap-ins and hosts

Snap-ins and hosts[edit]

ApplicationVersionCmdletsProviderManagement GUI
Exchange Server2007402YesYes
Windows Server2008YesYesNo
Microsoft SQL Server2008YesYesNo
Microsoft SharePoint2010YesYesNo
System Center Configuration Manager2012 R2400+YesNo
System Center Operations Manager200774YesNo
System Center Virtual Machine Manager2007YesYesYes
System Center Data Protection Manager2007YesNoNo
Windows Compute Cluster Server2007YesYesNo
Microsoft Transporter Suite for Lotus Domino[92]08.02.001247NoNo
Microsoft PowerTools for Open XML[93]1.033NoNo
IBM WebSphere MQ[94]6.0.2.244NoNo
Quest Management Shell for Active Directory[95]1.795NoNo
Special Operations Software Specops Command[96]1.0YesNoYes
VMware vSphere PowerCLI[97]6.5 R1500+YesYes
Internet Information Services[98]7.054YesNo
Windows 7 Troubleshooting Center[99]6.1YesNoYes
Microsoft Deployment Toolkit[100]2010YesYesYes
NetApp PowerShell Toolkit[101][102]4.22000+YesYes
JAMS Scheduler – Job Access & Management System[103]5.052YesYes
UIAutomation[104]0.8432NoNo
Dell Equallogic[105]3.555NoNo
LOGINventory[106]5.8YesYesYes
SePSX[107]0.4.139NoNo

8. 替代实现(Alternative implementation)

一个名为Pash的项目(这个名字是着名的“bash”Unix shell 上的一个双关语)是通过Mono框架开放源码和跨平台重新实现PowerShell的。 Pash由Igor Moochnick创建,用C#编写,并在GNU通用公共许可证下发布。 Pash开发在2008年停滞,但在2012年重新开始。

9. 扩展阅读(See also)

-------------------------------------------------------------------------------------------------------------

终于将PowerShell维基百科的英文搬运过来了(可以的话还是推荐看原文),虽然99%翻译都是靠谷歌,但是自己这么一遍下来,已经有了更加深入的了解,也认识到自己还有很多的不足,新的一年,加油吧.

                                                                                                                              2018/02/03 01:05:00

转载于:https://my.oschina.net/chaoyuew/blog/1616386

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值