Вам просто нужно выбрать желаемое свойство из объектов. FullName
в этом случае.
$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}
Редактировать: Объяснение для Марка, который спрашивает: «Что делает foreach? Что это за перечисление?»
Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.
Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.
Get-ChildItem $directory -Recurse
Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.
Select-Object FullName
Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.
Where-Object {!($_.psiscontainer)}
Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.
foreach {$_.FullName}
Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName - строку. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:
foreach {'hello'; $_.FullName; 1; 2; 3}
На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:
foreach {'hello'; $_.FullName; $ x = 1; 2; 3}
Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.