0

我想递归枚举所有 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
---------
ROOT\Appv
ROOT\CIMV2
ROOT\CIMV2\mdm
ROOT\CIMV2\mdm\dmmap
ROOT\CIMV2\mdm\MS_405
ROOT\CIMV2\ms_405
ROOT\CIMV2\ms_409
ROOT\CIMV2\power
ROOT\CIMV2\power\m...
ROOT\CIMV2\power\m...
ROOT\CIMV2\Security
ROOT\CIMV2\Securit...
ROOT\CIMV2\Securit...
ROOT\CIMV2\Termina...
ROOT\CIMV2\Termina...
ROOT\Cli
ROOT\Cli\MS_405
ROOT\Cli\MS_409
ROOT\DEFAULT
ROOT\DEFAULT\ms_405
ROOT\DEFAULT\ms_409
ROOT\directory
ROOT\directory\LDAP
ROOT\directory\LDA...
ROOT\directory\LDA...
ROOT\Hardware
ROOT\Hardware\ms_405
ROOT\Hardware\ms_409
ROOT\Intel_ME
ROOT\IntelNCS2
ROOT\IntelNCS2\ms_409
ROOT\Interop
ROOT\Interop\ms_405
ROOT\Interop\ms_409
ROOT\Microsoft
ROOT\Microsoft\Hom...
ROOT\Microsoft\pro...
ROOT\Microsoft\Sec...
ROOT\Microsoft\Uev
ROOT\Microsoft\Win...
...
ROOT\Microsoft\Win...
ROOT\msdtc
ROOT\PEH
ROOT\Policy
ROOT\Policy\ms_405
ROOT\Policy\ms_409
ROOT\RSOP
ROOT\RSOP\Computer
ROOT\RSOP\User
ROOT\SECURITY
ROOT\SecurityCenter
ROOT\SecurityCenter2
ROOT\ServiceModel
ROOT\StandardCimv2
ROOT\StandardCimv2...
ROOT\StandardCimv2...
ROOT\StandardCimv2...
ROOT\StandardCimv2...
ROOT\subscription
ROOT\subscription\...
ROOT\subscription\...
ROOT\WMI
ROOT\WMI\ms_405
ROOT\WMI\ms_409

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

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

Namespace
---------
ROOT\Appv
ROOT\CIMV2
ROOT\CIMV2\mdm
ROOT\CIMV2\mdm\dmmap
ROOT\CIMV2\mdm\MS_405
ROOT\CIMV2\ms_405
ROOT\CIMV2\ms_409
ROOT\CIMV2\power
ROOT\CIMV2\power\ms_405
ROOT\CIMV2\power\ms_409
ROOT\CIMV2\Security
ROOT\CIMV2\Security\MicrosoftTpm
ROOT\CIMV2\Security\MicrosoftVolumeEncryption
ROOT\CIMV2\TerminalServices
ROOT\CIMV2\TerminalServices\ms_405
ROOT\Cli
ROOT\Cli\MS_405
ROOT\Cli\MS_409
...

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

4

2 回答 2

1

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

Get-WmiNamespace -Recurse | select -ExpandProperty namespace

此外,只需添加Sort显示全名

Get-WmiNamespace -Recurse | Sort
于 2020-09-15T17:15:11.753 回答
0

不使用 Expand 并且 Doug 指出,您可以点它并避免格式的东西或尝试更改函数本身等。好吧,至少对于单个列。

(Get-WmiNamespace -Recurse).Namespace
# Results
<#
 (Get-WmiNamespace -Recurse).Namespace
ROOT\Appv
...
ROOT\CIMV2\Security\MicrosoftTpm
ROOT\CIMV2\Security\MicrosoftVolumeEncryption
ROOT\CIMV2\TerminalServices
ROOT\CIMV2\TerminalServices\ms_409
...

ROOT\Microsoft\SqlServer\ComputerManagement15
ROOT\Microsoft\SqlServer\ComputerManagement15\MS_409
ROOT\Microsoft\SqlServer\ServerEvents
ROOT\Microsoft\SqlServer\ServerEvents\MSSQLSERVER
...
ROOT\Microsoft\Windows\DesiredStateConfigurationProxy
ROOT\Microsoft\Windows\DesiredStateConfigurationProxy\MS_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
<#
ROOT\Appv                                              ROOT\aspnet                                            ROOT\CIMV2                                           
ROOT\CIMV2\mdm                                         ROOT\CIMV2\mdm\dmmap                                   ROOT\CIMV2\mdm\MS_409                                
ROOT\CIMV2\ms_409                                      ROOT\CIMV2\NV                                          ROOT\CIMV2\NV\Events  
....
#>

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

因此,正如 Doug 指出的那样,您可以制作自己的格式化程序,或者根据您的评论...

'我的观点是是否有办法修改函数本身以格式化表格'

...您可以根据您所追求的结果修改上述功能。

于 2020-09-16T08:10:58.370 回答