PowerShell是一個(gè)跨平臺(tái)(Windows、Linux和macOS)的自動(dòng)化和配置工具/框架,它能與您現(xiàn)有的工具很好地配合,并針對(duì)處理結(jié)構(gòu)化數(shù)據(jù)(如JSON、CSV、XML等)、REST API和對(duì)象模型進(jìn)行了優(yōu)化,PowerShell包括一個(gè)命令行shell,一個(gè)相關(guān)的腳本語言和一個(gè)處理cmdlets的框架。
軟件特色
您可輕易發(fā)現(xiàn) Windows Powershell 的功能。例如,若要查找用于查看和更改Windows 服務(wù)的cmdlet 列表,執(zhí)行:開始->運(yùn)行->cmd,在命令行下輸入 PowerShell 進(jìn)入 windows PowerShell,再輸入如下命令:
get-command *-service
在發(fā)現(xiàn)可完成任務(wù)的 cmdlet 之后,可以使用 Get-Help cmdlet 了解有關(guān)該 cmdlet 的詳細(xì)信息。例如,若要顯示有關(guān) Get-Service cmdlet 的幫助,請(qǐng)鍵入:
get-help get-service
若要充分理解該 cmdlet 的輸出,則可通過管道將其輸出傳遞給 Get-Member cmdlet。例如,以下命令將通過 Get-Service cmdlet 顯示有關(guān)該對(duì)象輸出的成員的信息。
get-service | get-member
一致性
管理系統(tǒng)可能是一項(xiàng)復(fù)雜的任務(wù),而具有統(tǒng)一接口的工具將有助于控制其固有的復(fù)雜性。然而,無論是命令行工具還是可編寫腳本的 COM 對(duì)象,在一致性方面都乏善可陳。
Windows PowerShell 的一致性是其主要優(yōu)點(diǎn)中的一項(xiàng)。例如,如果您學(xué)會(huì)了如何使用 Sort-Object cmdlet,則可利用這一知識(shí)對(duì)任何 cmdlet 的輸出進(jìn)行排序。而無需了解每個(gè) cmdlet 的不同的排序例程。
此外,cmdlet 開發(fā)人員也不必為其 cmdlet 設(shè)計(jì)排序功能。Windows PowerShell 為他們提供了框架,而該框架可提供基本的功能,并強(qiáng)制他們?cè)诮涌诘脑S多方面保持一致。該框架雖然消除了通常會(huì)留給開發(fā)人員的某些選項(xiàng),但作為回報(bào),開發(fā)強(qiáng)健、易于使用的 cmdlet 的工作將更加簡單。
交互式腳本環(huán)境
Windows PowerShell 將交互式環(huán)境和腳本環(huán)境組合在一起,從而允許您訪問命令行工具和 COM 對(duì)象,同時(shí)還可利用 .net framework 類庫 (FCL) 的強(qiáng)大功能。
此環(huán)境對(duì) Windows命令提示符進(jìn)行了改進(jìn),后者提供了帶有多種命令行工具的交互式環(huán)境。此外,還對(duì) Windows Script Host (WSH)腳本進(jìn)行了改進(jìn),后者允許您使用多種命令行工具和 COM 自動(dòng)對(duì)象,但未提供交互式環(huán)境。
通過將對(duì)所有這些功能的訪問組合在一起,Windows PowerShell 擴(kuò)展了交互用戶和腳本編寫者的能力,從而更易于進(jìn)行系統(tǒng)管理。
面向?qū)ο?/p>
盡管您可以通過以文本方式鍵入命令與 Windows PowerShell 進(jìn)行交互,但 Windows PowerShell 是基于對(duì)象的,而不是基于文本的。命令的輸出即為對(duì)象??梢詫⑤敵鰧?duì)象發(fā)送給另一條命令以作為其輸入。因此,Windows PowerShell 為未曾使用過其他外殼程序的人員提供了熟悉的界面,同時(shí)引入了新的、功能強(qiáng)大的命令行范例。通過允許發(fā)送對(duì)象(而不是文本),它擴(kuò)展了在命令之間發(fā)送數(shù)據(jù)的概念。
易于過渡到腳本
使用 Windows PowerShell,您可以很方便地從以交互方式鍵入命令過渡到創(chuàng)建和運(yùn)行腳本。您可以在 Windows PowerShell命令提示符下鍵入命令以找到可執(zhí)行任務(wù)的命令。隨后,可將這些命令保存到腳本或歷史記錄中,然后將其復(fù)制到文件中以用作腳本。
識(shí)別你即將使用的Provider 通過識(shí)別PowerShell里安裝的Provider,你就可以了解默認(rèn)安裝下PowerShell提供了那些能力。 Provider可以使用一種簡單的訪問方式,暴露位于不同儲(chǔ)存位置的數(shù)據(jù)。就像是瀏覽不同磁盤上的目錄結(jié)構(gòu)一樣簡單。 Provider把不同的信息存放位置,表示成“驅(qū)動(dòng)器”-目錄這種結(jié)構(gòu),這樣很容易被用戶所理解。就像我們要訪問一個(gè)位于D盤的WIN32目錄下的SETUP.exe文件,我們要通過瀏覽器,單擊D盤的圖標(biāo),然后選擇WIN32目錄并雙擊一樣,如果我們要訪問位于“注冊(cè)表”的數(shù)據(jù),那么我們也只需要簡單地通過Set-Location命令,來到到“REGISTRY”這個(gè)“驅(qū)動(dòng)器”,然后用GET-CHILDITEM命令獲取其子數(shù)據(jù)就行了。
注:實(shí)際上,PowerShell訪問磁盤驅(qū)動(dòng)器,也是通過Provider的,切換驅(qū)動(dòng)器其實(shí)和切換其他數(shù)據(jù)容器是一樣地操作。 例如: Set-Location d:\ 這是切換驅(qū)動(dòng)器 Set-Location HKLM:\ 這是切換到注冊(cè)表的HKLM鍵 另外,Get-PSprovider命令,可以查看當(dāng)前已經(jīng)安裝的所有PROVIDER。任何熟悉.NET編程的人,都可以編寫Provider。當(dāng)新的provider被安裝后,就叫做snap-in。snap-in其實(shí)是一個(gè)動(dòng)態(tài)連接庫dll文件,可以被安裝到powershell中。然而,當(dāng)一個(gè)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} 這些就是我機(jī)器上的默認(rèn)安裝后的provider。
使用Set-Location和Get-ChildItem瀏覽數(shù)據(jù) Set-Location用于改變當(dāng)前目錄,以及選擇當(dāng)前的provider,而Get-ChildItem用于獲取當(dāng)前目錄或者指定目錄下的子對(duì)象: 例子: set-location hkcu:\software get-childitem 例子2: GCI -path HKLM:\software
有兩種連接WMI服務(wù)的方法:l 使用Get-WmiObject可以很容易地連接到WMI服務(wù),并且獲取WMI對(duì)象。 l 使用一個(gè)COM對(duì)象,“WbemScripting.SWbemLocator”,可以連接WMI的服務(wù)。SWbemLocator對(duì)象只有一個(gè)方法,就是ConnectServer()。該方法接受5個(gè)參數(shù):用戶名,密碼,語言代碼,驗(yàn)證方法(Kerberos, NTLM等),標(biāo)志(超時(shí)值)。
下例中,我們使用New-Object命令,創(chuàng)建了一個(gè)“WbemScripting.SWbemLocator”的實(shí)例。然后用這個(gè)實(shí)例的ConnectServer方法連接了到了一個(gè)WMI的名字空間(root\cimv2),ConnectServer方法返回了一個(gè)WMIService對(duì)象,接著又用這個(gè)對(duì)象的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 }