當我執行“Get-Module -ListAvailable”時,powershell 將列印 169 個模塊。例如:
Directory: C:\Program Files (x86)\Microsoft SQL Server\150\Tools\PowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 15.0 SQLPS {Backup-SqlDatabase, Save-SqlMigrationReport, Invoke-PolicyEvaluation, Resto...
Directory: C:\Users\user\Documents\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 3.0.1 DotNetVersionLister Get-STDotNetVersion
Script 1.4.7 PackageManagement {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Script 2.2.5 PowerShellGet {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability...}
Script 2.2.16 VSSetup {Get-VSSetupInstance, Select-VSSetupInstance}
Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.3.1 Configuration {Import-Configuration, Export-Configuration, Get-StoragePath, Add-MetadataCo...
當我在一個陣列中捕獲它時:“$m = Get-Module -ListAvailable”它看起來只是一個簡單的陣列,但它也在這些部分中列印。
這是怎么做的?
PSModuleInfo 物件上似乎甚至沒有“目錄”屬性。
uj5u.com熱心網友回復:
Powershell 有自己的格式化引擎。無論何時使用該 cmdlet,都會輸出一個System.Management.Automation.PSModuleInfo物件串列。
在列印物件“原始”之前,Powershell 檢查是否有可用于該型別的預定義格式,如果有,應用它。你看到的是這種轉變的結果。
在 PS 5.1 之前,這是通過格式化組態檔完成的,定義為 *.ps1xml 檔案。從 PS6.0 和更新版本開始,預定義格式現在直接包含在源代碼中,但您仍然可以根據需要創建其他格式檔案。
您可以使用Get-FormatDatacmdlet查看加載的格式型別。
如果您特別對Get-Modulecmdlet感興趣,請查看(Get-FormatData -TypeName System.Management.Automation.PSModuleInfo).FormatViewDefinition。你會看到這樣的事情:
Name Control
---- -------
Module System.Management.Automation.TableControl
Module System.Management.Automation.WideControl
Module System.Management.Automation.ListControl
這意味著該型別的任何物件都有關于它應該輸出其物件的方式的特殊說明。在這種情況下,它包括按路徑分組并顯示特定列(模塊型別、版本、名稱、匯出命令)。Powershell 并沒有選擇自己顯示這些屬性,而是從預定義的型別中獲取有關顯示內容的說明。
在PSModuleInfo型別的情況下,我們可以看到該型別有 3 個自定義視圖。一種用于表格視圖(默認顯示),一種用于串列和寬,指示使用Format-List&時顯示的內容Format-Wide。
來自 MS 檔案
命令(cmdlet、函式和腳本)回傳的物件的顯示格式是使用格式化檔案(format.ps1xml 檔案)定義的。其中一些檔案由 PowerShell 提供,用于定義 PowerShell 提供的命令回傳的那些物件的顯示格式,例如 Get-Process cmdlet 回傳的 System.Diagnostics.Process 物件。但是,您也可以創建自己的自定義格式檔案來覆寫默認顯示格式,或者您可以撰寫自定義格式檔案來定義由您自己的命令回傳的物件的顯示。
PowerShell 使用這些格式檔案中的資料來確定顯示的內容以及顯示資料的格式。顯示的資料可以包括物件的屬性或腳本的值。
您可以創建自己的檔案 (*.ps1xml) 并將它們包含在您的模塊中或將它們加載到您的會話中以修改輸出的顯示方式。
您還可以通過定義默認顯示集(也就是應該顯示哪些屬性)來為函式的輸出添加格式。
以這個簡單的函式為例:
Function Get-EmployeesInfos() {
$Output = @(
[PSCustomObject]@{
FirstName = 'RObert'
LastName = 'Samson'
SocialSecurityNumber = '123 344 555'
Age = '32'
Salary = '100000'
},
[PSCustomObject]@{
FirstName = 'Pablo'
LastName = 'Morrison'
SocialSecurityNumber = '123 345 555'
Age = '22'
Salary = '10000'
}
)
# Default display set
$defaultDisplaySet = 'FirstName', 'LastName'
$defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet', [string[]]$defaultDisplaySet)
$Output | Add-Member MemberSet PSStandardMembers ([System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)) -Force
return $Output
return $Output
}
如果沒有任何默認顯示集,您將獲得包含所有列出屬性的標準輸出。

添加默認顯示集后,這是新的輸出。

兩個輸出都包含相同的資訊,但控制臺應用了特殊格式以僅顯示最重要、最有用等的內容...
您可以使用格式化視圖來:
- 著色輸出
- 創建樹
- 根據條件改變輸出
- 添加虛擬屬性
- 定義列寬
- 定義顯示的列標題
- 等等...
參考:
格式化檔案概述
4Sysops - 使用 Format.ps1xml 檔案在 Powershell 中格式化物件輸出
更新格式資料
uj5u.com熱心網友回復:
以組Get-Module顯示結果的原因是因為每當 PowerShell 向用戶顯示物件時,這都是物件的默認格式。這不是cmdlet的特定功能。ModuleGet-Module
這通常是一種方便的工具,因為您可以使用諸如Sort-Object和 之Where-Object類的cmdlet對結果進行排序和過濾,然后將結果按組顯示。
在以下示例中,結果被過濾,然后按組顯示。重要的是,既不知道Get-Module也不Where-Object知道最終結果將分組顯示;他們只是處理物件。
PS> Get-Module -ListAvailable | Where-Object Name -Match Read
Directory: C:\program files\powershell\7\Modules
ModuleType Version PreRelease Name
---------- ------- ---------- ----
Script 2.1.0 PSReadLine ...
Binary 2.0.3 ThreadJob ...
Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version PreRelease Name
---------- ------- ---------- ----
Script 2.0.0 beta2 PSReadline ...
通過查看GitHub 上模塊的默認格式代碼,您可以了解 PowerShell 在此特定情況下的操作。相關部分是GroupByScriptBlock呼叫(通過較小的重新格式化以減少線路長度):
yield return new FormatViewDefinition("Module",
TableControl.Create()
.GroupByScriptBlock(@"
Split-Path -Parent $_.Path | ForEach-Object {
if([Version]::TryParse((Split-Path $_ -Leaf), [ref]$null)) {
Split-Path -Parent $_
} else {
$_
}
} | Split-Path -Parent", customControl: sharedControls[0])
.AddHeader(Alignment.Left, width: 10)
...
當 PowerShell 使用默認格式向用戶顯示模塊物件陣列時,它將GroupByScriptBlock首先在每個物件上運行腳本塊以計算出分組。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/366197.html
標籤:电源外壳
