powershell 入門

    powershell是一個外殼,但並非同與cmd.exe,powershell具備內置的腳車編寫語言,不過比cmd.exe更爲靈活,靈活是指不多的語句就能夠自動執行極其複雜的任務。javascript

    從安全角度考慮,默認狀況下powershell並不會容許運行腳本,只能交換的來運行單個命令,若是啓用了腳本編寫,則可令powershell僅運行通過數字簽名的腳本。html

    快速入門十大cmdletjava

 *       Get-Command 用於檢索全部可用 cmdlet 的列表。shell

          Get-Help 用於顯示有關 cmdlet 和概念的幫助信息。安全

*       Get-WMIObject 用於經過 WMI 來檢索管理信息。ide

*       Get-EventLog 用於檢索 Windows 事件日誌。函數

*       Get-Process 用於檢索單個活動進程或活動進程的列表。工具

*       Get-Service 用於檢索 Windows 服務。測試

*       Get-Content 用於讀入文本文件,將每行視爲一個子對象。spa

*       Add-Content 用於將內容附加到文本文件。

*       Copy-Item 用於複製文件、文件夾和其餘對象。

         Get-Acl 用於檢索訪問控制列表 (ACL)。

    全部的cmdlet都是以「動詞-名詞」格式命名,便於記憶

    例如:Get-Command

    該命令將會列出全部cmdlet列表

    cmdlet甚至有快捷名稱,稱爲別名,對於Get-WMIObject,只要鍵入gwmi便可,運行Get-Alias將列出快捷名稱列表。

    powershell是在MS Microsoft® .NET Framework 構建的,因此徹底是面向對象的,面向對象對於管理員的好處就是節省大量時間,由於只需在基於文的外殼內就能直接處理豐富的對象

    例:

    Get-process | Sort-Object pm -desc | Select -Object -first 10

    使用管道將三個不一樣的命令組合使用,以上命令顯示結果爲機器上十大物理內存使用者。

    powershell中的對象使用很是廣泛,這全仰仗於它的變量,而且沒必要先聲明變量,只需在變量名稱前放置一個美圓符號($)就可使用它們了。儘管不是必需的,但您也能夠將所要放入變量的數據類型告知 PowerShell。這使得 PowerShell 能夠將變量映射到某一種極其強大的 .NET Framework 類型,從而爲您提供諸多附加的內置功能。

例如,假設您想要提示輸入計算機名稱並從該計算機中檢索服務包版本,可是您不知道鍵入的計算機名稱是否會包括兩個反斜線(如 \\Server2)。因爲您知道 Get-WMIObject cmdlet 不須要反斜線,所以您能夠將計算機名稱保存到一個字符串變量中,而後使用 Replace 方法以空字符串替換反斜線,以下所示:

[string]$c = Read-Host "Enter computer name"

$c = $c.Replace("\","")

    Get-WMIObject Win32_OperatingSystem

    –Property  ServicePackMajorVersion

    –Computer $c

已在 $c 變量中提供了 –Computer 參數的值。該變量最初是做爲字符串而建立的,所以它具備 .NET Framework 字符串類型的全部功能,包括 Replace 方法。

    若是您鍵入 $c = $c.(不要忘了句號)並按 Tab,PowerShell 將顯示 Clone(),這是字符串類型的第一個方法。若是您一直按 Tab,PowerShell 將會循環列出全部可用的方法。實質上,當您這樣作時,PowerShell 是在向您展現它所知道的字符串處理方法。

    然而,編寫一行命令和參數無助於可讀性。PowerShell 容許您將其拆分紅更具可讀性的形式,您甚至不用編寫腳本就能將其直接鍵入外殼。這就是它可能的形式:

    PowerShell 決不僅有函數和 cmdlet。讓咱們以文件管理爲例來快速瞭解一下其中還蘊藏着什麼別的內容。您可能對 Cmd.exe 中的驅動器和文件夾導航再熟悉不過了 — 鍵入 C: 可切換到 C 驅動器,鍵入 cd \test 可轉入 C:\Test 文件夾。PowerShell 的工做方式徹底相同,不過 cd 只是 Set-Location cmdlet 的別名。

    嘗試運行 Get-PSDrive,該 cmdlet 會列出全部可用的驅動器。除了經常使用的 C:、D:(也許還有 A:)驅動器以外,您還會發現一個名爲 Cert 的驅動器、另外一個名爲 Env 的驅動器以及其餘名爲 HKCU 和 HKLM 的驅動器。實際上,PowerShell 將許多不一樣類型的存儲資源均以「驅動器」形式公開,從而使得諸如本地證書存儲區、環境變量和註冊表等資源都可經過一個象文件那樣爲你們所熟悉的導航界面來得到。
鍵入 Set-Location HKLM:(或 cd hklm:,若是您喜歡使用快捷方式)然後按 Enter,可轉到 HKEY_LOCAL_MACHINE 註冊表配置單元。若是要刪除某個表項,可以使用 del 將其刪除,就像該表項是文件或文件夾同樣(不過必定要很是當心,若是刪除了必需的表項或是對註冊表進行了不正確地修改,可能會發生嚴重問題)。
這一切靈活性均來自於提供程序,它們將資源(如註冊表和證書存儲區)映射成相似於文件系統那樣的格式。 Microsoft 計劃經過另外的提供程序來擴展 PowerShell,例如,使您可以導航 Exchange Server 存儲區,就像它是文件系統同樣。這是一項很是重要的技術,重要性就在於它吸納了 Windows 所使用的林林總總的存儲庫並使它們看起來全都相同,並且還使得它們均可以經過您已熟悉的命令和技術系統來進行管理。

    PowerShell 在設計時很注重安全保護。PowerShell 中主要的安全功能是它的執行策略。默認狀況下,此策略設置爲「Restricted」,您能夠經過運行 Get-ExecutionPolicy cmdlet 來進行驗證。在 Restricted 模式下,不能運行腳本。就這麼簡單。因爲這是默認模式,所以剛出盒的 PowerShell 不能用來運行腳本。

    您可使用 Set-ExecutionPolicy cmdlet 指定其餘模式。我我的更偏心 RemoteSigned 模式。在此模式下,能夠運行未經數字簽名的本地腳本(而非遠程腳本),同時可以以最簡單的方法開發和測試腳本。除非已使用受信任發佈方所頒發的證書對腳本進行了數字簽名,不然 AllSigned 模式不會運行任何腳本。最後,採用 Unrestricted 策略可運行任何腳本。我建議切莫採用此策略,由於以此方式打開的 PowerShell 會運行可能乘機找上您計算機的惡意腳本。請注意,執行策略也可能受組策略支配,它會替代全部本地設置(若是組策略設置正要替代您的本地設置,Set-ExecutionPolicy 會向您發出警告)。
    另外, PowerShell 不會從當前目錄運行腳本,除非您指定了該路徑。這樣設計是爲了防止命令***。好比,某人建立了一個名爲 IPConfig.ps1 的腳本(PS1 是 PowerShell 腳本文件的文件擴展名)。若是文件可在當前文件夾以外運行,則您可能會鍵入 ipconfig 而運行此用戶所建立的腳本,可當時您實際上是但願運行 Windows 程序 Ipconfig.exe,這樣就帶來了風險。因爲 PowerShell 不會在當前文件夾以外運行腳本,因此這種錯誤不可能發生。若是您的確想在當前文件夾以外運行腳本,只需指定路徑便可:例如 .\myscript。對當前文件夾的顯式引用確保您知道本身正在運行腳本,而非外殼命令。

    PowerShell 還具備使實驗變得更加安全的功能。例如,請考慮(但請勿嘗試)這個使人懼怕的組合:

Get-Process | Stop-Process
    Get-Process cmdlet 會建立進程對象的集合並經過管道將其輸送到 Stop-Process cmdlet,然後者真的會將它們中止!這會致使在大約 5 秒鐘後出現藍屏 STOP 錯誤,緣由是終止了關鍵的 Windows 進程。可是,您能夠經過添加很是方便的 –Whatif 參數來看看將會發生什麼狀況,而不會令其真的發生:
Get-process | Stop-Process -Whatif

    在 PowerShell 中運行此命令會產生一組語句,它們會告訴您 cmdlet 將會作什麼,而不會真的讓它們這樣作。PowerShell 中的在線幫助系統(可經過 help 別名訪問)還沒有記載 –Whatif 參數,但請記住它。它是一個很好的工具,用於測試腳本和 cmdlet 以檢驗其結果,而不會實際作出任何具備潛在危害性和破壞性的事情。

PS C:\> $names = get-content "c:\computers.txt"
PS C:\> foreach ($name in $names) {
>> $name
>> gwmi Win32_OperatingSystem -prop ServicePackMajorVersion -comp $name
>> }
>> 
    這一次,文件的內容存儲在變量 $names 中。本例仍使用了 foreach,但它不是經過管道進行輸入的,所以必須告知它須要循環處理哪一個對象集合以及將每一個對象存儲在哪一個變量中,即 ($name in $names) 所指明的那一部分。其餘方面大致相同,只要您一按 Enter,就會執行代碼並顯示結果。
若是要重複使用此同一代碼,只需將其製成函數便可。再次將如下內容直接鍵入到外殼中:
PS C:\> function Get-ServicePacks ($file) {
>> $names = get-content $file
>> foreach ($name in $names) {
>> $name
>> gwmi win32_operatingsystem -prop servicepackmajorversion -comp $name
>> }
>> }
>> 
    如您所見,實際上並未作太多更改。只需將上一示例封入一個名爲 Get-ServicePacks(與 PowerShell 的「動詞-名詞」命名慣例保持一致)的函數便可。該函數如今具備一個名爲 $file 的輸入參數,該參數在 Get-Content cmdlet 中已被取代,這樣即可在運行函數時指定另外一不一樣的文件。至此已定義了函數,運行它很簡單,方法幾乎與 cmdlet 同樣,只需調用其名稱並傳遞輸入參數便可:
PS C:\> Get-ServicePacks c:\computers.txt
    其缺點在於此函數僅在該 PowerShell 實例運行期間才存在。一旦關閉外殼,該函數即會消失。您能夠將該函數複製到您的 PowerShell 配置文件中,該配置文件是一種自動運行的腳本,它會在 PowerShell 每次啓動時執行。這樣作就使該函數在打開的每一個 PowerShell 窗口中都可用。或者,若是須要,也可將該函數作成獨立的腳本,而後只需鍵入其路徑和文件名便可執行該腳本。
相關文章
相關標籤/搜索