如何在Powershell中返回格式化为表格的自定义对象?

Ben*_*ack 3 powershell

我对powershell很新,所以如果我发现这一切都错了,我也不会感到惊讶.我正在尝试创建一个函数,在执行时,打印格式化为表格的结果.也许甚至可以将这些结果传递给另一个函数进行进一步分析.

这是我到目前为止所拥有的.这是一个简单的函数,它遍历路径列表并收集目录的名称和该目录中的项目数,将数据放入哈希表中,并返回一个哈希表数组:

function Check-Paths(){
  $paths = 
    "C:\code\DirA",
    "C:\code\DirB"
  $dirs = @()
  foreach ($path in $paths){
      if (Test-Path $path){
        $len = (ls -path $path).length
      }
      else{
        $len = 0
      }
      $dirName = ($path -split "\\")[-1]
      $dirInfo = @{DirName = $dirName; NumItems = $len}
      $dirs += $dirInfo
  }
  return $dirs

}
Run Code Online (Sandbox Code Playgroud)

这看起来很简单.但是,当我运行命令时,这就是我得到的:

PS > Check-Paths

Name                           Value
----                           -----
DirName                        DirA
NumItems                       0
DirName                        DirB
NumItems                       0
Run Code Online (Sandbox Code Playgroud)

我想要的是这个:

DirName                       NumItems
-------                       --------
DirA                          0
DirB                          0
Run Code Online (Sandbox Code Playgroud)

我可以破解我的功能来使用一个write声明,但我认为必须有一个更好的方法来做到这一点.有没有办法将数据格式化为表格,如果可以将其传递给另一种方法,那就更好了吗?

Mik*_*ard 10

如何使用

return new-object psobject -Property $dirs
Run Code Online (Sandbox Code Playgroud)

这将返回一个对象,其属性与哈希表中的项匹配.然后,您可以使用内置的PowerShell格式化cmdlet使其看起来像您想要的那样.由于您只有2个属性,因此默认情况下它将被格式化为表格.

编辑:这是整个事情的样子(在各种建议之后):

function Check-Paths(){
  $paths = 
    "C:\code\DirA",
    "C:\code\DirB"
  $dirs = @()
  foreach ($path in $paths){
      if (Test-Path $path){
        $len = (ls -path $path).length
      }
      else{
        $len = 0
      }
      $dirName = ($path -split "\\")[-1]
      new-object psobject -property  @{DirName = $dirName; NumItems = $len}
  }
}
Run Code Online (Sandbox Code Playgroud)