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