【问题标题】:Determining object type确定对象类型
【发布时间】:2017-01-15 07:17:28
【问题描述】:

this question 中,我们解决了我们的问题,但有一点我还没有学到。

上述帖子中的cmets以下:

我的目标是 - 根据嵌套数组的索引调用每个文件数据并删除最后三行。所以- $array = New-Object Sytem.Collections.Arraylist; Get-ChildItem C:\...\test | ForEach-Object { $array += ,@(Get-Content $_.FullName) }; $array[0].removerange($array[0].count-2,2) 但它会抛出无法识别 removerange 的错误。我检查了 - $array[0] | gm 并且确实不存在 removerange 方法。只需删除和删除。如何进行此操作? - iamsmith41 1 月 11 日 22:14

@iamsmith41 Get-Content 返回 System.Array,而不是 System.Collections.ArrayList。前者没有RemoveRange() 方法。另外,请不要移动目标。如果其中一个答案解决了您当前问题中描述的问题:请考虑接受该答案。如果您有新问题或后续问题:请发布新问题。 - Ansgar Wiechers 1 月 11 日 23:33

好的。我标记了答案。但请告诉我如何完成它(removerange() 方法)。提前致谢。 - iamsmith41 2 天前

$array += ,[Collections.ArrayList]@(Get-Content $_.FullName) 应该就足够了。如果您需要进一步的帮助,请发布一个新问题。 - Ansgar Wiechers 2 天前


如何知道上面我必须使用的对象类型是Collections.ArrayList等等?怎么知道这是System.Array而不是System.Collections.ArrayList等?

【问题讨论】:

  • ($expression).GetType().FullName[Type]::GetTypeArray((,($expression)))[0].FullName.

标签: powershell object-type


【解决方案1】:

您可以通过其GetType() 方法确定对象的类型:

PS C:\> (Get-Item '.').GetType()

IsPublic IsSerial 名称 BaseType
-------- -------- ---- --------
True True DirectoryInfo System.IO.FileSystemInfo

PS C:\> (Get-Item '.').GetType().FullName
System.IO.DirectoryInfo

或使用Get-Member cmdlet:

PS C:\> Get-Item '.' |获取会员

   类型名称:System.IO.DirectoryInfo

名称 MemberType 定义
---- ---------- ----------
模式 CodeProperty System.String Mode{get=Mode;}
创建方法 void Create(), void Create(System.Securi...
CreateObjRef 方法 System.Runtime.Remoting.ObjRef CreateObj...
CreateSubdirectory 方法 System.IO.DirectoryInfo CreateSubdirectory...
...

前者提供有关对象的元信息,例如其名称、基本类型、其组装来源等(将GetType() 的输出通过管道传输到Format-List * 以获得完整列表)。

后者主要用于获取有关对象的成员(属性和方法)的信息(如果使用参数-Static,则为类的静态成员)。请注意,如果您需要有关集合对象成员的信息,则必须使用 Get-Member -InputObject $col 而不是仅使用 $col | Get-Member,因为使用管道会展开集合,您将获得集合元素的成员而不是集合的成员对象本身。

一旦你知道了一个类,你通常会在documentation 中查找更多信息,例如通过将类或成员名称输入您的首选搜索引擎。

【讨论】:

  • 你也可以(Get-Item '.').GetType() -eq [System.IO.FileSystemInfo]),至少在PS5中
  • @jpaugh 如果您已经在使用 PowerShell v5,您可以使用(Get-Item .) -is [System.IO.FileSystemInfo]。不过,这仅用于检查对象是否属于特定类型,而不是在您事先不知道类型时找出类型。
  • 太棒了,谢谢!这实际上适用于-eq 没有的情况,即$value -is [PSCustomObject](否则需要完全拼写出来(如$value.GetType() -eq [System.Management.Automation.PSCustomObject])。
【解决方案2】:

获取对象的类型名称:(Get-Service | Get-Member)[0].TypeName

【讨论】:

    【解决方案3】:

    查看你可以做的类型:

    expression | get-member
    

    但如果您可以删除文件的最后 3 行,您可以这样做:

    $yourfile='c:\temp\histo3.txt'
    $content=Get-Content $yourfile
    $content[0..[Math]::abs($content.Count - 4)] | Set-Content $yourfile
    

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 2011-01-14
      • 2015-01-18
      • 1970-01-01
      • 2013-03-24
      • 2018-02-24
      • 1970-01-01
      相关资源
      最近更新 更多