PowerShell是一个跨平台(Windows、Linux和macOS)的自动化和配置工具/框架,它能与您现有的工具很好地配合,并针对处理结构化数据(如JSON、CSV、XML等)、RESTAPI和对象模型进行了优化,PowerShell包括一个命令行shell,一个相关的脚本语言和一个处理cmdlets的框架。
软件特色
您可轻易发现WindowsPowershell的功能。例如,若要查找用于查看和更改Windows服务的cmdlet列表,执行:开始->运行->cmd,在命令行下输入PowerShell进入windowsPowerShell,再输入如下命令:
get-command*-service
在发现可完成任务的cmdlet之后,可以使用Get-Helpcmdlet了解有关该cmdlet的详细信息。例如,若要显示有关Get-Servicecmdlet的帮助,请键入:
get-helpget-service
若要充分理解该cmdlet的输出,则可通过管道将其输出传递给Get-Membercmdlet。例如,以下命令将通过Get-Servicecmdlet显示有关该对象输出的成员的信息。
get-service|get-member
一致性
管理系统可能是一项复杂的任务,而具有统一接口的工具将有助于控制其固有的复杂性。然而,无论是命令行工具还是可编写脚本的COM对象,在一致性方面都乏善可陈。
WindowsPowerShell的一致性是其主要优点中的一项。例如,如果您学会了如何使用Sort-Objectcmdlet,则可利用这一知识对任何cmdlet的输出进行排序。而无需了解每个cmdlet的不同的排序例程。
此外,cmdlet开发人员也不必为其cmdlet设计排序功能。WindowsPowerShell为他们提供了框架,而该框架可提供基本的功能,并强制他们在接口的许多方面保持一致。该框架虽然消除了通常会留给开发人员的某些选项,但作为回报,开发强健、易于使用的cmdlet的工作将更加简单。
交互式脚本环境
WindowsPowerShell将交互式环境和脚本环境组合在一起,从而允许您访问命令行工具和COM对象,同时还可利用.netframework类库(FCL)的强大功能。
此环境对Windows命令提示符进行了改进,后者提供了带有多种命令行工具的交互式环境。此外,还对WindowsScriptHost(WSH)脚本进行了改进,后者允许您使用多种命令行工具和COM自动对象,但未提供交互式环境。
通过将对所有这些功能的访问组合在一起,WindowsPowerShell扩展了交互用户和脚本编写者的能力,从而更易于进行系统管理。
面向对象
尽管您可以通过以文本方式键入命令与WindowsPowerShell进行交互,但WindowsPowerShell是基于对象的,而不是基于文本的。命令的输出即为对象。可以将输出对象发送给另一条命令以作为其输入。因此,WindowsPowerShell为未曾使用过其他外壳程序的人员提供了熟悉的界面,同时引入了新的、功能强大的命令行范例。通过允许发送对象(而不是文本),它扩展了在命令之间发送数据的概念。
易于过渡到脚本
使用WindowsPowerShell,您可以很方便地从以交互方式键入命令过渡到创建和运行脚本。您可以在WindowsPowerShell命令提示符下键入命令以找到可执行任务的命令。随后,可将这些命令保存到脚本或历史记录中,然后将其复制到文件中以用作脚本。
识别你即将使用的Provider通过识别PowerShell里安装的Provider,你就可以了解默认安装下PowerShell提供了那些能力。Provider可以使用一种简单的访问方式,暴露位于不同储存位置的数据。就像是浏览不同磁盘上的目录结构一样简单。Provider把不同的信息存放位置,表示成“驱动器”-目录这种结构,这样很容易被用户所理解。就像我们要访问一个位于D盘的WIN32目录下的SETUP.exe文件,我们要通过浏览器,单击D盘的图标,然后选择WIN32目录并双击一样,如果我们要访问位于“注册表”的数据,那么我们也只需要简单地通过Set-Location命令,来到到“REGISTRY”这个“驱动器”,然后用GET-CHILDITEM命令获取其子数据就行了。
注:实际上,PowerShell访问磁盘驱动器,也是通过Provider的,切换驱动器其实和切换其他数据容器是一样地操作。例如:Set-Locationd:这是切换驱动器Set-LocationHKLM:这是切换到注册表的HKLM键另外,Get-PSprovider命令,可以查看当前已经安装的所有PROVIDER。任何熟悉.NET编程的人,都可以编写Provider。当新的provider被安装后,就叫做snap-in。snap-in其实是一个动态连接库dll文件,可以被安装到powershell中。然而,当一个snap-in安装后,却没有办法卸载。Get-PSProvider:NameCapabilitiesDrives----------------------AliasShouldProcess{Alias}EnvironmentShouldProcess{Env}FileSystemFilter,ShouldProcess{C,D,F,A...}FunctionShouldProcess{Function}RegistryShouldProcess{HKLM,HKCU}VariableShouldProcess{Variable}CertificateShouldProcess{cert}这些就是我机器上的默认安装后的provider。
使用Set-Location和Get-ChildItem浏览数据Set-Location用于改变当前目录,以及选择当前的provider,而Get-ChildItem用于获取当前目录或者指定目录下的子对象:例子:set-locationhkcu:softwareget-childitem例子2:GCI-pathHKLM:software
有两种连接WMI服务的方法:l使用Get-WmiObject可以很容易地连接到WMI服务,并且获取WMI对象。l使用一个COM对象,“WbemScripting.SWbemLocator”,可以连接WMI的服务。SWbemLocator对象只有一个方法,就是ConnectServer()。该方法接受5个参数:用户名,密码,语言代码,验证方法(Kerberos,NTLM等),标志(超时值)。
下例中,我们使用New-Object命令,创建了一个“WbemScripting.SWbemLocator”的实例。然后用这个实例的ConnectServer方法连接了到了一个WMI的名字空间(rootcimv2),ConnectServer方法返回了一个WMIService对象,接着又用这个对象的subClassesOf()方法,返回了一系列WMI的CLASS:$strComputer="."$wmiNS=" ootcimv2"$strUsr=""#Blankforcurrentsecurity.DomainUsername$strPWD=""#Blankforcurrentsecurity.$strLocl="MS_409"#USEnglish.Canleaveblankforcurrentlanguage$strAuth=""#ifspecifydomaininstrUsrthismustbeblank$iFlag="0"#onlytwovaluesallowed:0and128.$objLocator=New-Object-comobject"WbemScripting.SWbemLocator"$objWMIService=$objLocator.ConnectServer($strComputer,`$wmiNS,$strUsr,$strPWD,$strLocl,$strAuth,$iFLag)$colItems=$objWMIService.subClassesOf()Write-Host"Thereare:"$colItems.count" classesin$wmiNS"foreach($objItemIn$colItems){$objItem.path_. class}
更新日志
测试
在macOS上删除对DNS测试连接的依赖(#12943)
建造和包装改进
更新.NETCore至3.1.6(内部12005)。