Выберите одно свойство из нескольких расширенных свойств - PullRequest
0 голосов
/ 25 августа 2018

Ниже приведен скрипт, который использует свойство расширения на get-childitem

Get-ChildItem Cert:\LocalMachine\my | select dnsnamelist

дает мне вывод, как показано ниже

DnsNameList                  
-----------                  
{localhost}

поэтому я использовал свойство expand, чтобы развернуть его

Get-ChildItem Cert:\LocalMachine\my | select -ExpandProperty dnsnamelist -Property notafter

Что дает мне вывод, как показано ниже

NotAfter             Punycode                    Unicode                    
--------             --------                    -------                    
5/24/2023 5:30:00 AM localhost                   localhost   

Так что мне нужно только одно свойство, либо юникод, либо punycode, поэтому ниже приведено то, что я сделал

    Get-ChildItem Cert:\LocalMachine\my | 
select -ExpandProperty dnsnamelist -Property notafter | 
Select-Object -ExcludeProperty punycode

Но это все равно дает мне и юникод, и маленький код, как получить только один ..

Мой последний конвейер попросил исключить свойство punycode, почему это не работает?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Как вы обнаружили , в Windows PowerShell -ExcludeProperty вступает в силу только в том случае, если аргумент -Property, такой как *, также предоставляется до Select-Object.(Первый позиционный аргумент, * в примере, неявно привязывается к параметру -Property).

Хотя это поведение задокументировано :

Этот параметр действует только в том случае, если в команду также включен параметр Property.

веских причин для этого никогда не было, и он должен всегда 1030 *.

К счастью, эта проблема была исправлена ​​в PowerShell Core .

Вот простое воспроизведение: попытка исключить свойство two из пользовательского объекта со свойствами one, two, three:

($new = ($old = [pscustomobject] @{ one = 1; two = 2; three = 3 }) | 
  Select-Object -Exclude two) | Get-Member -Type Properties

В Windows PowerShell , начиная с версии 5.1, вы видите проблемное поведение:

   TypeName: Selected.System.Management.Automation.PSCustomObject

Name  MemberType   Definition 
----  ----------   ---------- 
one   NoteProperty int one=1  
three NoteProperty int three=3
two   NoteProperty int two=2  

То есть свойство two НЕ было исключено.

Дополнительно, хотя имя типа делает его кажется как новый объект был построен (как и следовало ожидать) - с учетом префикса Selected. - то есть nв действительности это не тот случай: возвращается тот же объект, что означает, что входной объект был неожиданно изменен (его коллекция .pstypenames), что является еще одной веской причиной считать это поведение ошибкой ([object]::ReferenceEquals($new, $old)возвращает $True).

Обратите внимание, однако, что эта нежелательная модификация объекта ввода происходит только с экземплярами типа System.Management.Automation.PSCustomObject - экземпляры других типов просто передаются как есть.

Как уже говорилось, * (-Property *) необходим для того, чтобы команда работала должным образом.


В PowerShell Core , по состоянию на 6.1.0, проблема была исправлена:

   TypeName: Selected.System.Management.Automation.PSCustomObject

Name  MemberType   Definition
----  ----------   ----------
one   NoteProperty int one=1
three NoteProperty int three=3

То есть свойство two было успешно исключеноиз нового объекта, который был возвращен ([object]::ReferenceEquals($new, $old) возвращает $False)

0 голосов
/ 25 августа 2018

После написания вопроса, я нашел ответ, вы должны использовать 'select *' в конечной конвейерной линии, как показано ниже

Get-ChildItem Cert:\LocalMachine\my | 
select -ExpandProperty dnsnamelist -Property notafter | Select * -ExcludeProperty unicode

Вы также можете использовать выражение, как показано ниже

Get-ChildItem Cert:\LocalMachine\my | 
select -ExpandProperty dnsnamelist -Property notafter | select notafter,@{Name='SystemName';Expression ={$_.unicode} }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...