Как заставить Select-Object возвращать необработанный тип (например,String), а не PSCustomObject?
-
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 о проекции нескольких свойств на пользовательский объект.