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

时间:2012-03-02 20:52:30

标签: 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

}

这似乎很简单。但是,当我运行命令时,这就是我得到的:

PS > Check-Paths

Name                           Value
----                           -----
DirName                        DirA
NumItems                       0
DirName                        DirB
NumItems                       0

想要的是这样的:

DirName                       NumItems
-------                       --------
DirA                          0
DirB                          0

我可以破解我的函数来使用write语句,但我认为必须有一个更好的方法来做到这一点。有没有办法将数据格式化为表格,如果可以将其传输到另一种方法,那就更好了吗?

2 个答案:

答案 0 :(得分:10)

如何'回合使用

return new-object psobject -Property $dirs

这将返回一个对象,其属性与哈希表中的项匹配。然后,您可以使用内置的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}
  }
}

答案 1 :(得分:1)

这是一个单行班,可以为您提供每个文件夹的子项数。

"C:\code\DirA", "C:\code\DirB" | ? {Test-Path $_} | Get-Item | select -property Name, @{ Name="NumOfItems" ; Expression = {$_.GetFileSystemInfos().Count} } 

它将一个字符串数组传递给Where-Object以选择存在的字符串。存在的路径字符串将传递给Get-Item,以获取传递给Select-Object的FileSystemObjects以创建PSCustomObject个对象。 PSCustomObjects有两个属性,即目录名和子项数。

如果您希望输出的表格列更靠近在一起,您可以将上述内容输入:Format-Table -AutoSize

示例用法和输出:

dir | ? {$_.PsIsContainer} | select -property Name, @{ Name="NumOfItems" ; Expression = {$_.GetFileSystemInfos().Count} } | Format-Table -AutoSize

Name         NumOfItems
----         ----------
Desktop              12
Favorites             3
My Documents          3
Start Menu            2