Как получить Избранный Объект возвратить необработанный тип (например, Строка), а не PSCustomObject?

Числовое значение, по-видимому, отсутствует в определении цены. Попробуйте следующее:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>
37
задан Sung M. Kim 13 March 2009 в 03:24
поделиться

4 ответа

Просто необходимо выбрать свойство, которое Вы хотите от объектов. FullName в этом случае.

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

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

Объяснение Sung Meister очень хорошо, но я добавлю пошаговую демонстрацию здесь, потому что это могло быть полезно.

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

Get-ChildItem $directory -Recurse

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

Select-Object FullName

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

Where-Object {!($_.psiscontainer)}

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

foreach {$_.FullName}

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

foreach {'hello'; $_.FullName; 1; 2; 3}

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

foreach {'hello'; $_.FullName; $ x = 1; 2; 3}

Заметьте, что одно из значений получается переменной. Это не появляется в выходном конвейере.

37
ответ дан dan-gph 13 March 2009 в 03:24
поделиться
  • 1
    Да, хорошо, когда Вы делаете Сервер. Передайте это работает. – Aristos 19 February 2013 в 12:52

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

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

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

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

23
ответ дан Igor Popov 13 March 2009 в 03:24
поделиться

Для вопроса № 1

Я удалил "избранно-объектную" часть - это избыточно и перемещено, "где" фильтр прежде "foreach" в отличие от ответа dangph - Фильтр как можно скорее так, чтобы Вы имели дело только с подмножеством того, с чем необходимо иметь дело в следующем трубопроводе.

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

Тот фрагмент кода по существу читает

  • Доберитесь весь полный путь файлов всех файлов рекурсивно (Доберитесь-ChildItem, $directory - Рекурсивно вызывают),
  • Отфильтруйте каталоги (Где - Объект {! $ _.PsIsContainer})
  • Возвратите полное имя файла только (foreach {$ _.FullName})
  • Сохраните все имена файлов в $files

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

Если действительно необходимо получить необработанный объект, Вы ничего не должны делать после избавления от "избранного объекта". Если необходимо было использовать Избранный Объект, но хотеть получить доступ к необработанному объекту, используйте "PsBase", который является полностью другим вопросом (тема) - Отсылают к, "Что произошло с PSBASE, PSEXTENDED, PSADAPTED и PSOBJECT?" для получения дополнительной информации о том предмете

Для вопроса № 2

И также фильтруя! $ _.PsIsContainer означает исключение контейнерного уровня объекты - В случае Вы делаете, Добираются-ChildItem на Поставщике файловой системы (Вы видите, что поставщики PowerShell через Добираются-PsProvider), таким образом, контейнером является DirectoryInfo (папка)

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

>pushd HKLM:\SOFTWARE
>ls | gm

[ОБНОВЛЕНИЕ] следующего вопроса: Что делает foreach? Что это перечисляет? Для разъяснения "foreach" является псевдонимом для "Foreach-объекта", который можно узнать через,

get-help foreach

- или-

get-alias foreach

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

9
ответ дан Community 13 March 2009 в 03:24
поделиться

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

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

Затем можно сделать это:

gci . -r | ?{!$_.psiscontainer} | Get-PropertyName fullname

BTW при использовании Расширений Сообщества PowerShell Вы уже, имеют это.

Относительно способности использовать Избранный Объект - Расширяются в V2, это - милый прием, но не очевидное и действительно не то, какой Избранный Объект, ни - Разворачивают, был предназначен для. - расширяются, все о выравнивании как SelectMany LINQ, и Избранный Объект о проекции нескольких свойств на пользовательский объект.

4
ответ дан Keith Hill 13 March 2009 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: