佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Windows Powershell擴(kuò)展類型系統(tǒng)

Windows Powershell擴(kuò)展類型系統(tǒng)

熱門標(biāo)簽:鐵路電話系統(tǒng) AI電銷 Linux服務(wù)器 地方門戶網(wǎng)站 呼叫中心市場需求 百度競價排名 服務(wù)外包 網(wǎng)站排名優(yōu)化

Powershell一個最吸引人的功能是它能夠?qū)⑷魏螌ο筠D(zhuǎn)換成文本,我們已經(jīng)使用過將對象屬性以不同的版式轉(zhuǎn)換成文本,并且輸出。更令人驚奇的是Powershell會把最重要最能代表這個對象本質(zhì)的信息輸出。一個對象有很多屬性,為什么它單單就輸出那幾個屬性呢?
如果使用:

復(fù)制代碼 代碼如下:

Dir | Format-Table * -wrap
PSP PSP PSC PSD PSP PSI Bas Mod Nam Par Exi Roo Ful Ext Cre Cre Las La La La At
ath are hil riv rov sCo eNa e   e   ent sts t   lNa ens ati ati tAc st st st tr
    ntP dNa e   ide nta me                      me  ion onT onT ces Ac Wr Wr ib
    ath me      r   ine                                 ime ime sTi ce it it ut
                      r                                     Utc me  ss eT eT es
                                                                    Ti im im
                                                                    me e  eU
                                                                    Ut    tc
                                                                    c
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- -- -- -- --
Mic Mic ABC C   Mic Tru ABC d-- ABC Pow Tru C: C:     201 201 201 20 20 20 Di
ros ros         ros   e     --      ers   e     Pow     1/1 1/1 1/1 11 11 11 re
oft oft         oft                 hel         ers     2/1 2/1 2/1 /1 /1 /1 ct
.Po .Po         .Po                 l           hel     9 1 9 9 9 1 2/ 2/ 2/ or
wer wer         wer                             lA     7:0 :05 7:0 19 19 19  y
She She         She                             BC      5:5 :55 5:5  9  1  9
ll. ll.         ll.                                     5       5   :0 7: :0
Cor Cor         Cor                                                 5: 05 5:
eF eF         eF                                                 55 :5 55
ile ile         ile                                                    5
Sys Sys         Sys
tem tem         tem
::C ::C
 
owe owe
rsh rsh
ell ell
AB
C

Powershell會最大限度的輸出每個屬性,但是這樣的輸出基本上沒有意義,不利于用戶閱讀。那到底是什么讓Powershell默認(rèn)只顯示此屬性不顯示彼屬性呢?是“擴(kuò)展類型系統(tǒng)”Extended Type System (ETS),ETS會對管道中對象轉(zhuǎn)換成文本的機(jī)制進(jìn)行宏觀調(diào)控。
ETS由兩部分組成,一部分控制對象的版式,一部分控制對象的屬性,今天主要關(guān)心第一部分。

文本轉(zhuǎn)換不可逆

在管道中將對象結(jié)果轉(zhuǎn)換成文本后,不能再將文本轉(zhuǎn)換成對象,因?yàn)镋TS不能處理文本。
如果通過ConvertTo-String將目錄列表的轉(zhuǎn)換成String后,使用Format-Table和Format-List這些命令就會無效。

復(fù)制代碼 代碼如下:

PS C:Powershell> $text= dir | Out-String
PS C:Powershell> $text

    目錄: C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/12/19     17:05            ABC
d----        2011/12/19     17:06            ABD
d----        2011/12/19     17:06            ABE

PS C:Powershell> $text | Format-Table

    目錄: C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/12/19     17:05            ABC
d----        2011/12/19     17:06            ABD
d----        2011/12/19     17:06            ABE

PS C:Powershell> $text | Format-List

    目錄: C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/12/19     17:05            ABC
d----        2011/12/19     17:06            ABD
d----        2011/12/19     17:06            ABE

選擇屬性

在顯示對象結(jié)果時如果使用了像Format-Table這樣的命令,ETS也不會起作用,因?yàn)镕ormat-Table將每個屬性的值轉(zhuǎn)換成了文本。所以有的時候,顯示那些屬性最好自己指定清楚,不要把生殺大權(quán)交給ETS。

復(fù)制代碼 代碼如下:

PS C:Powershell> dir | Format-Table Mode,FullName

Mode  FullName
----  --------
d---- C:PowershellABC
d---- C:PowershellABD
d---- C:PowershellABE
d---- C:Powershellmyscript
-a--- C:Powershella.ccs
-a--- C:Powershella.csv
-a--- C:Powershella.html
-a--- C:Powershella.txt
-a--- C:Powershellalias

已知對象格式化

如果使用了格式化的命令,但是沒有指定具體的屬性(如: dir | Format-Table)。ETS將會首次大展拳腳,它會決定那些對象應(yīng)當(dāng)顯示,那些屬性應(yīng)當(dāng)被自動選擇。ETS在做這些工作之前,首先應(yīng)當(dāng)弄清楚,那些對象能夠被轉(zhuǎn)換成文本。

復(fù)制代碼 代碼如下:

PS C:Powershell> (dir)[0].GetType().FullName
System.IO.DirectoryInfo

Dir 返回一個System.IO.DirectoryInfo對象,并且包含了這個對象里面的System.IO.FileInfo對象和System.IO.DirectoryInfo子對象。這樣ETS就可以去檢查自己的內(nèi)部記錄,通過內(nèi)部記錄的配置,將對象轉(zhuǎn)換成文本。這些內(nèi)部記錄為XML文件,擴(kuò)展名為“.ps1xml”

復(fù)制代碼 代碼如下:

PS C:Powershell> dir $PSHOME*format.ps1xml

    目錄: C:WindowsSystem32WindowsPowerShellv1.0

Mode         LastWriteTime Length Name
----         ------------- ------ ----
-a---  2009/6/11      5:24  27338 Certificate.format.ps1xml
-a---  2009/6/11      5:24  27106 Diagnostics.Format.ps1xml
-a---  2009/6/11      5:24  72654 DotNetTypes.format.ps1xml
-a---  2009/6/11      5:24  24857 FileSystem.format.ps1xml
-a---  2009/6/11      5:24 257847 Help.format.ps1xml
-a---  2009/6/11      5:24  89703 PowerShellCore.format.ps1xml
-a---  2009/6/11      5:24  18612 PowerShellTrace.format.ps1xml
-a---  2009/6/11      5:24  20120 Registry.format.ps1xml
-a---  2009/6/11      5:24  24498 WSMan.Format.ps1xml

每一個對象詳細(xì)地被定義在這些XML文件中,定義包括那些對象屬性支持轉(zhuǎn)換成文本,那些對象應(yīng)當(dāng)默認(rèn)顯示在列表或者表格中。
有一點(diǎn)之前說過,對于一行上面的混合命令“ Get-Process ; dir”ETS不支持,要想避免最好的方式是每個命令明確地指定版式。

PS C:Powershell> Get-Process | Format-Table ; dir | Format-Table

未知對象格式化

在ps1xml中定義過的對象屬于已知對象,那些未知對象ETS應(yīng)當(dāng)怎樣處理呢?對于未知對象,ETS遵循一個規(guī)律:
如果對象的屬性少于5個則表格顯示,否則列表顯示。
下面的例子創(chuàng)建一個對象,并向?qū)ο笾兄饌€增加屬性。

復(fù)制代碼 代碼如下:

PS C:Powershell> $obj=New-Object PSObject
PS C:Powershell> Add-Member -Name A -Value 1 -InputObject $obj
MemberType: PS C:Powershell>
PS C:Powershell> Add-Member -MemberType NoteProperty -Name "A" -Value "1" -InputObject $obj
PS C:Powershell> $obj

A
-
1

PS C:Powershell> Add-Member -MemberType NoteProperty -Name "B" -Value "2" -InputObject $obj
PS C:Powershell> Add-Member -MemberType NoteProperty -Name "C" -Value "3" -InputObject $obj
PS C:Powershell> Add-Member -MemberType NoteProperty -Name "D" -Value "4" -InputObject $obj
PS C:Powershell> $obj

A B C D
- - - -
1 2 3 4

PS C:Powershell> Add-Member -MemberType NoteProperty -Name "E" -Value "5" -InputObject $obj
PS C:Powershell> $obj

A : 1
B : 2
C : 3
D : 4
E : 5

應(yīng)急模式

如果ETS從輸出中發(fā)現(xiàn)臨界狀態(tài),會自動切換到列表顯示。例如“Get-Process; Dir”,ETS正在以表格形式輸出Process對象,但是突然碰到一個FileInfo對象,就會直接切換到列表模式,輸出其它類型的對象。

隱藏列

如果碰到未知的對象,ETS會試著從管道輸出的第一個結(jié)果尋找線索,這樣可能導(dǎo)致一個奇怪的現(xiàn)象。ETS會根據(jù)未知對象的第一個結(jié)果,來判斷屬性,但第一條結(jié)果的屬性并不總會輸出??赡茉倥龅桨鄬傩缘膶ο髸r,當(dāng)前選擇的屬性信息就可能會被抑制。
接下來的例子演示那些信息會被抑制,Get-Process 返回正在運(yùn)行的所有進(jìn)程,然后通過StartTime進(jìn)行排序,最輸出每個進(jìn)程的名稱和開啟時間:

復(fù)制代碼 代碼如下:

PS C:Windowssystem32> Get-Process | Sort-Object StartTime | Select-Object Name
,StartTime
Sort-Object : 獲取“StartTime”時發(fā)生異常:“拒絕訪問?!?br /> 所在位置 行:1 字符: 26
+ Get-Process | Sort-Object StartTime | Select-Object Name,StartTime
+ CategoryInfo : InvalidResult: (System.Diagnostics.Process (audi
odg):PSObject) [Sort-Object], GetValueInvocationException
+ FullyQualifiedErrorId : ExpressionEvaluation,Microsoft.PowerShell.Comman
ds.SortObjectCommand

當(dāng)執(zhí)行上面的命令行時,會收到許多錯誤信息。這些錯誤信息并不是來源于命令,而是可能因?yàn)楫?dāng)前控制臺沒有管理員權(quán)限,某些系統(tǒng)進(jìn)程拒絕訪問。輸出的進(jìn)程中可能有一部分進(jìn)程只有進(jìn)程名(Name),沒有開啟時間(StartTime),開啟時間被抑制了。
使用Select-Object,會刪除對象的某些屬性,但是對象本身的屬性是不能刪除的,所以ETS會在管道中重新生成一個對象,類型為:System.Management.Automation.PSCustomObject。

復(fù)制代碼 代碼如下:

PS C:Powershell> Get-Process | foreach {$_.gettype().fullname} | select -f 1
System.Diagnostics.Process
PS C:Powershell> (Get-Process | foreach {$_.gettype().fullname} | select -f 1 Name ).getType().fullname
System.Management.Automation.PSCustomObject

因?yàn)镻SCustomObject在ETS配置中沒有記錄,就會輸出全部屬性。管道結(jié)果之前根據(jù)StartTime升序排列過,所以前面的進(jìn)程由于權(quán)限問題沒有StartTime。

擴(kuò)充ETS

ETS配置中包含的類型對象會以最佳的方式轉(zhuǎn)換成文本。但是對于未知對象就表現(xiàn)不完美了,表現(xiàn)不完美并不代表束手無策。幸運(yùn)的是可以通過擴(kuò)充ETS讓ETS以最佳的方式處理新對象。
擴(kuò)充ETS的第一步是確定待擴(kuò)充對象類型。我們可能經(jīng)常通過Get-WmiObject 來獲取WMI服務(wù)。但是不太喜歡Powershell對于它的默認(rèn)輸出,就可以擴(kuò)充ETS了。

復(fù)制代碼 代碼如下:

PS C:Powershell> Get-WmiObject Win32_Processor

__GENUS                     : 2
__CLASS                     : Win32_Processor
__SUPERCLASS                : CIM_Processor
__DYNASTY                   : CIM_ManagedSystemElement
__RELPATH                   : Win32_Processor.DeviceID="CPU0"
__PROPERTY_COUNT            : 48
__DERIVATION                : {CIM_Processor, CIM_LogicalDevice, CIM_LogicalEle

首先確定命令返回結(jié)果的對象類型

復(fù)制代碼 代碼如下:

PS C:Powershell> $object = Get-WmiObject Win32_Processor | Select-Object -first 1
PS C:Powershell> $object.GetType().FullName
System.Management.ManagementObject

發(fā)現(xiàn)目標(biāo)類型為:System.Management.ManagementObject
接下來創(chuàng)建一個配置文件:

復(fù)制代碼 代碼如下:

configuration>
viewdefinitions>
view>
name>CustomView/name>
viewselectedby>
typename>System.Management.ManagementObject/typename>
/viewselectedby>
tablecontrol>
tableheaders>
tablecolumnheader>
label>Name/label>
width>12/width>
/tablecolumnheader>
tablecolumnheader>
label>Description/label>
width>30/width>
/tablecolumnheader>
tablecolumnheader>
label>ID/label>
/tablecolumnheader>
/tableheaders>
tablerowentries>
tablerowentry>
tablecolumnitems>
tablecolumnitem>
propertyname>DeviceID/propertyname>
/tablecolumnitem>
tablecolumnitem>
propertyname>Description/propertyname>
/tablecolumnitem>
tablecolumnitem>
propertyname>ProcessorID/propertyname>
/tablecolumnitem>
/tablecolumnitems>
/tablerowentry>
/tablerowentries>
/tablecontrol>
/view>
/viewdefinitions>
/configuration>

將文件保存為Win32_Processor.format.ps1xml,然后使用命令Update-FormatData把它加載進(jìn)ETS,會立即生效

復(fù)制代碼 代碼如下:

PS C:Powershell> Update-FormatData .Win32_Processor.format.ps1xml
PS C:Powershell> Get-WmiObject win32_processor

Name         Description                    ID
----         -----------                    --
CPU0         x64 Family 6 Model 15 Stepp... BFEBFBFF000006FD

但是這樣的定義可能有個缺點(diǎn),當(dāng)我們獲取其它WMI對象時,也會根據(jù)我們定義的規(guī)則顯示。

復(fù)制代碼 代碼如下:

PS C:Powershell> Get-WmiObject Win32_Share

Name         Description                    ID
----         -----------                    --
             Remote Admin
             Default share
             HP LaserJet P2050 Series PCL6
             Remote IPC
             Printer Drivers

出現(xiàn)上面的情況,是因?yàn)閃MI的所有對象都會以System.Management.ManagementObject類型返回。因此ETS沒有出錯,罪魁禍?zhǔn)资荳MI這個特殊的類型。所以擴(kuò)充ETS時一定要細(xì)化一個具體的類型。事實(shí)上WMI對象有一個PSTypeNames屬性,通過它就可以找到更具體的類型。

復(fù)制代碼 代碼如下:

PS C:Powershell> $object = Get-WmiObject Win32_Processor | Select-Object -first1
PS C:Powershell> $object.PSTypeNames
System.Management.ManagementObject#rootcimv2Win32_Processor
System.Management.ManagementObject
System.Management.ManagementBaseObject
System.ComponentModel.Component
System.MarshalByRefObject
System.Object

上面顯示了WMI對象類型的繼承層次。所以我們需求中要擴(kuò)展的對象類型應(yīng)該為:System.Management.ManagementObject#rootcimv2Win32_Processor

所以應(yīng)當(dāng)修改配置文件,重新加載更新。更新時會有一條異常
Update-FormatData : 加載格式數(shù)據(jù)文件時出錯:
Microsoft.PowerShell,C:PowershellWin32_Processor.format.ps1xml: 文件被跳過,
因?yàn)樵撐募言凇癕icrosoft.PowerShell”中出現(xiàn)過。

異??梢院雎?,然后重新測試。

復(fù)制代碼 代碼如下:

PS C:Powershell> Get-WmiObject win32_Processor

Name         Description                    ID
----         -----------                    --
CPU0         x64 Family 6 Model 15 Stepp... BFEBFBFF000006FD

PS C:Powershell> Get-WmiObject win32_share

Name                       Path                       Description
----                       ----                       -----------
ADMIN$                C:Windows          Remote Admin
C$                         C:                        Default share

這樣ETS的擴(kuò)充只對Win32_Processor有效了。不會影響到其他父類型對象。

您可能感興趣的文章:
  • Windows Powershell分析和比較管道結(jié)果
  • Windows Powershell導(dǎo)出管道結(jié)果
  • Windows Powershell對象=屬性+方法
  • Windows Powershell屬性:描述對象是什么
  • Windows Powershell方法(對象能做什么)
  • Windows Powershell調(diào)用靜態(tài)方法

標(biāo)簽:蘭州 衡水 黃山 銅川 崇左 湘潭 仙桃 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Windows Powershell擴(kuò)展類型系統(tǒng)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    赤城县| 东山县| 抚顺市| 日照市| 双流县| 河曲县| 绥德县| 商河县| 海淀区| 日照市| 玉屏| 古田县| 勐海县| 二连浩特市| 壶关县| 开原市| 海伦市| 莲花县| 信丰县| 安义县| 福鼎市| 张家界市| 天门市| 金门县| 津南区| 乃东县| 北安市| 聂荣县| 南川市| 获嘉县| 连山| 兖州市| 新绛县| 自治县| 静安区| 石泉县| 淅川县| 独山县| 西青区| 台南县| 大石桥市|