我想递归枚举所有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所指出的,你可以制作自己的格式化程序,或者根据你的评论。。。
'我的观点是是否有一种方法可以修改函数本身以获得表格格式的
。。。您可以为您所追求的结果使用上述函数。