Select-Object -ExpandProperty против Get-ItemPropertyValue - PullRequest
0 голосов
/ 14 сентября 2018

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

(Get-ChildItem ~\.gitconfig).Length

Это утомительно.Поскольку Length очень похоже на свойство, можно подумать, что

Get-ChildItem ~\.gitconfig | Get-ItemPropertyValue -Name Length

будет работать.Однако это не так.Взглянув на интерфейс объекта System.IO.FileSystemInfo, возвращаемого провайдером файловой системы PSDrive, мы видим, что у него нет свойства Length.У него есть свойство FullName, поэтому

Get-ChildItem ~\.gitconfig | Get-ItemPropertyValue -Name FullName

работает, как и ожидалось.Чтобы получить размер (Length) файла с использованием канала, необходимо использовать Select-Object с -ExpandProperty, как

Get-ChildItem ~\.gitconfig | Select-Object -ExpandProperty Length

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

Get-Item -Path Env:\USERNAME

возвращает

Name                           Value
----                           -----
USERNAME                       mnagy

Если это элемент, Get-ItemProperty и Get-ItemPropertyValue должны сыграть здесь роль.Из-за структуры Name: Value результата, новички могут быть заинтригованы, чтобы получить действительное значение, говоря

Get-Item -Path Env:\USERNAME | Get-ItemPropertyValue

или читая, как следует использовать Get-ItemPropertyValue, измените запрос на

Get-ItemPropertyValue -Path Env:\ -Name USERNAME

, что на самом деле приводит к

Get-ItemPropertyValue : Cannot use interface. The IPropertyCmdletProvider interface is not supported by this provider.
At line:1 char:1
+ Get-ItemPropertyValue -Path Env:\ -Name USERNAME
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotImplemented: (:) [Get-ItemPropertyValue], PSNotSupportedException
+ FullyQualifiedErrorId : NotSupported,Microsoft.PowerShell.Commands.GetItemPropertyValueCommand

Вся эта конструкция кажется мне совершенно несовместимой и весьма обидной, но, надеюсь, не по замыслу, а потому, что я смотрю на нее не с того угла.

1 Ответ

0 голосов
/ 14 сентября 2018

К вашей первой заметке: Length, для .hg directoy, работал со мной просто отлично (давая вам количество файлов внутри):

Ps C:\>    (Get-ChildItem .hg).Length
18

Я склонен использовать get-member, чтобы проверить, что поддерживается, а что нет.

Если я проверю его для своего каталога reports:

(Get-ChildItem reports) | gm


   TypeName: System.IO.FileInfo

Name                      MemberType     Definition
----                      ----------     ----------
LinkType                  CodeProperty   System.String LinkType{get=GetLinkType;}
Mode                      CodeProperty   System.String Mode{get=Mode;}
Target                    CodeProperty   System.Collections.Generic.IEnumerable`1[[System.String, mscorlib, Version=...
AppendText                Method         System.IO.StreamWriter AppendText()
CopyTo                    Method         System.IO.FileInfo CopyTo(string destFileName), System.IO.FileInfo CopyTo(s...
Create                    Method         System.IO.FileStream Create()
CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
CreateText                Method         System.IO.StreamWriter CreateText()
Decrypt                   Method         void Decrypt()
Delete                    Method         void Delete()
Encrypt                   Method         void Encrypt()
Equals                    Method         bool Equals(System.Object obj)
GetAccessControl          Method         System.Security.AccessControl.FileSecurity GetAccessControl(), System.Secur...
GetHashCode               Method         int GetHashCode()
GetLifetimeService        Method         System.Object GetLifetimeService()
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, Sys...
GetType                   Method         type GetType()
InitializeLifetimeService Method         System.Object InitializeLifetimeService()
MoveTo                    Method         void MoveTo(string destFileName)
Open                      Method         System.IO.FileStream Open(System.IO.FileMode mode), System.IO.FileStream Op...
OpenRead                  Method         System.IO.FileStream OpenRead()
OpenText                  Method         System.IO.StreamReader OpenText()
OpenWrite                 Method         System.IO.FileStream OpenWrite()
Refresh                   Method         void Refresh()
Replace                   Method         System.IO.FileInfo Replace(string destinationFileName, string destinationBa...
SetAccessControl          Method         void SetAccessControl(System.Security.AccessControl.FileSecurity fileSecurity)
ToString                  Method         string ToString()
PSChildName               NoteProperty   string PSChildName=jv_libgdbs_tests-20180822-Test.xml
PSDrive                   NoteProperty   PSDriveInfo PSDrive=C
PSIsContainer             NoteProperty   bool PSIsContainer=False
PSParentPath              NoteProperty   string PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\prg_sdk\stx8-j...
PSPath                    NoteProperty   string PSPath=Microsoft.PowerShell.Core\FileSystem::C:\prg_sdk\stx8-jv_swin...
PSProvider                NoteProperty   ProviderInfo PSProvider=Microsoft.PowerShell.Core\FileSystem
Attributes                Property       System.IO.FileAttributes Attributes {get;set;}
CreationTime              Property       datetime CreationTime {get;set;}
CreationTimeUtc           Property       datetime CreationTimeUtc {get;set;}
Directory                 Property       System.IO.DirectoryInfo Directory {get;}
DirectoryName             Property       string DirectoryName {get;}
Exists                    Property       bool Exists {get;}
Extension                 Property       string Extension {get;}
FullName                  Property       string FullName {get;}
IsReadOnly                Property       bool IsReadOnly {get;set;}
LastAccessTime            Property       datetime LastAccessTime {get;set;}
LastAccessTimeUtc         Property       datetime LastAccessTimeUtc {get;set;}
LastWriteTime             Property       datetime LastWriteTime {get;set;}
LastWriteTimeUtc          Property       datetime LastWriteTimeUtc {get;set;}
Length                    Property       long Length {get;}
Name                      Property       string Name {get;}
BaseName                  ScriptProperty System.Object BaseName {get=if ($this.Extension.Length -gt 0){$this.Name.Re...
VersionInfo               ScriptProperty System.Object VersionInfo {get=[System.Diagnostics.FileVersionInfo]::GetVer...

Как узнать заранее, стоит ли размещать. после объекта и итерация результатов завершения вкладки, если запись объект или свойство?

Вы проверяете это с помощью Get-Member.

Для Get-Item -Path Env:\USERNAME вы можете снова проверить:

PS C:\> Get-Item -Path Env:\USERNAME | gm


   TypeName: System.Collections.DictionaryEntry

Name          MemberType    Definition
----          ----------    ----------
Name          AliasProperty Name = Key
Equals        Method        bool Equals(System.Object obj)
GetHashCode   Method        int GetHashCode()
GetType       Method        type GetType()
ToString      Method        string ToString()
PSDrive       NoteProperty  PSDriveInfo PSDrive=Env
PSIsContainer NoteProperty  bool PSIsContainer=False
PSPath        NoteProperty  string PSPath=Microsoft.PowerShell.Core\Environment::USERNAME
PSProvider    NoteProperty  ProviderInfo PSProvider=Microsoft.PowerShell.Core\Environment
Key           Property      System.Object Key {get;set;}
Value         Property      System.Object Value {get;set;}

Теперь проверьте ИМЯ ПОЛЬЗОВАТЕЛЯ (вы видите запрашиваемый ключ и его значение):

PS C:\> (Get-Item -Path Env:\USERNAME).key
USERNAME
PS C:\> (Get-Item -Path Env:\USERNAME).value # my login
gurun 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...