亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PowerShell > 正文

Windows Powershell擴展類型系統

2020-03-26 19:16:14
字體:
來源:轉載
供稿:網友

Powershell一個最吸引人的功能是它能夠將任何對象轉換成文本,我們已經使用過將對象屬性以不同的版式轉換成文本,并且輸出。更令人驚奇的是Powershell會把最重要最能代表這個對象本質的信息輸出。一個對象有很多屬性,為什么它單單就輸出那幾個屬性呢?
如果使用:

 

復制代碼 代碼如下:

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默認只顯示此屬性不顯示彼屬性呢?是“擴展類型系統”Extended Type System (ETS),ETS會對管道中對象轉換成文本的機制進行宏觀調控。
ETS由兩部分組成,一部分控制對象的版式,一部分控制對象的屬性,今天主要關心第一部分。

文本轉換不可逆

在管道中將對象結果轉換成文本后,不能再將文本轉換成對象,因為ETS不能處理文本。
如果通過ConvertTo-String將目錄列表的轉換成String后,使用Format-Table和Format-List這些命令就會無效。

 

復制代碼 代碼如下:

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

 

選擇屬性

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

 

復制代碼 代碼如下:

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將會首次大展拳腳,它會決定那些對象應當顯示,那些屬性應當被自動選擇。ETS在做這些工作之前,首先應當弄清楚,那些對象能夠被轉換成文本。

 

復制代碼 代碼如下:

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

 

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

 

復制代碼 代碼如下:

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

 

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

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

未知對象格式化

在ps1xml中定義過的對象屬于已知對象,那些未知對象ETS應當怎樣處理呢?對于未知對象,ETS遵循一個規律:
如果對象的屬性少于5個則表格顯示,否則列表顯示。
下面的例子創建一個對象,并向對象中逐個增加屬性。

 

復制代碼 代碼如下:

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

 

應急模式

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

隱藏列

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

 

復制代碼 代碼如下:

PS C:Windowssystem32> Get-Process | Sort-Object StartTime | Select-Object Name
,StartTime
Sort-Object : 獲取“StartTime”時發生異常:“拒絕訪問。”
所在位置 行: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

 

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

 

復制代碼 代碼如下:

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

 

因為PSCustomObject在ETS配置中沒有記錄,就會輸出全部屬性。管道結果之前根據StartTime升序排列過,所以前面的進程由于權限問題沒有StartTime。

擴充ETS

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

 

復制代碼 代碼如下:

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

 

首先確定命令返回結果的對象類型

 

復制代碼 代碼如下:

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

 

發現目標類型為:System.Management.ManagementObject
接下來創建一個配置文件:

 

復制代碼 代碼如下:

<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把它加載進ETS,會立即生效

 

復制代碼 代碼如下:

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

 

但是這樣的定義可能有個缺點,當我們獲取其它WMI對象時,也會根據我們定義的規則顯示。

 

復制代碼 代碼如下:

PS C:Powershell> Get-WmiObject Win32_Share

 

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

 

出現上面的情況,是因為WMI的所有對象都會以System.Management.ManagementObject類型返回。因此ETS沒有出錯,罪魁禍首是WMI這個特殊的類型。所以擴充ETS時一定要細化一個具體的類型。事實上WMI對象有一個PSTypeNames屬性,通過它就可以找到更具體的類型。

 

復制代碼 代碼如下:

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對象類型的繼承層次。所以我們需求中要擴展的對象類型應該為:System.Management.ManagementObject#rootcimv2Win32_Processor

所以應當修改配置文件,重新加載更新。更新時會有一條異常
Update-FormatData : 加載格式數據文件時出錯:
Microsoft.PowerShell,C:PowershellWin32_Processor.format.ps1xml: 文件被跳過,
因為該文件已在“Microsoft.PowerShell”中出現過。

異常可以忽略,然后重新測試。

 

復制代碼 代碼如下:

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的擴充只對Win32_Processor有效了。不會影響到其他父類型對象。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线日本国产| 精品香蕉在线观看视频一| 久热精品视频在线观看| 精品视频一区在线视频| 精品国产91久久久久久老师| 久久久天堂国产精品女人| 欧美电影免费观看电视剧大全| 在线成人中文字幕| 成人免费视频在线观看超级碰| 色小说视频一区| 国产精品久久久av久久久| 亚洲国产精品热久久| 亚洲午夜精品久久久久久性色| 亚洲精品v天堂中文字幕| 亚洲男人天堂久| 成人国产精品久久久久久亚洲| 欧美国产日韩视频| 日本欧美黄网站| 欧美理论电影在线观看| 亚洲理论在线a中文字幕| 亚洲精品综合久久中文字幕| 亚洲欧美国产精品| 国产一区二区色| 欧美亚洲在线观看| 欧美日韩精品在线视频| 日韩欧美在线视频观看| 欧美日韩中文在线| 成人h视频在线观看播放| 精品视频久久久久久| 欧美日韩在线视频首页| 97成人在线视频| 57pao国产成人免费| 日韩电影中文字幕一区| 欧美性色视频在线| 欧美成在线观看| 久久久久久久久久久人体| 亚洲综合成人婷婷小说| 欧美视频二区36p| 国产欧美日韩中文字幕在线| 日韩高清电影好看的电视剧电影| 91在线观看免费| 中文字幕在线视频日韩| 美女国内精品自产拍在线播放| 国产成人鲁鲁免费视频a| 中文字幕精品视频| 久久综合伊人77777尤物| 中文字幕成人精品久久不卡| 国产精品久久久久久久久久99| 日韩小视频在线| 国产精品久久久久av| 国产剧情久久久久久| 国产小视频91| 6080yy精品一区二区三区| 国产脚交av在线一区二区| 欧美一区二区视频97| 精品在线观看国产| 秋霞av国产精品一区| 久久人人爽国产| 欧美成人免费视频| 成人h片在线播放免费网站| 欧美性生交大片免网| 日韩黄色高清视频| 亚洲free性xxxx护士白浆| 久久中文字幕在线| 亚州欧美日韩中文视频| 国产日韩中文字幕在线| 国内精品久久久久影院优| 91经典在线视频| 亚洲高清在线观看| 亚洲天堂av在线免费观看| 国产精品一区二区av影院萌芽| 米奇精品一区二区三区在线观看| 日本亚洲欧美成人| 91香蕉亚洲精品| 国产综合福利在线| 色吧影院999| 亚洲精品国产成人| 国产91在线高潮白浆在线观看| 欧美亚洲激情在线| 日韩电影免费观看在线观看| 久久99热这里只有精品国产| 欧美韩日一区二区| 日韩激情片免费| 日韩美女写真福利在线观看| 日韩av影片在线观看| 久久久噜噜噜久久久| 国产伊人精品在线| 成人欧美一区二区三区在线| 精品久久久一区二区| 国产97在线|亚洲| 岛国精品视频在线播放| 日韩电影中文字幕在线| 亚洲精品v欧美精品v日韩精品| 亚洲精品成人久久| 欧美黄色性视频| 俺也去精品视频在线观看| 亚洲精品日韩丝袜精品| 亚洲综合精品伊人久久| 国产精品高精视频免费| 亚洲欧美国产精品| 国产精品成av人在线视午夜片| 国产精品视频久| 欧美日韩一区二区免费在线观看| 亚洲a成v人在线观看| 国产mv久久久| 夜夜嗨av色综合久久久综合网| 日韩久久午夜影院| 992tv成人免费视频| 成人在线视频网| 欧美在线精品免播放器视频| 久久久久久噜噜噜久久久精品| 国产精品成人一区二区三区吃奶| 亚洲视频在线看| 日韩精品免费在线视频| 国产成+人+综合+亚洲欧美丁香花| 亚洲国产精久久久久久| 日韩美女av在线| 色综合91久久精品中文字幕| 俺去了亚洲欧美日韩| 欧美裸身视频免费观看| 日韩欧美精品中文字幕| 久久人体大胆视频| 久久国产精品久久久久久久久久| 91精品国产亚洲| 国产精品美女久久| 91国在线精品国内播放| 国产精品影院在线观看| 国产视频精品va久久久久久| 亚洲国产日韩欧美在线图片| 精品久久久久久久久久久久| 日韩中文字在线| 欧美性xxxxx极品| 欧美国产欧美亚洲国产日韩mv天天看完整| 91人人爽人人爽人人精88v| 色偷偷偷综合中文字幕;dd| 91高清免费在线观看| www亚洲精品| 亚洲另类图片色| 国产精品永久免费在线| 在线观看欧美视频| 在线亚洲午夜片av大片| 亚洲二区中文字幕| 亚洲一区二区三区在线视频| 91精品国产91久久久久久久久| 成人午夜小视频| 狠狠色狠狠色综合日日小说| 欧美精品久久久久久久久| 在线观看精品国产视频| 日韩精品日韩在线观看| 国产欧美一区二区| 亚洲国产精品成人一区二区| 97碰碰碰免费色视频| 在线观看中文字幕亚洲| 在线视频一区二区| 亚洲一二三在线| 日韩av网址在线| 日韩美女av在线| 国产精品www网站| 韩国三级电影久久久久久| 国产精品私拍pans大尺度在线| 久久精品人人做人人爽| 久久久久久成人| 欧美一区二区三区……| 97视频人免费观看|