递归函数中属性值的缩短输出



我想递归枚举所有WMI命名空间
我有这个功能:

function Get-WmiNamespace {
Param(
[parameter()]
[string]$Namespace = 'root',
[parameter()]
[string]$Locale = 'MS_409',
[parameter()]
[switch]$Recurse
)
Begin {
$WMIParams = @{
Namespace = $Namespace
Class = '__NAMESPACE'
Locale = $Locale
ErrorAction = 'SilentlyContinue'
}
}
Process {
Get-WmiObject @WMIParams |
Sort-Object -Property Name -CaseSensitive -Culture "en-US" |
ForEach-Object {
$WMIParams.Namespace = "{0}{1}" -f $_.__NAMESPACE, $_.Name
$object = [PSCustomObject] @{
Namespace = $WMIParams.Namespace
}
$object.PSTypeNames.Insert(0,'Wmi.Namespace.Name')
$object
if ($recurse) {
$PSBoundParameters.Namespace = $WMIParams.Namespace
Get-WMINamespace @PSBoundParameters
}
}
}
}

灵感来自:
[https://learn-powershell.net/2014/05/09/quick-hits-list-all-available-wmi-namespaces-using-powershell/]

我得到这个输出:

Namespace
---------
ROOTAppv
ROOTCIMV2
ROOTCIMV2mdm
ROOTCIMV2mdmdmmap
ROOTCIMV2mdmMS_405
ROOTCIMV2ms_405
ROOTCIMV2ms_409
ROOTCIMV2power
ROOTCIMV2powerm...
ROOTCIMV2powerm...
ROOTCIMV2Security
ROOTCIMV2Securit...
ROOTCIMV2Securit...
ROOTCIMV2Termina...
ROOTCIMV2Termina...
ROOTCli
ROOTCliMS_405
ROOTCliMS_409
ROOTDEFAULT
ROOTDEFAULTms_405
ROOTDEFAULTms_409
ROOTdirectory
ROOTdirectoryLDAP
ROOTdirectoryLDA...
ROOTdirectoryLDA...
ROOTHardware
ROOTHardwarems_405
ROOTHardwarems_409
ROOTIntel_ME
ROOTIntelNCS2
ROOTIntelNCS2ms_409
ROOTInterop
ROOTInteropms_405
ROOTInteropms_409
ROOTMicrosoft
ROOTMicrosoftHom...
ROOTMicrosoftpro...
ROOTMicrosoftSec...
ROOTMicrosoftUev
ROOTMicrosoftWin...
...
ROOTMicrosoftWin...
ROOTmsdtc
ROOTPEH
ROOTPolicy
ROOTPolicyms_405
ROOTPolicyms_409
ROOTRSOP
ROOTRSOPComputer
ROOTRSOPUser
ROOTSECURITY
ROOTSecurityCenter
ROOTSecurityCenter2
ROOTServiceModel
ROOTStandardCimv2
ROOTStandardCimv2...
ROOTStandardCimv2...
ROOTStandardCimv2...
ROOTStandardCimv2...
ROOTsubscription
ROOTsubscription...
ROOTsubscription...
ROOTWMI
ROOTWMIms_405
ROOTWMIms_409

命名空间名称被截断
我想原因是Name列的宽度是在函数Get-WmiNamespace的第一次迭代中根据最长值(ROOTSecurityCenter2(设置的。

它可以通过管道输出到Format-Table来固定,-AutoSize参数:

Namespace
---------
ROOTAppv
ROOTCIMV2
ROOTCIMV2mdm
ROOTCIMV2mdmdmmap
ROOTCIMV2mdmMS_405
ROOTCIMV2ms_405
ROOTCIMV2ms_409
ROOTCIMV2power
ROOTCIMV2powerms_405
ROOTCIMV2powerms_409
ROOTCIMV2Security
ROOTCIMV2SecurityMicrosoftTpm
ROOTCIMV2SecurityMicrosoftVolumeEncryption
ROOTCIMV2TerminalServices
ROOTCIMV2TerminalServicesms_405
ROOTCli
ROOTCliMS_405
ROOTCliMS_409
...

解决这种行为的最佳方法是什么?

整个名称存储在namespace属性中。如果您只想在命令输出中看到它,可以使用Select-Object中的-ExpandProperty

Get-WmiNamespace -Recurse | select -ExpandProperty namespace

此外,仅添加Sort即可显示全名

Get-WmiNamespace -Recurse | Sort

在不使用Expand和Doug is的情况下,您可以将其点起来,避免格式问题或试图更改函数本身等。好吧,至少对于单列来说是这样。

(Get-WmiNamespace -Recurse).Namespace
# Results
<#
(Get-WmiNamespace -Recurse).Namespace
ROOTAppv
...
ROOTCIMV2SecurityMicrosoftTpm
ROOTCIMV2SecurityMicrosoftVolumeEncryption
ROOTCIMV2TerminalServices
ROOTCIMV2TerminalServicesms_409
...
ROOTMicrosoftSqlServerComputerManagement15
ROOTMicrosoftSqlServerComputerManagement15MS_409
ROOTMicrosoftSqlServerServerEvents
ROOTMicrosoftSqlServerServerEventsMSSQLSERVER
...
ROOTMicrosoftWindowsDesiredStateConfigurationProxy
ROOTMicrosoftWindowsDesiredStateConfigurationProxyMS_409
...
#>

如果你说你想要,比如一个Linux列文件列表,那么还需要其他步骤。你可以使用Format Wide cmdlet来完成这项类似Linux的多列操作。

例如:

Get-ChildItem -Path 'C:Program Files' -Recurse | 
Format-Wide -Property Name 
Get-ChildItem -Path 'C:Program Files' -Recurse | 
Format-Wide -Property Name -Column 5

因此,要使该列表获得类似于表的视图,请执行相同的操作。

Get-WmiNamespace -Recurse | 
Format-Wide -Property namespace -Column 3
# Results
<#
ROOTAppv                                              ROOTaspnet                                            ROOTCIMV2                                           
ROOTCIMV2mdm                                         ROOTCIMV2mdmdmmap                                   ROOTCIMV2mdmMS_409                                
ROOTCIMV2ms_409                                      ROOTCIMV2NV                                          ROOTCIMV2NVEvents  
....
#>

使用适合您屏幕的列数。不可以,不能同时使用列和自动调整大小,因为它们是互斥的。

所以,正如Doug所指出的,你可以制作自己的格式化程序,或者根据你的评论。。。

'我的观点是是否有一种方法可以修改函数本身以获得表格格式的

。。。您可以为您所追求的结果使用上述函数。

最新更新