PowerShell實用寶典-BD02.doc_第1頁
PowerShell實用寶典-BD02.doc_第2頁
PowerShell實用寶典-BD02.doc_第3頁
PowerShell實用寶典-BD02.doc_第4頁
PowerShell實用寶典-BD02.doc_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第2章 充分利用Windows PowerShell第2章 充分利用Windows PowerShelll 初始化環(huán)境l 理解命令輸入、解析和輸出l 輸出的寫操作和格式化Windows PowerShell為使用命令和腳本提供了一個高效的環(huán)境。正如第1章所述,可以在命令行中運行多種類型的命令,包括內(nèi)置的cmdlet、Windows工具和帶有命令行擴展的應(yīng)用程序。無論它的來源是什么,每個命令都要遵循相同的語法規(guī)則。這些規(guī)則規(guī)定了一個命令由命令名稱及其之后必要或可選的參數(shù)組成。參數(shù)包括參數(shù)本身、參數(shù)值和其他命令文本,可以利用管道來結(jié)合命令和重定向為輸入、輸出和錯誤指定來源。在PowerShell執(zhí)行命令的同時,也啟動了一系列事件,類似于執(zhí)行下列步驟。(1)被串接或組合并在一行中傳遞的多條命令被分解為獨立的執(zhí)行單元。一個執(zhí)行單元的值被分解為一系列片段,稱為令牌。(2)每個令牌被解析,根據(jù)值分隔命令,并且根據(jù)某種對象類型(例如字符串或布爾值)來求值。在分析階段,命令文本中的變量用它們相應(yīng)的實際值來替換。(3)個別的命令被處理。如果一個命令的名稱中包含一個路徑,PowerShell將使用這個路徑去查找命令。如果沒有在指定的位置找到這個命令,PowerShell會返回一個錯誤。(4)如果命令名稱中沒有指定文件路徑,PowerShell會嘗試在內(nèi)部解析命令名稱。每一個匹配表示引用了一個內(nèi)置的命令(包含命令或函數(shù)的別名),該命令可以被立即執(zhí)行。如果沒有匹配項,PowerShell就在命令路徑中查找匹配的可執(zhí)行命令。如果在上述位置中都沒有找到該命令,PowerShell會返回一個錯誤。因為PowerShell默認(rèn)不查找當(dāng)前目錄,必須明確地指定當(dāng)前目錄。(5)如果命令被定位,則使用任意指定的參數(shù)(包括使用那些指定的輸入)執(zhí)行命令。命令的輸出和任何錯誤被寫到PowerShell窗口或指定位置。可以看出,很多因素可以影響命令的執(zhí)行,包括命令的路徑設(shè)置、重定向技術(shù)和命令是否被串接或分組。在本章中,將描述并展示上述命令執(zhí)行過程的實例,來幫助你充分利用PowerShell。在深入討論之前,讓我們看看啟動PowerShell時的一些特別約定,并且介紹配置文件和控制臺文件的概念。2.1 初始化環(huán)境Windows PowerShell提供一個動態(tài)的、可擴展的執(zhí)行環(huán)境。有幾種方法可以初始化PowerShell環(huán)境,包括傳遞啟動參數(shù)到Powershell.exe,使用自定義的配置文件,使用控制臺文件,或者這三者的任意組合。也可以用幾種方法來擴展PowerShell的環(huán)境,包括通過安裝提供程序和注冊管理單元(詳情參見第3章)。2.1.1 傳遞啟動參數(shù)如果曾經(jīng)使用過PowerShell,你可能是通過單擊“開始”|“所有程序”|“附件”|Windows PowerShell,然后選擇Windows PowerShell來打開控制臺窗口的。這樣的啟動方式是以普通用戶權(quán)限而不是管理員權(quán)限來啟動PowerShell的,因此不能夠執(zhí)行許多管理任務(wù)。為了以管理員權(quán)限啟動PowerShell,需要單擊“開始”|“所有程序”|“附件”|Windows PowerShell,右擊Windows PowerShell并選擇“以管理員身份運行”。其他啟動PowerShell控制臺的方式有:使用“開始”菜單的“搜索”文本框;使用“運行”對話框;在命令行窗口中輸入powershell。這些技術(shù)能夠傳遞參數(shù)到PowerShell,包括用于控制PowerShell工作方式的開關(guān)和執(zhí)行額外命令的參數(shù)。例如,可以通過使用powershell -nologo在無logo模式(表示logo標(biāo)志被關(guān)閉)下啟動PowerShell。默認(rèn)情況下,通過命令行窗口啟動PowerShell,PowerShell運行,然后退出。如果希望PowerShell執(zhí)行一個命令并且不終止,在命令文本之后輸入powershell /noexit。代碼清單2.1展示調(diào)用PowerShell控制臺的基本語法。表2.1列舉可用的啟動參數(shù)。默認(rèn)情況下,PowerShell控制臺啟動時啟動配置文件被裝載。要退出控制臺,輸入exit。代碼清單2.1 PowerShell語法powershell.exe -PSConsoleFile FileName | -Version VersionNumber -NoLogo -NoExit -NoProfile -NonInteractive -Sta -InputFormat Text | XML -OutputFormat Text | XML -WindowsStyle Style -EncodedCommand Base64EncodedCommand -File ScriptFilePath -ExecutionPolicy PolicySetting -Command CommandText表2.1 PowerShell啟動參數(shù)參 數(shù)描 述-command指定命令文本來執(zhí)行,就像在PowerShell命令提示符下輸入一樣-EncodedCommand指定base64-encoded命令文本來執(zhí)行-ExecutionPolicy為控制臺會話設(shè)置默認(rèn)的執(zhí)行策略續(xù)表參 數(shù)描 述-File設(shè)置要執(zhí)行的腳本文件的名稱-inputFormat設(shè)置發(fā)送到PowerShell的數(shù)據(jù)的格式,如文本字符串或序列化的XML。默認(rèn)的格式是XML。有效值是text和XML-NoExit運行啟動命令后不退出。通過命令行shell(cmd.exe)運行PowerShell命令或腳本時,這個參數(shù)非常有用-NoLogo啟動PowerShell控制臺但不顯示版權(quán)標(biāo)志-Noninteractive在非交互模式下啟動PowerShell控制臺。在這個模式下,PowerShell不為用戶提供交互的提示-NoProfile告訴PowerShell控制臺不裝載當(dāng)前用戶配置文件-OutputFormat設(shè)置輸出格式為文本字符串或序列化的XML。默認(rèn)格式是文本字符串。有效值是text和XML-PSConsoleFile裝載指定的Windows PowerShell控制臺文件??刂婆_文件以.psc1為擴展名,用于確保指定的管理單元擴展被裝載并且可供使用。可以在Windows PowerShell中使用Export-Console創(chuàng)建控制臺文件-Sta以單線程啟動PowerShell-Version出于兼容的原因,設(shè)置使用的Windows PowerShell的版本,如1.0-WindowStyle設(shè)置窗口風(fēng)格,如Normal(普通)、Minimized(最小化)、Maximized(最大化)或者Hidden(隱藏)。默認(rèn)值是Normal2.1.2 調(diào)用Windows PowerShell盡管最常使用PowerShell控制臺或PowerShell ISE,但有時候可能需要從Windows命令行shell(cmd.exe)環(huán)境或者批處理腳本調(diào)用PowerShell。要這么做,可以使用-Command參數(shù)。一般來說,還需要使用-NoLogo參數(shù)以便不顯示W(wǎng)indows PowerShell的logo,并且使用-NoProfile參數(shù)來停止配置文件的執(zhí)行。例如,在一個命令提示符下或一個批處理文件中,可以在PowerShell中用下列命令得到當(dāng)前運行進程的列表:powershell nologo noprofile command get-process輸入這一命令,Windows命令行運行PowerShell,就像運行其他外部程序一樣,傳遞參數(shù)和參數(shù)值,在執(zhí)行完畢后退出PowerShell。要想使命令行在執(zhí)行一個PowerShell命令后保持PowerShell運行,可以增加-NoExit參數(shù),如下例所示:powershell noexit command get-process2.1.3 使用-Command運行命令因為-Command是從命令行提示符或批處理調(diào)用PowerShell最常用的一個參數(shù),讓我們仔細看看它的所有使用方法。如果輸入“-”作為命令,命令文本從標(biāo)準(zhǔn)輸入讀取。也可以使用管道和重定向技術(shù)來操作命令的輸出。記住任何在命令之后輸入的字符都被解釋為命令參數(shù)。因此,要寫包含管道或重定向的命令,必須用雙引號括住命令文本。下面的例子用來獲取當(dāng)前運行進程的信息并按進程標(biāo)示符排序:powershell nologo noprofile command get-process | sort-object Id實踐提示 大部分命令生成的輸出可以被重定向到另一個命令作為輸入。這樣的技術(shù)稱為管道,通過管道,某命令的輸出被發(fā)送到下一命令作為輸入。如下所示,可以看到管道命令的一般語法:Command1 | Command2這里管道重定向Command1的輸出到Command2的輸入。也可以下例的語法多次重定向輸出:Command1 | Command2 | Command3一般來說,如果一個cmdlet接受了來自另一個cmdlet的輸入,這個cmdlet就具有一個-InputObject參數(shù),并且可以管道輸出到這個cmdlet。Windows PowerShell也支持腳本塊。一個腳本塊是有序執(zhí)行的一系列命令。腳本塊用大括號“”括住,并且在腳本塊中的每個命令用分號間隔。輸入腳本塊時可以使用大括號,但只有在Windows PowerShell中運行Powershell.exe時才能直接這樣使用。結(jié)果是返回未序列化的XML對象而不是標(biāo)準(zhǔn)對象。例如,正在PowerShell提示符下工作,并且希望通過一個分離的PowerShell實例運行一系列的命令,可以用大括號括住命令并且使用分號分隔命令,如下所示:powershell command get-service; get-process盡管在PowerShell提示符下這一技術(shù)有效,但在命令提示符下運行PowerShell時,它將不會工作。在此情況下,使用如下格式:& CommandText在這里,引號表示一個字符串,&表示一個調(diào)用操作符,使這個命令被執(zhí)行。在輸入運行命令的字符串后,一般可以在命令提示符下或PowerShell提示符下運行這個命令。例如,在命令提示符下不能輸入執(zhí)行powershell -command get-service; get-process,但可以在命令提示符下輸入執(zhí)行下列命令:powershell command & get-service; get-process這里,以字符串形式傳遞了一個代碼塊到PowerShell以解析并執(zhí)行。PowerShell執(zhí)行Get-Service并顯示結(jié)果,然后執(zhí)行Get-Process并顯示結(jié)果。如果無論使用字符串還是多個命令,無論在命令提示符還是在PowerShell提示符下都能成功使用某語法,那么該語法就是應(yīng)該使用的語法。2.1.4 使用-File運行腳本使用Windows命令行且運行PowerShell腳本時,可以使用管道和重定向技術(shù)來操作命令輸出。不同于使用-Command參數(shù),-File參數(shù)用來指定要運行的腳本。如下例所示,使用-File參數(shù)并指定要運行的腳本的路徑:powershell nologo noprofile file c:scriptsrun_all.ps1如果腳本在當(dāng)前目錄中,可以只輸入腳本名稱,如下所示:powershell nologo noprofile file run_all.ps1如果路徑中包含空格,必須用雙引號括住路徑,如下所示:powershell nologo noprofile file c:datacurrent scriptsrun_all.ps1實踐提示 無論是從菜單還是從命令提示符啟動PowerShell,都可指定參數(shù)。當(dāng)從菜單啟動PowerShell時,修改啟動PowerShell控制臺或PowerShell應(yīng)用程序的菜單快捷方式,指定在使用PowerShell時用到的參數(shù)。要這么做,可以按下列步驟操作。(1) 在菜單上,右擊快捷方式,然后選擇“屬性”。在“屬性”對話框中, “快捷方式”選項卡的“目標(biāo)”欄被默認(rèn)選中。(2) 按右箭頭鍵,不用按下其他按鍵。插入光標(biāo)會移動到PowerShell路徑 的末端,插入一個空格,然后輸入?yún)?shù)和參數(shù)值。(3) 單擊“確定”來存儲設(shè)置。如果誤操作或者不想再使用參數(shù),重復(fù)上 述步驟并移除之前增加的參數(shù)和參數(shù)值。2.1.5 使用嵌套的控制臺在PowerShell控制臺中,有時需要使用不同的環(huán)境設(shè)置和參數(shù),然后返回先前設(shè)置而不退出控制臺窗口。為此,可以使用嵌套技術(shù)。使用嵌套,可以在一個PowerShell控制臺中啟動另一個PowerShell控制臺。不同于命令行,嵌套的控制臺以新的工作環(huán)境運行,并且不繼承當(dāng)前控制臺的環(huán)境設(shè)置。可以在這個分離的控制臺環(huán)境中執(zhí)行命令和腳本。輸入exit來關(guān)閉嵌套的控制臺實例時,將返回先前的控制臺,先前的環(huán)境設(shè)置被恢復(fù)。2.2 理解命令輸入、解析和輸出從本章和第1章的例子可以看出,在PowerShell提示符下輸入命令是一個十分簡單的過程。最基本的方法是輸入命令并按下Enter鍵。按下Enter鍵后,PowerShell處理并解析命令文本。2.2.1 基本行編輯PowerShell控制臺包括一些基本的對當(dāng)前行的編輯能力。表2.2列出了編輯按鍵??梢詧?zhí)行g(shù)et-history來列出所有在命令記錄中的命令,也可以執(zhí)行clear-history來清除命令記錄。Get-History按照命令編號列出命令,也可以通過Invoke-History從命令記錄中運行指定編號的命令。在下例中,運行編號為35的命令:invoke-history 35表2.2 基本編輯按鍵按 鍵用 法插入一個換行符或者作為轉(zhuǎn)義字符來定義字面值。也可以用管道字符“|”換行Alt+Space+E顯示一個編輯快捷菜單,包含“標(biāo)記”、“復(fù)制”、“粘貼”、“全選”、“滾動”和“查找”選項。按下K表示標(biāo)記,Y表示復(fù)制,P表示粘貼,S表示全選,L表示在屏幕緩沖區(qū)域中滾動,F(xiàn)表示在屏幕緩沖區(qū)域中查找文本。要復(fù)制屏幕緩沖區(qū)域到“剪貼板”,先按下Alt+Space+E+S,然后按下Alt+Space+E+YAlt+F7清除命令記錄Ctrl+C中斷子提示或中止執(zhí)行Ctrl+End刪除行中光標(biāo)后的所有字符Ctrl+左箭頭/Ctrl+右箭頭每次向左或向右移動一個單詞Ctrl+S暫停或恢復(fù)輸出顯示Delete/Backspace按下Delete鍵來刪除光標(biāo)后的字符,或者按下Backspace鍵刪除光標(biāo)左側(cè)的字符Esc清除當(dāng)前行F1在命令行上將光標(biāo)向右移動一個字符。在行末,從上個命令的文本中插入一個字符F2復(fù)制從上一個命令行開始到輸入的字符為止的內(nèi)容,以創(chuàng)建新的命令行F3從當(dāng)前光標(biāo)位置起到行末,根據(jù)上個命令補齊命令行內(nèi)容F4刪除當(dāng)前命令行中從當(dāng)前光標(biāo)位置起到輸入的字符止的字符F5向后掃描命令記錄F7顯示一個包含命令記錄的彈出窗口,并允許選擇一個命令。使用方向按鍵可以滾動列表。按下Enter鍵選中要執(zhí)行的命令,或者按右箭頭鍵將選中的文本放置到命令行F8在命令行中,根據(jù)已經(jīng)輸入的文本,在命令記錄中向后查找匹配的命令F9從命令記錄中運行指定編號的命令。按下F7鍵列出命令編號Home/End移動到行首或行末續(xù)表按 鍵用 法Insert在插入模式和覆蓋模式間切換左/右箭頭鍵在當(dāng)前行向左或向右移動光標(biāo)Page Up/Page Down訪問命令記錄中第一條或最后一條命令右擊如果“快速編輯”模式被禁用,顯示包含“標(biāo)記”、“復(fù)制”、“粘貼”、“全選”、“滾動”和“查找”選項的編輯快捷菜單。要復(fù)制屏幕緩沖區(qū)域到“剪貼板”,右擊,選擇“標(biāo)記”,然后按下Enter鍵Tab/Shift+Tab訪問tab擴展功能,詳情參見6.2節(jié)上/下箭頭鍵在命令記錄中向前或向后掃描,如1.2.4節(jié)所述Windows徽標(biāo)鍵+R 后輸入powershell運行Windows PowerShell。注意,如果安裝了多個版本的PowerShell或者正在使用64位計算機,那么將運行第一個版本(可能不是想運行的那個版本)實踐提示 在PowerShell控制臺中復(fù)制和粘貼文本的方式取決于是否啟用了“快速編輯”模式。如果“快速編輯”模式被啟用,可以通過拖動鼠標(biāo)并按下Enter鍵來復(fù)制文本,然后單擊鼠標(biāo)來粘貼文本。當(dāng)拖動鼠標(biāo)來選取要復(fù)制的文本時,要注意開始之后不要中途停頓,然后,PowerShell將從“剪貼板”粘貼。如果“快速編輯”模式被禁用,復(fù)制文本需要通過右擊,選擇“標(biāo)記”,拖動鼠標(biāo)來選擇文本,然后按下Enter鍵。粘貼文本需要右擊,選擇“粘貼”。在“屬性”對話框中,可以啟動或禁用“快速編輯”,詳情參見1.2.3節(jié)。2.2.2 語法解析的工作機制除了先前在1.1節(jié)中討論的處理模式以外,PowerShell還有解析模式。不要把處理模式和解析模式混淆。處理模式控制PowerShell處理命令的方法。一般來說,處理發(fā)生在交互或者非交互模式下。解析模式控制PowerShell解析一條命令中的每個值的方法。PowerShell將命令分解為執(zhí)行和令牌單元。執(zhí)行單元包括從行中第一個字符,到分號或者到行末之間的任何字符。令牌是執(zhí)行單元中的一個值。知道這點,可以執(zhí)行以下操作。l 在一個命令行上輸入多條命令,使用分號分隔每條命令。l 可以通過按下Enter鍵來標(biāo)記一個執(zhí)行單元的末端。PowerShell解析值的方法取決于當(dāng)解析一個執(zhí)行單元時遇到的第一個令牌。PowerShell解析使用下列模式之一。l 表達式模式 如果在一個執(zhí)行單元中出現(xiàn)的第一個令牌不是cmdlet、關(guān)鍵字、別名、函數(shù)或外部工具的名稱,PowerShell會使用表達式模式。PowerShell會將表達式作為數(shù)值或字符串求值。字符串值必須用引號括住,不在引號中的數(shù)字被作為數(shù)值(而不是字符串)。l 命令模式 如果在一個執(zhí)行單元中出現(xiàn)的第一個令牌是cmdlet、關(guān)鍵字、別名、函數(shù)或外部工具的名稱,PowerShell會使用命令模式。PowerShell調(diào)用命令令牌。除了那些以表示變量、數(shù)組、字符串或子表達式開頭的字符開頭的值,命令令牌后的值將作為擴展字符串被處理。這些特殊字符包括“$”、“”、“”、“”和“(”,當(dāng)遇到這些字符,將使用表達式模式處理值。記住這些規(guī)則,可以看到如下事實。l 在PowerShell提示符下輸入5+5,PowerShell把5+5解釋為表達式,計算并顯示結(jié)果10。l 在PowerShell提示符下輸入Write-Host 5+5,PowerShell把5+5解釋為Write-Host的參數(shù),顯示5+5。l 在PowerShell提示符下輸入Write-Host(5+5),PowerShell把(5+5)解釋為表達式,計算并傳遞給Write-Host。PowerShell顯示結(jié)果10。2.2.3 解析被賦予的值在PowerShell中,變量定義以美元符號($)開頭,后面跟定義的變量名。要賦值給一個變量,可以使用等于符號(=),然后指定要賦予的值。創(chuàng)建一個變量后,可以使用變量名引用或顯示變量的值。按照這一規(guī)則,在PowerShell提示符下輸入$a=5+5,PowerShell把5+5解釋為表達式,計算并將結(jié)果賦值到變量。結(jié)果,在PowerShell提示符下輸入變量$a:$a或者輸入以下命令:Write-Host $a輸出結(jié)果如下:10又如,定義一個名為$a的變量,賦予它一個字符串值,如下所示:$a = This is a string.這里,值被當(dāng)作字符串處理并賦值到$a,字符串在表達式模式下處理。在PowerShell提示符下輸入$a:$a或者輸入以下命令:Write-Host $a輸出結(jié)果如下:This is a string.但有些時候,希望強制PowerShell使用命令模式將一個字符串解釋為文本表達式。要知道原因,考慮下面的例子:$a = Get-Process如果在PowerShell提示符下輸入$a:$a輸出結(jié)果如下:Get-Process發(fā)生這一情況是因為分配到$a的值被作為文本字符串,并且它在表達式模式下被處理。但在此例中原本希望PowerShell正確執(zhí)行Get-Process。要達到目的,需要PowerShell解析這個字符串并判定它包含一個令牌,而這個令牌應(yīng)該在命令模式下被處理。在引用$a變量時,通過使用“&”操作符,可以達到上述目的,如下例所示:&$a因為PowerShell在命令模式下處理這個字符串,Get-Process被看作一個命令令牌,Get-Process這一cmdlet被調(diào)用,輸出顯示當(dāng)前運行的進程。只要名稱被賦予字符串中,這一技術(shù)可以使用任何cmdlet、關(guān)鍵字、別名、函數(shù)或外部工具的名稱。除了命令名稱以外,如果要增加值,如參數(shù)、多命令或管道,必須用“”括住命令而不是用引號。大括號表示一個腳本塊,如下所示:$a = get-eventlog -newest 25 -logname application賦到$a的值被作為一個特殊字符串在表達式模式下被處理。在PowerShell提示符下輸入執(zhí)行$a,輸出結(jié)果如下:get-eventlog -newest 25 -logname system要強制PowerShell解析腳本塊內(nèi)容,可以如下輸入:&$aPowerShell會解析腳本塊中的每個令牌。結(jié)果與執(zhí)行命令文本相同。2.2.4 解析異常在命令行中執(zhí)行一個不完整的表達式時,PowerShell顯示“”子提示符,表示它等待補全表達式。例如,輸入Write-Host(,然后按下Enter鍵,PowerShell顯示“”子提示符,然后等待補全表達式。必須輸入額外的文本,如5+5)來補全命令行,然后按下Enter鍵。必須再次按下Enter鍵(不要輸入其他文本)退出子提示符然后返回。之后PowerShell才將輸入作為完整的執(zhí)行單元來解釋。如果要有意地將命令文本分解為多行輸入,可以使用“”符號。在復(fù)制長命令行并將它們粘貼到PowerShell控制臺時,可以使用這個技術(shù),然后運行它們。下面是操作步驟。(1)輸入命令文本的一部分,然后輸入“”。按下Enter鍵,PowerShell顯示“”子提示符。(2)輸入命令文本的下一部分。然后輸入“”,表示要在下一行繼續(xù)輸入命令文本或者按下Enter鍵標(biāo)記命令文本的結(jié)束。(3)最后當(dāng)按下Enter鍵(不要使用“”符號)標(biāo)記命令文本的結(jié)束(關(guān)閉所有表達式),PowerShell將命令文本作為命令解析。下面是實例和部分輸出:get-eventlog -newest 25 -logname system如果命令文本中使用了管道字符“|”,可以斷行,然后在下一行中繼續(xù),如下例和部分輸出所示:get-process | sort-object Id2.2.5 解析的輸出在解析命令和值之后,PowerShell返回輸出。不同于命令行shell(cmd.exe),在PowerShell中運行的內(nèi)置命令在輸出中返回對象。對象是數(shù)據(jù)點的一個集合,代表一個項目。對象有特定的數(shù)據(jù)類型,如字符串型、布爾型或數(shù)值型,并且有方法和屬性。對象方法允許針對對象代表的項目執(zhí)行操作。對象的屬性存儲關(guān)于對象代表的項目的信息。使用PowerShell時,可以使用一個對象的方法和屬性來采取特定的動作并操作數(shù)據(jù)。在管道中組合使用命令時,命令將信息作為對象相互傳遞。當(dāng)?shù)谝粭l命令運行時,它沿著管道向第二條命令發(fā)送一個或多個對象。第二條命令接收從第一條命令發(fā)來的對象、處理對象并顯示輸出,或在管道中傳遞新的或者被修改的對象到下一條命令。這一過程將持續(xù)到管道中所有命令運行完,并最終顯示命令輸出。因為我們不能讀到對象,而PowerShell能用文本解釋對象并輸出到屏幕。有多種方法可以操作輸出。2.3 輸出的寫操作和格式化盡管PowerShell讀寫對象,但各種對象關(guān)聯(lián)的值最終仍被轉(zhuǎn)換為文本,作為cmdlet執(zhí)行處理的最終結(jié)果。被寫到控制臺的輸出稱為被寫到標(biāo)準(zhǔn)輸出流的輸出。PowerShell也支持其他輸出流。在討論這些輸出流之前,將解釋默認(rèn)情況下,如何格式化輸出流。2.3.1 使用格式化的cmdlet使用外部工具和程序時,由工具和程序決定如何格式化輸出。使用PowerShell的cmdlet,PowerShell使用專用的格式化cmdlet(格式器)來格式化輸出。格式器決定顯示哪些輸出屬性,以及是否顯示成列表或表格。格式器根據(jù)數(shù)據(jù)的類型來決定顯示的方式。字符串和對象以不同的方式被處理和操作。注意格式器安排數(shù)據(jù)的顯示,但是不真正顯示它。用作輸出的cmdlet負責(zé)顯示輸出,詳情參見后文。使用下列格式器之一,可以明確地指定輸出的格式。l Format-List 將輸出格式化為屬性列表。默認(rèn)情況下,對象的所有屬性都被格式化,每行顯示一個屬性。使用-Properties來指定根據(jù)名稱顯示哪個屬性。在逗號分隔列表中輸入屬性名稱。需要時,使用通配符例如“*”來匹配任何值。Format-List -DisplayError -ShowError -Expand String -Force -GroupBy Object -InputObject Object -View String-Property PropertyNamel Format-Table 將輸出格式化為一張表格,分列顯示所選的屬性。對象類型決定默認(rèn)顯示的布局和屬性。根據(jù)數(shù)據(jù)寬度,使用-AutoSize自動地調(diào)整列的大小和數(shù)量。使用-HideTableHeaders來忽略列頭。使用-Wrap在下一行顯示超出列寬的文本。Format-Table -DisplayError -ShowError -Expand String -Force -GroupBy Object -InputObject Object -View String-AutoSize -HideTableHeaders -Wrap -Property PropertyNamel Format-Wide 將輸出格式化成多列的表格,但每個對象只有一個屬性被顯示。根據(jù)數(shù)據(jù)寬度,使用-AutoSize自動地調(diào)整列的大小和數(shù)量。使用-Columns指定要顯示的列的數(shù)量。Format-Wide -DisplayError -ShowError -Expand String -Force -GroupBy Object -InputObject Object -View String -AutoSize -Column NumColumns -Property PropertyNamel Format-Custom 使用預(yù)定義的可選視圖格式化輸出??梢栽赪indows PowerShell目錄下查看*format.PS1XML文件來決定可以選用的視圖。要創(chuàng)建自己的.PS1XML視圖文件,使用Update-FormatData將該文件增加到Windows PowerShell中。使用-Depth來指定顯示的列數(shù)。Format-Custom -DisplayError -ShowError -Expand String -Force -GroupBy Object -InputObject Object -View String -Depth Num -Property PropertyName在使用上述格式器時,可能也會用到下列cmdlet。l Group-Object 組對象包含和指定屬性相同的值。對象依次分組,所以如果值不排序,就不能得到想要的結(jié)果。-CaseSensitive用于以區(qū)分大小寫的方式排序而不是采用默認(rèn)排序方式(不區(qū)分大小寫)。使用-NoElement來忽略分組中的成員名,例如文件名(如果根據(jù)擴展名對文件分組)。Group-Object -CaseSensitive -Culture String -NoElement-InputObject Object -Property PropertyNamel Sort-Object 根據(jù)對象的屬性值以升序排列對象。使用-Descending以降序排列。-CaseSensitive用于以區(qū)分大小寫的方式排序而不是采用默認(rèn)排序方式(不區(qū)分大小寫)。使用-Unique來消除重復(fù)項并返回指定的唯一成員集合。Sort-Object -Culture String -CaseSensitive -Descending-InputObject Object -Unique -Property PropertyName要改變cmdlet的輸出格式,使用管道操作符“|”將命令輸出發(fā)送到格式器。例如,默認(rèn)情況下,Get-Service的格式是一張表,顯示“狀態(tài)”(Status)、“名稱”(Name)和“顯示名稱”(DisplayName)屬性,下面是命令和輸出:get-serviceFormat-Wide將輸出格式化成多列的表格,但每個對象只有一個屬性被顯示。在下例中,發(fā)送Get-Service的輸出到Format-Wide:get-service | format-wide -column 3結(jié)果,服務(wù)列表被格式化為多列。輸出提供每個被配置的服務(wù)的名稱。如果知道服務(wù)名稱,可以通過列舉每個配置屬性的值來測試服務(wù)。例如,下面的命令獲得WinRM服務(wù)的詳細信息:get-service winrm | format-list在這個格式中,數(shù)據(jù)以列表而不是以表格顯示,而且有先前輸出格式中被忽略的額外信息。任何格式器都可以使用-Properties參數(shù)來根據(jù)名稱指定顯示的屬性。必要時可以使用通配符例如“*”來匹配任何值。例如,要顯示所有winlogon進程屬性,執(zhí)行以下命令:get-process winlogon | format-list -property *要查看一個對象的所有屬性,可以發(fā)送命令的輸出到Get-Member。例如,查看一個服務(wù)對象的所有屬性,執(zhí)行下列命令:get-service | get-member -membertype *property因為所有這些屬性都屬于Get-Service為每個服務(wù)獲取的對象,所以可以通過-Property參數(shù)顯示任意或所有的屬性。例如,下面的例子使用Format-Table命令,讓它只顯示每個服務(wù)的“名稱”(Name)、“狀態(tài)”(Status)和“服務(wù)類型”(ServiceType)屬性。get-service | format-table Name, Status, ServiceType, ServicesDependedOn除了格式化顯示輸出,還可能需要將對象進行分組和排序。所有的格式器都包含-GroupBy參數(shù),它允許根據(jù)指定的屬性分組輸出。使用-Groupby參數(shù)生成的結(jié)果和發(fā)送輸出到Group-Object后再將輸出發(fā)送到格式器的結(jié)果是一樣的。但這些技術(shù)可能不會生成需要的輸出,因為每次遇到一個新的指定屬性值,都會生成新的標(biāo)題。例如,使用Get-Service可以按狀態(tài)(如正在運行的或者停止的)將服務(wù)分組,如下例所示:get-service | format-list groupby status使用Group-Object并根據(jù)狀態(tài)分組,將獲得完全不同的結(jié)果:get-service | group-object status盡管兩種輸出都有用,但如果要依次看所有停止和啟動的服務(wù),它們都不能提供所需要的結(jié)果。工作區(qū)首先將對象排序然后將它們分組。可以通過Sort-Object對對象排序。Sort-Object支持針對單一屬性和多個屬性的排序??梢允褂?Property參數(shù)指定單個或多個屬性進行排序,并用逗號“,”分隔多個屬性。例如,要根據(jù)狀態(tài)(Status)和名稱(Name)對服務(wù)排序,可以使用下面的命令:get-service | sort-object status, name | format-table groupby status默認(rèn)情況下,屬性按升序排列??梢允褂?Descending參數(shù)實現(xiàn)以降序排列。例如,使用Get-Process時,以降序排列可以幫助識別使用計算機資源最多的進程。該命令如下所示:get-process | sort-object ws descending默認(rèn)情況下,屬性按不區(qū)分大小寫的方式排序。通過增加-CaseSensitive參數(shù)可以使用區(qū)分大小寫的方式排序。最后,如果只想查看唯一的屬性值,可以添加-Unique參數(shù)。它消除了擁有相同值并多次出現(xiàn)的指定集合成員?;趯ο髮傩耘判驎r,表示只有唯一的指定屬性被返回,此方法可能適用于按照企業(yè)名排序的輸出,但不適合用于按照進程名排序的輸出。要知道原因,可以執(zhí)行命令,按名稱(ProcessName)排序列出正在運行的進程,如下例所示:get-process | sort-object name在這個輸出中,可以看到一些多次出現(xiàn)的進程,如powershell或svchost。如果輸入下列命令:get-process | sort-object name unique在這個輸出中,只會看到每個進程的第一個實例,它不會給出有多少進程正在運行,也不會給出那些進程占用了哪些資源。2.3.2 寫到輸出流Windows PowerShell有幾個cmdlet能寫到不同的輸出流。首先要了解這些cmdlet的是,它們并不真正渲染輸出。它們只是管道(發(fā)送)輸出到指定的輸出流。盡管一些輸出流會修改輸出格式,但真正的渲染和完成輸出工作屬于那些輸出cmdlet,詳情參見后文??捎玫妮敵隽饔邢铝袔最悾簂 標(biāo)準(zhǔn)輸出流l 詳細信息流l 警告信息流l 調(diào)試信息流l 錯誤信息流1. 顯式地寫輸出可以使用下列輸出cmdlet來顯式地寫輸出。l Write-Host寫到標(biāo)準(zhǔn)的輸出流并允許為文本設(shè)置背景色和前景色。默認(rèn)情況下,任何文本都以換行符中止。使用-NoNewLine可以不用插入換行符。使用-Separator在要顯示的對象間指定一個字符串輸出。使用-Object來指定要顯示的對象或字符串。Write-Host -BackgroundColor Color -ForegroundColor Color -NoNewline -Separator Object -Object Objectl Write-Output 發(fā)送指定對象經(jīng)管道到下一個命令或在控制臺中顯示。因為Write-Output接受輸入對象,所以可以發(fā)送對象到它,它會依次發(fā)送對象到下一個命令或控制臺。Write-Output -InputObject Object使用Write-Host的主要原因是利用它提供的格式化選項,其中包括可選的文本和背景色??梢允褂?BackgroundColor參數(shù)為輸出文本設(shè)置背景色,用-ForegroundColor參數(shù)設(shè)置文本顏色。可用的顏色如下:l 黑色、深藍色、深綠色、深青色l 深紅色、深品紅色、深黃色、灰色l 深灰色、藍色、綠色、青色l 紅色、品紅色、黃色、白色在下面的例子中,指定了黑色的文本和黃色的背景:write-host backgroundcolor yellow foregroundcolor black This is text!注意Write-Host寫輸出到承載PowerShell的應(yīng)用程序。典型的有PowerShell控制臺(powershell.exe)或PowerShell ISE(powershell_ise.exe)。其他應(yīng)用程序也能承載PowerShell引擎,那些應(yīng)用程序可以用不同的方式處理Write-Host輸出。表示只有知道哪個宿主應(yīng)用被使用并且這個應(yīng)用如何處理Write-Host輸出,才會使用Write-Host。Write-Output也能寫到標(biāo)準(zhǔn)輸出流。與Write-Host不接受輸入對象不同,Write-Output接受對象作為輸入。Write-Output的作用只是在管道中發(fā)送指定對象到下一個命令。如果該命令是管道中的最后一條命令,那么對象在控制臺上顯示。Write-Output適用于需要明確地指明寫到輸出的內(nèi)容的情況,如下例所示:get-process | write-output這里,發(fā)送Get-Process的輸出到Write-Output以表示正在寫輸出。使用變量時,Write-Output在顯示輸出時也很有用??紤]下面的例子:$p = get-process; $p這里,創(chuàng)建了$p變量以存儲進程對象,然后把那些對象寫到輸出。要明確表示寫操作,可以修改先前的代碼,如下例所示:$p = get-process; write-output $p2. 使用其他輸出流要使用除標(biāo)準(zhǔn)輸出流以外的輸出流,可以使用下面的cmdlet。l Write-Debug 從一個腳本或命令將調(diào)試信息寫到控制臺。默認(rèn)情況下,調(diào)試信息不顯示在控制臺中,也不引起執(zhí)行的中止。使用-Debug參數(shù)(所有cmdlet的常用參數(shù))或者$DebugPreference變量顯示調(diào)試消息。-Debug參數(shù)覆蓋當(dāng)前命令的$DebugPreference變量值。Write-Debug -message DebugMessagel Write-Error 從一個腳本或命令將錯誤信息寫到控制臺。默認(rèn)情況下,錯誤信息不顯示在控制臺中,也不引起執(zhí)行的中止。使用-ErrorAction參數(shù)(所有cmdlet的常用參數(shù))或者$ErrorActionPreference變量可以修改它的行為。-ErrorAction參數(shù)覆蓋當(dāng)前命令的$ErrorActionPreference變量值。Write-Error -ErrorRecord ErrorRecord AddtlParamsWrite-Error -TargetObject Object -Message String-ErrorId String AddtlParamsWrite-Error -Exception Exception -Category String AddtlParamsAddtlParams=-CategoryTargetName String -CategoryTargetType String-CategoryReason String -CategoryActivity String-RecommendedAction Stringl Write-Warning 從一個腳本或命令將警告信息寫到控制臺。默認(rèn)情況下,警告信息不顯示在控制臺中,也不引起執(zhí)行的中止。使用-WarningAction參數(shù)(所有cmdlet的常用參數(shù))或者$WarningPreference變量可以修改它的行為。-WarningAction參數(shù)覆蓋當(dāng)前命令的$WarningPreference變量值。Write-Warning -message WarningMessagel Write-Verbose 從一個腳本或

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論