http://baike.baidu.com/view/2838635.htm?fromId=58531
Windows Power Shell求助編輯百科名片
Windows Power Shell
Windows PowerShell 是一種命令列外殼程式和指令碼環境,使命令列使用者和指令碼編寫者可以利用
.NET Framework 的強大功能。它引入了許多非常有用的新概念,從而進一步擴充了您在 Windows 命令提示字元和 Windows Script Host 環境中獲得的知識和建立的指令碼。
目錄
-
Windows PowerShell 簡介
-
PowerShell指令碼十個基本概念
-
PowerShell v3概述
-
PowerShell v3優缺點
-
展開
-
Windows PowerShell 簡介
-
PowerShell指令碼十個基本概念
-
PowerShell v3概述
-
PowerShell v3優缺點
-
展開
編輯本段Windows
PowerShell 簡介
目標受眾Windows PowerShell 入門主要面向之前沒有 Windows PowerShell 背景知識的 IT 專業人員、程式員和進階使用者。雖然具備指令碼和 WMI 方面的背景知識會有所協助,但是理解本文檔並不假定或要求您具備此方面知識。
關於 Windows PowerShell通過解決長期存在的問題並添加一些新的功能,Windows PowerShell 旨在改進命令列和指令碼環境。PowerShell以.NET
Framework為平台,接收和返回.NET對象,此舉為管理和配置微軟系統帶來了新的方法和工具。
可發現特性您可輕易發現 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 }
新指令碼語言 由於以下原因,Windows PowerShell 使用它自己的語言,而不是重用現有的語言:Windows PowerShell 需要用於管理.NET 對象的語言。該語言需要為使用cmdlet 提供一致的環境。該語言需要支援複雜的任務,而不會使簡單的任務變得更複雜。 該語言需要與在.NET 編程中使用的進階語言(如C#)一致。編輯本段PowerShell指令碼十個基本概念
1、PS1檔案一個PowerShell指令碼
[1]其實就是一個簡單的文字檔,這個檔案包含了一系列PowerShell命令,每個命令顯示為獨立的一行,對於被視為PowerShell指令碼的文字檔,它的檔案名稱需要使用.PS1擴充。2、執行許可權為防止惡意指令碼的執行,PowerShell有一個執行策略,預設情況下,這個執行策略被設為受限的(Restricted),意味著PowerShell指令碼無法執行,你可以使用下面的cmdlet命令確定當前的執行策略:Get-ExecutionPolicy 你可以選擇使用的執行策略有:Restricted - 指令碼不能運行。 RemoteSigned - 本地建立的指令碼可以運行,但從網上下載的指令碼不能運行(除非它們擁有由信任的發行者簽署的數位簽章)。
AllSigned – 僅當指令碼由信任的發行者簽名才能運行。 Unrestricted – 指令碼執行不受限制,不管來自哪裡,也不管它們是否有簽名。你可以使用下面的cmdlet命令設定PowerShell的執行策略:Set-ExecutionPolicy <policy name>3、運行指令碼如果你想從命令列運行一個可執行檔,多年來一個永恒不變的方法是,在命令列轉到該執行檔案所在的位置,然後鍵入該執行檔案的名稱,但這個古老的方法現在卻不能適用於PowerShell可執行指令碼了。如果你想執行一個PowerShell指令碼,通常必須鍵入完整的路徑和檔案名稱,例如,假設你要運行一個名為a.ps1的指令碼,你可以鍵入:C:\Scripts\aps1 最大的例外是,如果PowerShell指令檔剛好位於你的系統目錄中,那麼你可以直接在命令提示字元後鍵入指令檔名即可運行,如:.\a.ps1 注意前面需要加上.\,這和Linux下執行Shell指令碼的方法如出一轍。4、管道管道的作用是將一個命令的輸出作為另一個命令的輸入,兩個命令(或cmdlet)之間只需要用管道符號(|)串連即可。為了協助你瞭解管道是如何工作的,我們以一個例子進行說明,假設你想建立運行在伺服器上的進程列表,並按進程的ID號進行排序,可以使用Get-Process cmdlet命令獲得進程列表,但預設情況下列表不會排序,如果將這個cmdlet命令的輸出用管道輸送給Sort-Object ID命令,進程列表將會按進程ID號進行排序,如:Get-Process | Sort-Object ID5、變數雖然可以使用管道將一個命令的輸出輸送給另一個命令,但管道本身也是有限制的,當你用管道從一個命令向另一個命令傳遞輸出結果時,輸出結果立即被使用,但有時候,你可能需要儲存輸出結果一段時間,以便以後可以使用(或重用),這個時候管道就應該下場,輪到變數上場了。人們很容易將變數想象成一個倉庫,但在PowerShell中,變數可以儲存命令的完整輸出,例如,假設你想儲存伺服器處於運行中的進程列表,你可以將它賦給一個變數,如:$a = Get-Process 在這裡,變數被命名為$a,如果你想使用這個變數,只需要簡單地調用它的名稱即可,例如,鍵入$a便可在螢幕上列印變數的內容。你可以將多個用管道串連的命令的最終輸出賦給一個變數,只需要用一對小括弧將命令括起來即可,例如,假設你想按進程ID對運行中的進程進行排序,然後將結果輸出給一個變數,你可以使用下面這個命令:$a = (Get-Process | Sort-Object ID)6、@符號通過使用@符號,你可以將列表內容轉換成一個數組,例如,下面的代碼建立了一個名為$Procs的變數,它包含多行常值內容(一個數組):$procs = @{name="explorer","svchost"}使用變數時你也可以使用@符號,為了確保它作為數組而不是單個值處理,例如,下面的代碼將在我前面定義的變數上運行Get-Process
cmdlet命令:Get-Process @procs Windows將顯示Windows資源管理員和Svchost使用的所有進程,注意變數前使用的@符號,而不是常見的$符號。7、SplitSplit操作符根據你指定的字元拆分一個文本字串,例如,假設你想將一個句子拆分成一個單片語成的一個數組,你可以使用下面的命令做到:"This is a test" -split " " 拆分後的結果如下:This is a test8、Join就像Split可以將一個文本字串拆分成多塊一樣,Join的操作則是逆向的,將多個獨立的塊串連成一個整體,例如,下面這行代碼將會建立一個文本字串,由我的名字和姓氏組成:"Brien","Posey" -join " " 命令末尾雙引號之間的空格告訴Windows在兩個文本字串之間插入一個空格。9、斷點運行一個新建立的PowerShell指令碼時,如果指令碼有Bug,會遇到意想不到的後果,保護自己的一個方法是在指令碼的關鍵位置插入斷點,這樣你就可以確保指令碼正常運行先,然後再處理可能存在的問題。插入斷點最簡單的方法是根據行號插入,例如,假設你要在第10行插入一個斷點,可以使用下面的命令:New-PSBreakpoint -Script C:\Scripts\a.ps1 -Line 10 你也可以將斷點綁定到變數上,如果你希望你的指令碼任何時候都可以修改a$的內容,可以使用下面的命令:New-PSBreakpoint -Script C:\scripts\a.ps1 -variables a 注意,我在變數名後並沒有包括貨幣符號。可以和PSBreakpoint一起使用的動詞包括New,Get,Enable,Disable和Remove。10、Step調試一個指令碼時,有時可能需要逐行運行指令碼,這時你可以使用Step-Into
cmdlet命令,它會使指令碼一行一行地執行,不管有沒有設定斷點,如果你想從這種步進式運行模式退出來,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令後,斷點仍然有效。順便說一句,如果你的指令碼使用了函數,你可能對Step-Out cmdlet更感興趣,Step-Out的工作方式和Step-Into一樣,不過,如果調用了一個函數,Windows不會逐步執行,整個函數將會一次性執行。編輯本段PowerShell
v3概述Windows PowerShell v3將伴隨著Microsoft Hyper-V 3.0和Windows
Server 2012發布。PowerShell v3是一個Windows任務自動化的架構,它由一個命令列shell和內建在這個.NET架構上的程式設計語言組成。PowerShell v3採用新的cmdlet讓管理員能夠更深入到系統進程中,這些進程可以製作成可執行檔檔案或指令碼(script)。一條cmdlet是一條輕量命令,Windows PowerShell已耗用時間在自動化指令碼的環境裡調用它。Cmdlet包括顯示目前的目錄的Get-Location,訪問檔案內容的Get-Content和結束運行進程的Stop-Process。PowerShell v3在Windows Server 8中裝載了Windows Management Framework 3.0。PowerShell已耗用時間也能嵌入到其它應用。編輯本段PowerShell
v3優缺點PowerShell v3優點PowerShell v3將在PowerShell上打造管理的大部分,也提供GUI管理選項以及命令列自動化。v3引入了一些相當重要的新功能。更好的遠端PowerShell遠程已經逐漸成為在網路上進行管理通訊的主要渠道。越來越多的GUI管理主控台將依賴遠程,因此加強PowerShell遠程對微軟很重要。現在能夠斷開遠端工作階段,稍後能從同個或不同的電腦重新串連到相同的會話。用戶端電腦崩潰的話,v3的Community Technical Preview不能斷開會話。相反,會話會永久關閉。所以這與遠端桌面完全不同,遠端桌面會話能在用戶端崩潰時配置並開啟會話。工作流程本質上,PowerShell新的工作流程構建能寫入與功能類似的東西,使用PowerShell翻譯命令和指令碼代碼到Windows工作流程技術WWF進程中。WWF然後能管理整個任務,包括修複網路故障與重啟電腦等。它是編排長期啟動並執行、複雜的、多步驟任務的更有效更可靠的一種方式。如果這個功能與下一個版本的System
Center Orchestrator整合。可更新的協助PowerShell與協助檔案中的錯誤做鬥爭。微軟需要發布一個作業系統補丁。基於TechNet網站的線上協助的存在減輕了這個問題,但杯水車薪。在v3中,協助檔案能按需更新,從任何微軟伺服器都可下載新的XML檔案。所以微軟就能根據找到的問題進行錯誤修複,不需要作業系統包或補丁。預定任務(Scheduled Job)owerShell v2引入了job,遵循的是job隨著時間擴充的理念。在v3中,新型job即scheduled job能被建立並按計劃運行,或者相應某個事件。這與Windows的Task Scheduler的區別只是其中一小點,不過終端使用者能從PowerShell中獲得這個功能。更好的發現關於命令列shell的一個困難部分在於如何使用。PowerShell的協助系統很有用,需要提供使用者想知道的命令的名字,並提供命令所在的外掛程式名字,並記得載入附件到記憶體中。而PowerShell v3在搜尋命令時,包含所有安裝模組的所有命令,shell會運行沒有裝載的命令。這隻能在那些儲存在列於PSModulePath環境變數中的檔案路徑中的模組有用。如果要包含額外路徑,可以在任何時候修改變數。額外功能:CIMPowerShell與Windows管理規範WMI運作很好,WMI是微軟的一項技術,或多或少建立在標準的通用資訊模組CIM上。在PowerShell
v3中,WMI cmdlet發揮餘熱,加入到新的CIM cmdlet集中。功能看起來似乎有重疊:CIM cmdlet使用WS-MAN,這個協議位於PowerShell的Remoting功能,微軟管理功能的新標準的後面。WMI使用被微軟正式棄用的DCOM,意味著不會再開發新功能,但可一直使用。CIM是未來的方向,不僅有對已知WMI的額外開發,而且在未來還可跨平台管理。PowerShell v3缺點新的Hyper-V 3.0 cmdlets不能管理老版本的Hyper-V。這意味著管理員根據Hyper-V的不同必須採用不同的指令碼去管理,直至完成所有宿主機的升級。Hyper-V 3.0和老版本不相容。使用老版本Hyper-V的管理員需要從CodePlex下載PowerShell Library for Hyper-V。