天天看點

windows power shell

Windows PowerShell 是一種指令行外殼程式和腳本環境,使指令行使用者和腳本編寫者可以利用 .NET Framework 的強大功能。它引入了許多非常有用的新概念,進而進一步擴充了您在 Windows 指令提示符和 Windows Script Host 環境中獲得的知識和建立的腳本。

目錄

<dl></dl>

<dd></dd>

<dd>展開</dd>

  目标閱聽人

  Windows PowerShell 入門主要面向之前沒有 Windows PowerShell 背景知識的 IT 專業人員、程式員和進階使用者。雖然具備腳本和 WMI 方面的背景知識會有所幫助,但是了解本文檔并不假定或要求您具備此方面知識。

  關于 Windows PowerShell

  通過解決長期存在的問題并添加一些新的功能,Windows PowerShell 旨在改進指令行和腳本環境。

  可發現特性

  您可輕易發現 Windows Powershell 的功能。例如,若要查找用于檢視和更改Windows 服務的cmdlet 清單,請鍵入:

  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#)一緻。

  1、PS1檔案

  2、執行權限

  為防止惡意腳本的執行,PowerShell有一個執行政策,預設情況下,這個執行政策被設為受限的(Restricted),意味着PowerShell腳本無法執行,你可以使用下面的cmdlet指令确定目前的執行政策:

  Get-ExecutionPolicy 你可以選擇使用的執行政策有:

  Restricted - 腳本不能運作。 RemoteSigned - 本地建立的腳本可以運作,但從網上下載下傳的腳本不能運作(除非它們擁有由受信任的釋出者簽署的數字簽名)。 AllSigned – 僅當腳本由受信任的釋出者簽名才能運作。 Unrestricted – 腳本執行不受限制,不管來自哪裡,也不管它們是否有簽名。

  你可以使用下面的cmdlet指令設定PowerShell的執行政策:

  Set-ExecutionPolicy &lt;policy name&gt;

  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 ID

  5、變量

  雖然可以使用管道将一個指令的輸出輸送給另一個指令,但管道本身也是有限制的,當你用管道從一個指令向另一個指令傳遞輸出結果時,輸出結果立即被使用,但有時候,你可能需要儲存輸出結果一段時間,以便以後可以使用(或重用),這個時候管道就應該下場,輪到變量上場了。

  人們很容易将變量想象成一個倉庫,但在PowerShell中,變量可以儲存指令的完整輸出,例如,假設你想儲存伺服器處于運作中的程序清單,你可以将它賦給一個變量,如:

  $a = Get-Process 在這裡,變量被命名為$a,如果你想使用這個變量,隻需要簡單地調用它的名稱即可,例如,鍵入$a便可在螢幕上列印變量的内容。

  你可以将多個用管道連接配接的指令的最終輸出賦給一個變量,隻需要用一對小括号将指令括起來即可,例如,假設你想按程序ID對運作中的程序進行排序,然後将結果輸出給一個變量,你可以使用下面這個指令:

  $a = (Get-Process | Sort-Object ID)

  6、@符号

  通過使用@符号,你可以将清單内容轉換成一個數組,例如,下面的代碼建立了一個名為$Procs的變量,它包含多行文本内容(一個數組):$procs = @{name="explorer","svchost"}

  使用變量時你也可以使用@符号,為了確定它作為數組而不是單個值處理,例如,下面的代碼将在我前面定義的變量上運作Get-Process cmdlet指令:

  7、Split

  Split操作符根據你指定的字元拆分一個文本字元串,例如,假設你想将一個句子拆分成一個單詞組成的一個數組,你可以使用下面的指令做到:

  "This is a test" -split " " 拆分後的結果如下:

  This is a test

  8、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不會逐漸執行,整個函數将會一次性執行。

  Windows PowerShell v3将伴随着Microsoft Hyper-V 3.0和Windows Server 8釋出。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上打造管理的大部分,也提供GUI管理選項以及指令行自動化。v3引入了一些相當重要的新功能。

  更好的遠端處理

  PowerShell遠端已經逐漸成為在網絡上進行管理通信的主要管道。越來越多的GUI管理控制台将依賴遠端,是以加強PowerShell遠端對微軟很重要。現在能夠斷開遠端會話,稍後能從同個或不同的計算機重新連接配接到相同的會話。用戶端計算機崩潰的話,v3的社群技術預覽版不能斷開會話。相反,會話會永久關閉。是以這與遠端桌面完全不同,遠端桌面會話能在用戶端崩潰時配置并打開會話。

  工作流

  本質上,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環境變量中的檔案路徑中的子產品有用。如果要包含額外路徑,可以在任何時候修改變量。

  額外功能:CIM

  PowerShell與Windows管理規範WMI運作很好,WMI是微軟的一項技術,或多或少建立在标準的通用資訊子產品CIM上。在PowerShell v3中,WMI cmdlet發揮餘熱,加入到新的CIM cmdlet集中。功能看起來似乎有重疊:CIM cmdlet使用WS-MAN,這個協定位于PowerShell的Remoting功能,微軟管理功能的新标準的後面。WMI使用被微軟正式棄用的DCOM,意味着不會再開發新功能,但可一直使用。CIM是未來的方向,不僅有對已知WMI的額外開發,而且在未來還可跨平台管理。

  新的Hyper-V 3.0 cmdlets不能管理老版本的Hyper-V。這意味着管理者根據Hyper-V的不同必須采用不同的腳本去管理,直至完成所有主控端的更新。

  Hyper-V 3.0和老版本不相容。使用老版本Hyper-V的管理者需要從CodePlex下載下傳PowerShell Library for Hyper-V。

<dt>參考資料</dt>

<dt>擴充閱讀:</dt>

1

<dt>開放分類:</dt>

上一篇: batch 批處理
下一篇: dos 相關

繼續閱讀