【问题标题】:shortened output of property values in recursive function递归函数中属性值的缩短输出
【发布时间】:2020-09-15 17:09:50
【问题描述】:

我想递归枚举所有 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
...

解决此问题的最佳方法是什么?

【问题讨论】:

  • FWIW 实际上是 Format-Table 首先截断了值:)

标签: powershell namespaces wmi


【解决方案1】:

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

Get-WmiNamespace -Recurse | select -ExpandProperty namespace

另外,只需添加 Sort 即可显示全名

Get-WmiNamespace -Recurse | Sort

【讨论】:

【解决方案2】:

不使用 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 指出的那样,您可以制作自己的格式化程序,或者根据您的评论...

'我的意思是是否有办法修改函数本身以获得 表格格式'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2020-01-07
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多