вернуть массив объектов из Get-ChildItem -Path - PullRequest
0 голосов
/ 19 апреля 2019

Из powershell, ls -R *.txt будет рекурсивно перечислять файлы по каталогам, или, что еще лучше:

PS> Get-ChildItem -Path C:\Test -Name

logs

anotherfile.txt
Command.txt
CreateTestFile.ps1
ReadOnlyFile.txt

но как мне передать это в массив?Я хотел бы получить массив самого объекта file (?), Глядя на:

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName

https://stackoverflow.com/a/24468733/262852

Я ищу массив "file "объекты с PowerShell от этих типов команд.

возможно, лучший синтаксис:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

но вместо того, чтобы копировать элементы, я просто хочу объект илискорее, массив объектов.Не путь к файлу, не файл, но, по-видимому, ссылка на PowerShell или указатель на файл.

(сейчас читаем руководство fine .)

Ответы [ 2 ]

1 голос
/ 19 апреля 2019
  • Командлеты PowerShell, например Get-ChildItem, могут выводить любое количество объектов.

    • Get-ChildItem выводит [System.IO.FileInfo] и / или [System.IO.DirectoryInfo]объекты, в зависимости от того, выводится ли информация о файлах и / или каталогах.

    • К определяют типы объектов вывода данного командлета :

      • Выполнить, например, (Get-Command Get-ChildItem).OutputType
      • Если это не сработает или посмотреть, какие типы выводятся для определенного вызова, используйте
        Get-ChildItem | Get-Member.
      • Get-Help -Full Get-ChildItem должен также отображать раздел OUTPUTS, как и онлайн-справка , хотя в случае Get-ChildItem он не так специфичен, поскольку Get-ChildItem также работает с поставщиками, отличными отфайловая система.
  • Когда выводится в конвейер , каждый выходной объект передается индивидуально к следующей команде в конвейере для типичной немедленной обработки.

  • Когда вывод фиксируется в переменной ($var = ...) , применяется следующая логика:

    • Если выводятся два или более объектов, они собираются в обычный массив PowerShell типа [object[]] (хотя фактические элементы имеют определенные типы).
    • Если один объект выводится, он выводится как есть ;то есть это , а не , обернутый в массив.
    • Если выводятся no объектов, выводится "null-значение со значением массива", [System.Management.Automation.Internal.AutomationNull]::Value, чтов большинстве случаев ведет себя как $null и не дает видимых результатов - подробности см. в этом ответе .

Следовательно, при захватев переменной заданная команда может ситуационно вернуть :

  • массив объектов
  • отдельный объект
  • "ничто"([System.Management.Automation.Internal.AutomationNull]::Value)

Чтобы обеспечить вывод данной команды всегда , обработанный как массив , у вас есть дваопции:

  • Использовать @(...), оператор подвыражения массива ;например,

    • $fileSystemObjects = @(Get-ChildItem -Recurse -Filter *.txt)
  • Введите ограничение целевой переменной с помощью [array] (что эквивалентно и проще для ввода, чем,[object[]]).

    • [array] $fileSystemObjects = Get-ChildItem -Recurse -Filter *.txt

Тем не менее, в PSv3 + вам часто не нужно беспокоиться о том, является ли данная переменнаясодержит скаляр (одно значение) или массив , потому что скаляры могут неявно рассматриваться как массивы : вы можете вызывать .Count даже для скаляров и использовать индексирование ([0], [-1]) - подробности см. в этом ответе .

1 голос
/ 19 апреля 2019

Get-ChildItem "C:\test" -Recurse вернет массив объектов FileInfo и DirectoryInfo внутри массива

Мы можем увидеть пример, показывающий, что здесь

Get-ChildItem "C:\test" -Recurse | %{
    $_.gettype()
}

Возвращает

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DirectoryInfo                            System.IO.FileSystemInfo
True     True     DirectoryInfo                            System.IO.FileSystemInfo
True     True     FileInfo                                 System.IO.FileSystemInfo
True     True     DirectoryInfo                            System.IO.FileSystemInfo
...