从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手册。)
答案 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
)中捕获了输出时,将应用以下逻辑:
$var = ...
(即使实际元素具有特定的类型)。[object[]]
,在大多数情况下,其行为类似于[System.Management.Automation.Internal.AutomationNull]::Value
,并且不会产生可见的输出-有关详细信息,请参见this answer。因此,当捕获到变量中时,给定的命令可能会根据情况返回:
$null
)要确保始终将给定命令的输出 视为 array ,您有两个选择:
使用[System.Management.Automation.Internal.AutomationNull]::Value
,array subexpression operator;例如
@(...)
使用$fileSystemObjects = @(Get-ChildItem -Recurse -Filter *.txt)
约束目标变量(与[array]
相同,并且比[object[]]
更容易键入)。
[array] $fileSystemObjects = Get-ChildItem -Recurse -Filter *.txt
也就是说,在PSv3 +中,您通常不必担心给定变量包含标量(单值)还是数组,因为标量可以隐式地视为数组 >:您甚至可以在标量上调用.Count
,并使用索引([0]
,[-1]
)-有关详细信息,请参见this answer。