Как заставить Select-Object возвращать необработанный тип (например,String), а не PSCustomObject?

StackOverflow https://stackoverflow.com/questions/618749

  •  03-07-2019
  •  | 
  •  

Вопрос

Следующий код дает мне массив PSCustomObjects. Как мне заставить его возвращать массив строк?

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)}

(Второстепенный вопрос: для чего нужна часть псиконтейнера?Я скопировал это из примера в Интернете)

Редактирование после принятия: Два отличных ответа, хотелось бы отметить их оба.Наградили оригинальным ответом.

Это было полезно?

Решение

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

foreach {

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

foreach {'hello'; 

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

foreach {

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

foreach {'hello'; 

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

foreach {

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

foreach {'hello'; 

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

foreach {

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!(

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

Get-ChildItem $directory -Recurse

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

Select-Object FullName

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

<*>

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.psiscontainer)} | foreach {

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

<*>

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

<*>

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

<*>

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.FullName}

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

<*>

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

<*>

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.psiscontainer)}

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.psiscontainer)} | foreach {

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

<*>

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

<*>

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

<*>

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.FullName}

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

<*>

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

<*>

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.FullName}

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.psiscontainer)} | foreach {

Вам просто нужно выбрать нужное свойство из объектов. FullName в этом случае.

<*>

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

<*>

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

<*>

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание, что все они появляются в выводе. Теперь попробуйте это:

<*>

Обратите внимание, что одно из значений фиксируется переменной. Он не отображается в выходном конвейере.

.FullName}

Правка . Объяснение для Марка, который спрашивает: "Что делает foreach?" Что это за перечисление закончено?

Объяснение Сун Мейстера очень хорошее, но я добавлю здесь пошаговое руководство, потому что оно может быть полезным.

Ключевой концепцией является конвейер. Представьте себе серию шариков для пинг-понга, катящихся по узкой трубе один за другим. Это объекты в конвейере. Каждый этап конвейера - сегменты кода, разделенные символом канала (|) - имеет входящий в него канал и выходящий из него канал. Выход одной ступени подключен к входу следующей ступени. Каждый этап берет объекты по мере их поступления, что-то делает с ними и отправляет их обратно в выходной конвейер или отправляет новые замещающие объекты.

<*>

Get-ChildItem просматривает файловую систему, создавая объекты FileSystemInfo, которые представляют каждый встречающийся файл и каталог, и помещает их в конвейер.

<*>

Select-Object берет каждый объект FileSystemInfo по мере его поступления, извлекает из него свойство FullName (в данном случае это путь), помещает это свойство в новый созданный им пользовательский объект и помещает этот пользовательский объект в трубопровод.

<*>

Это фильтр. Он берет каждый объект, проверяет его и отправляет обратно или отбрасывает в зависимости от некоторых условий. Кстати, в вашем коде есть ошибка. Пользовательские объекты, которые поступают сюда, не имеют свойства psiscontainer. Этот этап на самом деле ничего не делает. Код Сена Мейстера лучше.

<*>

Foreach, длинное имя которого ForEach-Object, получает каждый объект по мере его поступления, а здесь получает свойство FullName, строку из него. Теперь, вот тонкая часть: любое значение, которое не используется, то есть не захватывается переменной или каким-либо образом подавляется, помещается в выходной конвейер. В качестве эксперимента попробуйте заменить этот этап следующим:

<*>

На самом деле попробуйте и проверьте вывод. В этом блоке кода есть четыре значения. Ни один из них не потребляется. Обратите внимание,

Другие советы

Чтобы получить строку для имени файла, вы можете использовать

$files = Get-ChildItem $directory -Recurse | Where-Object {!($_.psiscontainer)} | Select-Object -ExpandProperty FullName

А -ExpandProperty Параметр позволяет вам получить объект в зависимости от типа указанного свойства.

Дальнейшее тестирование показывает, что это не работает с V1, но эта функциональность исправлена, начиная с V2 CTP3.

По вопросу №1

Я удалил часть «select-object» - она ​​избыточна и переместил фильтр «where» перед «foreach», в отличие от ответ Дэнгфа - Фильтруйте как можно скорее, чтобы иметь дело только с частью того, с чем вам придется иметь дело в следующем трубопроводе.

$files = Get-ChildItem $directory -Recurse | Where-Object {!$_.PsIsContainer} | foreach {$_.FullName}

Этот фрагмент кода по сути читается

  • Рекурсивно получить полный путь ко всем файлам (Get-ChildItem $directory -Recurse)
  • Отфильтровать каталоги (Where-Object {!$_.PsIsContainer})
  • Возвращать только полное имя файла (foreach {$_.FullName})
  • Сохраните все имена файлов в $files.

Обратите внимание, что для Еогеасп {$_.FullName}, в powershell возвращается последний оператор в блоке скрипта ({...}), в данном случае $_.FullName строки типа

Если вам действительно нужно получить необработанный объект, вам не нужно ничего делать после избавления от «select-object».Если вы использовали Select-Object, но хотите получить доступ к необработанному объекту, используйте «PsBase», это совершенно другой вопрос (тема). См. «Что случилось с PSBASE, PSEXTENDED, PSADAPTED и PSOBJECT?" для получения дополнительной информации по этому вопросу

По вопросу №2

А также фильтрация по !$_.PsIsContainer означает, что вы исключаете объекты уровня контейнера. В вашем случае вы делаете Get-ChildItem на Файловая система поставщика (вы можете просмотреть поставщиков PowerShell с помощью Get-PsProvider), поэтому контейнер представляет собой СправочникИнформация(папка)

ПсиКонтейнер означает разные вещи у разных поставщиков PowerShell;например) Для Реестр поставщик, PsIsContainer имеет тип Microsoft.Win32.RegistryKeyПопробуй это:

>pushd HKLM:\SOFTWARE
>ls | gm

[ОБНОВЛЯТЬ] на следующий вопрос: Что делает foreach?Что это за перечисление?Чтобы уточнить, «Foreach»-это псевдоним для «foreach-object», который вы можете узнать через,

get-help foreach

-- или --

get-alias foreach

Теперь в моем ответе «foreach» перечисляет каждый экземпляр объекта типа. Информация о файле возвращается из предыдущего канала (который имеет отфильтрованные каталоги). Информация о файле имеет свойство под названием Полное имя и это то, что перечисляет "foreach".
И вы ссылаетесь на объект, проходящий через конвейер, через специальную переменную конвейера с именем «$_», которая имеет тип Информация о файле в контексте блока сценария foreach.

Для V1 добавьте следующий фильтр в свой профиль:

filter Get-PropertyValue([string]$name) { 

Для V1 добавьте следующий фильтр в свой профиль:

gci . -r | ?{!

Для V1 добавьте следующий фильтр в свой профиль:

filter Get-PropertyValue([string]$name) { 

Для V1 добавьте следующий фильтр в свой профиль:

<*>

Тогда вы можете сделать это:

<*>

Кстати, если вы используете Расширения сообщества PowerShell , у вас уже есть это.

Что касается возможности использовать Select-Object -Expand в V2, это забавный трюк, но он не очевиден и на самом деле не предназначен для Select-Object и -Expand. -Развернуть это все о выравнивании, как LINQ SelectMany и Select-Object о проекции нескольких свойств на пользовательский объект.

.$name }

Тогда вы можете сделать это:

<*>

Кстати, если вы используете Расширения сообщества PowerShell , у вас уже есть это.

Что касается возможности использовать Select-Object -Expand в V2, это забавный трюк, но он не очевиден и на самом деле не предназначен для Select-Object и -Expand. -Развернуть это все о выравнивании, как LINQ SelectMany и Select-Object о проекции нескольких свойств на пользовательский объект.

.psiscontainer} | Get-PropertyName fullname

Тогда вы можете сделать это:

<*>

Кстати, если вы используете Расширения сообщества PowerShell , у вас уже есть это.

Что касается возможности использовать Select-Object -Expand в V2, это забавный трюк, но он не очевиден и на самом деле не предназначен для Select-Object и -Expand. -Развернуть это все о выравнивании, как LINQ SelectMany и Select-Object о проекции нескольких свойств на пользовательский объект.

.$name }

Тогда вы можете сделать это:

<*>

Кстати, если вы используете Расширения сообщества PowerShell , у вас уже есть это.

Что касается возможности использовать Select-Object -Expand в V2, это забавный трюк, но он не очевиден и на самом деле не предназначен для Select-Object и -Expand. -Развернуть это все о выравнивании, как LINQ SelectMany и Select-Object о проекции нескольких свойств на пользовательский объект.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top