从 Get-ChildItem -Path 返回对象数组

Thu*_*fir 4 windows directory powershell system-administration file

从 powershell 中,ls -R *.txt将按目录递归列出文件,或者更好:

PS> Get-ChildItem -Path C:\Test -Name
Run Code Online (Sandbox Code Playgroud)

日志

PS> Get-ChildItem -Path C:\Test -Name
Run Code Online (Sandbox Code Playgroud)

但我如何将其输入数组?我想要一个文件(?)对象本身的数组,查看:

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName

/sf/answers/1712811341/

我正在从这些类型的命令中寻找带有 powershell 的“文件”对象数组。

可能更好的语法:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

但我不需要复制这些项目,而是想要一个对象,或者更确切地说,对象数组。不是文件的路径,也不是文件,大概是 powershell 引用或指向文件的指针。

(现在阅读精美的手册。)

mkl*_*nt0 9

太长了;博士

  • 当您在变量(例如
    $output = Get-ChildItem ...)中捕获 PowerShell 语句的输出时,如果有两个或多个输出对象,它会自动收集在数组中。

  • 为了确保始终使用数组- 即使只有一个没有输出对象 - 使用@(...)(例如,
    $output = @(Get-ChildItem ...)


  • PowerShell cmdlet(例如Get-ChildItem)可以输出任意数量的对象。

    • Get-ChildItem输出[System.IO.FileInfo]和/或[System.IO.DirectoryInfo]对象,具体取决于是否输出有关文件和/或目录的信息。

    • 确定给定 cmdlet 的输出对象类型

      • 运行,例如(Get-Command Get-ChildItem).OutputType
      • 如果这不起作用,或者要查看特定调用的输出类型,请使用
        Get-ChildItem | Get-Member
      • Get-Help -Full Get-ChildItem也应该显示一个部分,就像在线帮助OUTPUTS一样,尽管不是在不太具体的情况下,因为也可以与文件系统以外的提供程序一起使用。Get-ChildItemGet-ChildItem
  • 输出到管道时,每个输出对象都会单独传递到管道中的下一个命令,以便通常立即处理。

  • 当在变量( )中捕获输出$var = ...时,将应用以下逻辑:

    • 如果输出两个或多个对象,它们将收集在常规 PowerShell 数组中,该数组具有类型[object[]](即使实际元素具有特定类型)。
    • 如果输出一个对象,则按原样输出;也就是说,它没有包装在数组中。
    • 如果没有输出对象,则输出“数组值 null”(有时因其类型名称而称为“AutomationNull”),其在表达式上下文中的行为类似于空集合;$null在枚举上下文中,其行为类似于空集合;它导致没有可见的输出 - 有关详细信息,请参阅此答案

因此,当在变量中捕获时,给定的命令可能会返回

  • 对象数组
  • 单个对象
  • “没有什么” ([System.Management.Automation.Internal.AutomationNull]::Value

为了确保给定命令的输出始终被视为数组,您有两个选择:

  • 使用@(...),数组子表达式运算符;例如

    • $fileSystemObjects = @(Get-ChildItem -Recurse -Filter *.txt)
  • [array]使用(相当于,并且比 更容易键入)对目标变量进行类型约束[object[]]

    • [array] $fileSystemObjects = Get-ChildItem -Recurse -Filter *.txt

也就是说,在 PSv3+ 中,您通常不需要担心给定变量是否包含标量(单值)或数组,因为标量可以隐式地像数组一样对待:您.Count甚至可以在标量上调用,并使用索引([0][-1]) - 请参阅这个答案的详细信息。

  • TL;DR 使用 `@(...)` 确保输出始终被视为数组! (2认同)