return 来自 Get-ChildItem -Path 的对象数组

return array of objects from Get-ChildItem -Path

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

PS> Get-ChildItem -Path C:\Test -Name

日志

anotherfile.txt
Command.txt
CreateTestFile.ps1
ReadOnlyFile.txt

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

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

我正在从这些类型的命令中寻找具有 powershell 的 "file" 对象数组。

可能更好的语法:

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

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

(正在阅读 fine 手册。)

Get-ChildItem "C:\test" -Recurse 将 return 数组中的 FileInfo 和 DirectoryInfo 对象数组

我们可以在这里看到一个例子

Get-ChildItem "C:\test" -Recurse | %{
    $_.gettype()
}

Returns

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DirectoryInfo                            System.IO.FileSystemInfo
True     True     DirectoryInfo                            System.IO.FileSystemInfo
True     True     FileInfo                                 System.IO.FileSystemInfo
True     True     DirectoryInfo                            System.IO.FileSystemInfo

tl;dr

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

  • 确保数组总是使用——即使只有单个没有输出对象-使用@(...)(例如,
    $output = @(Get-ChildItem ...)


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

    • Get-ChildItem 输出 [System.IO.FileInfo] and/or [System.IO.DirectoryInfo] 个对象,取决于是否正在输出有关文件 and/or 个目录的信息。

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

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

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

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

因此,当在变量中捕获时,给定命令可能根据情况 return:

  • 对象数组
  • 单个对象
  • “无”([System.Management.Automation.Internal.AutomationNull]::Value)

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

  • 使用@(...)array subexpression operator;例如

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

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

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