PowerShell中格式化命令和輸出命令

今天, 我將爲您介紹如何使用格式化和輸出命令. 在PowerShell中,負責進行格式化和輸出的是三類cmdlet。他們分別是:Format-*、Out-*和 Write-* 。顧名思義,Format-* 主要是用來對信息進行格式化操做,Out-*用於指定輸出設備,而 Write-* 爲 PowerShell 宿主(Host)輸出的更多有用信息提供了快捷訪問接口。app

咱們要將對象輸出到控制檯或打印機等位置前,咱們首先必須將對象格式化成爲字符串的形式。一個對象可能包含幾十種屬性信息,PowerShell的開發者已經考慮到咱們在平常使用時,不會使用一個對象的全部信息,所以默認狀況下只保留該對象上最主要的幾種屬性。讓咱們來看看進程對象默認會顯示哪些屬性。首先看看進程對象究竟有多少個屬性:
PS C:/> (Get-Process Idle | Get-Member -MemberType Property).Count
51
ide

在上面例子,首先使用Get-Process命令返回表示Idle進程的對象,並經過Get-Member命令返回該對象上全部屬性,最後咱們給出該對象的屬性個數(打印這些屬性太佔地方了,你能夠把Count去掉,檢查返回的結果)。讓咱們看看PowerShell默認狀況下會輸出哪些屬性吧:
PS C:/> Get-Process Idle
學習

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         16     0               0 Idle
編碼

正如前面所介紹的,PowerShell默認只會返回對象上一部分屬性信息,究竟顯示哪些屬性是經過定義在ETS系統中的信息決定的。spa

Format族包含了:Format-Custom、Format-List、Format-Table和Format-Wide四個命令。在大多數狀況下,Format-Table是PowerShell默認使用的格式器。Format-List的輸出相似上面輸出進程屬性的格式,每一個對象將會佔一行。一行內包括該對象的多個主要屬性,若是該屬性信息太長,PowerShell就會將該信息截斷。讓咱們看幾個管理PowerShell最經常使用的例子:
PS C:/> Get-EventLog -LogName 'Windows PowerShell' -Newest 10 | Format-Table
翻譯

   Index Time          Type        Source                 InstanceID Message
   ----- ----          ----        ------                 ---------- -------
    1029 五月 31 21:38 Information PowerShell                    400 Engine state is changed from None to Available....
    1028 五月 31 21:38 Information PowerShell                    400 Engine state is changed from None to Available....
    1027 五月 31 21:38 Information PowerShell                    600 Provider "Certificate" is Started. ...
    1026 五月 31 21:38 Information PowerShell                    600 Provider "Variable" is Started. ...
    1025 五月 31 21:38 Information PowerShell                    600 Provider "Registry" is Started. ...
    1024 五月 31 21:38 Information PowerShell                    600 Provider "Function" is Started. ...
    1023 五月 31 21:38 Information PowerShell                    600 Provider "FileSystem" is Started. ...
    1022 五月 31 21:38 Information PowerShell                    600 Provider "Environment" is Started. ...
    1021 五月 31 21:38 Information PowerShell                    600 Provider "Alias" is Started. ...
    1020 五月 31 15:43 Information PowerShell                    403 Engine state is changed from Available to Stopp...
日誌

這個例子顯示PowerShell最近10個日誌的日誌信息. Format-Table爲了保證每一個對象只輸出一行,只會輸出那些較重要的信息,通常對對象的檢索,使用Format-Table就是最好的辦法。code

其餘幾個命令, 您能夠參照PowerShell的幫助, 或我翻譯的幫助信息詳細學習.orm

看完了負責格式化對象輸出信息的cmdlet,咱們須要考慮該把這些信息輸出到什麼位置了。Out族包括了:Out-Default、Out-File、Out-Host、Out-Null、Out-Printer、Out-GridView和Out-String。
對象

Out-Host命令,就是將顯示結果返回給宿主程序,由宿主程序展示給使用者。Out-Default默認就是使用Out-Host進行輸出,可是根據PowerShell文檔的描述,Out-Default用來提供一種佔位符的特性,你能夠在腳本完成後,從新修改Out-Default來控制整個程序的輸出。

Out-Null的做用就是將輸出丟棄,在不少時候,若是咱們不關心命令的返回結果,而只關一條命令產生的某些影響時,咱們能夠將該命令的輸出經過管道發送給Out-Null。例如:
PS C:/> New-Item TestIt -Type dir


    Directory: Microsoft.PowerShell.Core/FileSystem::C:/


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         2007-9-16     21:10            TestIt


PS C:/> New-Item TestIt -Type dir | Out-Null
New-Item : Item with specified name C:/TestIt already exists.
At line:1 char:9
+ New-Item  <<<< TestIt -Type dir | Out-Null
PS C:/> Remove-Item TestIt
PS C:/> New-Item TestIt -Type dir | Out-Null
PS C:/>

咱們首先建立了TestIt的目錄,默認狀況下,New-Item返回新建立的目錄,該對象被輸出到控制檯上。咱們接下來試圖再建立一次該目錄,並將輸出信息丟棄。然而,因爲該目錄已經存在,所以建立失敗,命令給出了錯誤提示。這裏咱們須要注意錯誤信息並無被丟棄!接下來咱們刪除目錄TestIt,再次執行建立命令,此次,屏幕上沒有顯示建立的目錄信息。

最後,咱們來看看Out-File。不少時候,咱們須要將某種編碼的字符串存儲爲其餘編碼形式。咱們能夠簡單的使用Out-File的參數Encoding來設置輸出信息的編碼格式。這些編碼包括了:「Unicode」、「UTF7」、「UTF8」、「UTF32」、「ASCII」等等。有時候,咱們還會遇到若是將信息寫入文件中。若是該文件已經存在,咱們可能但願信息繼續追加到文件的末尾,或者當文件已經存在時,咱們但願覆蓋這個文件。經過參數Append,咱們能夠告訴Out-File到底是覆蓋文件,仍是在文件的末尾進行追加。讓咱們看看簡單的例子: PS C:/> "我是第一行!" | Out-File append.txt PS C:/> Get-Content C:/append.txt 我是第一行! PS C:/> "我是第二行,可是我要試試覆蓋第一個行!!" | Out-File append.txt PS C:/> Get-Content C:/append.txt 我是第二行,可是我要試試覆蓋第一個行!! PS C:/> "我是第三行,讓我跟在第二行後面吧!!!" | Out-File -Append append.txt PS C:/> Get-Content C:/append.txt 我是第二行,可是我要試試覆蓋第一個行!! 我是第三行,讓我跟在第二行後面吧!!!

相關文章
相關標籤/搜索