从Get-ChildItem -Path

时间:2019-04-19 16:40:36

标签: windows powershell file directory sysadmin

从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

https://stackoverflow.com/a/24468733/262852

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

可能更好的语法:

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

而不是复制项目,我只想要一个对象,或者是对象数组。不是文件的路径,也不是文件的路径,而是可能是Powershell引用或文件指针。

(现在阅读fine手册。)

2 个答案:

答案 0 :(得分:1)

Get-ChildItem "C:\test" -Recurse将在数组内返回FileInfo和DirectoryInfo对象的数组

我们可以在此处看到一个示例,

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

返回

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

答案 1 :(得分:1)

  • 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部分,online help也应显示,尽管在Get-ChildItem的情况下它应不那么具体,因为{{1 }}还可以使用文件系统以外的提供程序。
  • 输出到管道时,每个输出对象分别传递到管道中的下一个命令,以便立即进行处理

  • 变量Get-ChildItem)中捕获了输出时,将应用以下逻辑:

    • 如果输出了两个或更多对象,则会将它们收集在常规PowerShell数组中,该数组的类型为$var = ...(即使实际元素具有特定的类型)。
    • 如果输出一个对象,则按原样输出 ;也就是说,它包装在数组中。
    • 如果没有输出 no 对象,则将输出“数组值null” [object[]],在大多数情况下,其行为类似于[System.Management.Automation.Internal.AutomationNull]::Value,并且不会产生可见的输出-有关详细信息,请参见this answer

因此,当捕获到变量中时,给定的命令可能会根据情况返回

  • 对象数组
  • 单个对象
  • “一无所有”($null

要确保始终将给定命令的输出 视为 array ,您有两个选择:

  • 使用[System.Management.Automation.Internal.AutomationNull]::Valuearray subexpression operator;例如

    • @(...)
  • 使用$fileSystemObjects = @(Get-ChildItem -Recurse -Filter *.txt)约束目标变量(与[array]相同,并且比[object[]]更容易键入)。

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

也就是说,在PSv3 +中,您通常不必担心给定变量包含标量(单值)还是数组,因为标量可以隐式地视为数组 >:您甚至可以在标量上调用.Count,并使用索引([0][-1])-有关详细信息,请参见this answer