Как вернуть пользовательский объект в Powershell, отформатированный в виде таблицы? - PullRequest
3 голосов
/ 03 марта 2012

Я довольно новичок в 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 ]

10 голосов
/ 03 марта 2012

Как насчет использования

return new-object psobject -Property $dirs

Это вернет объект, свойства которого соответствуют элементам в хеш-таблице. Затем вы можете использовать встроенные командлеты форматирования powershell, чтобы они выглядели так, как вам нужно. поскольку у вас есть только 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 голос
/ 03 марта 2012

Вот один вкладыш, который даст вам количество дочерних элементов для каждой папки.

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

Он передает массив строк в Where-Object, чтобы выбрать существующие. Существующие строки пути передаются в Get-Item для получения объектов FileSystemObject, которые передаются в Select-Object для создания PSCustomObject объектов. Объекты PSCustomObject имеют два свойства: имя каталога и количество дочерних объектов.

Если вы хотите, чтобы столбцы выводимой таблицы были ближе друг к другу, вы можете передать вышеперечисленное: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...