Как вы обнаружили , в 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
)