您只需要从对象中挑选出您想要的属性。 FullName 在这种情况下。
$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}
编辑: 对 Mark 的解释,他问道:“foreach 是做什么的?枚举是什么?”
Sung Meister 的解释非常好,但我会在这里添加一个演练,因为它可能会有所帮助。
关键概念是管道。想象一系列乒乓球一个接一个地滚下一个狭窄的管子。这些是管道中的对象。管道的每个阶段——由管道 (|) 字符分隔的代码段——都有一个管道进入它,管道从它流出。一个阶段的输出连接到下一个阶段的输入。每个阶段都会在对象到达时对其进行处理,然后将它们发送回输出管道或发送新的替换对象。
Get-ChildItem $directory -Recurse
Get-ChildItem 遍历文件系统,创建代表它遇到的每个文件和目录的 FileSystemInfo 对象,并将它们放入管道中。
Select-Object FullName
Select-Object 在每个 FileSystemInfo 对象到达时获取它,从中获取 FullName 属性(在本例中为路径),将该属性放入它创建的全新自定义对象中,然后将该自定义对象放入管道。
Where-Object {!($_.psiscontainer)}
这是一个过滤器。它获取每个对象,对其进行检查,然后根据某些条件将其送回或丢弃。顺便说一句,您这里的代码有一个错误。到达这里的自定义对象没有 psiscontainer 属性。这个阶段实际上并没有做任何事情。 Sung Meister 的代码更好。
foreach {$_.FullName}
Foreach,其长名称是 ForEach-Object,在每个对象到达时抓取它,在这里,从它抓取 FullName 属性,一个字符串。现在,这里是微妙的部分:任何未被消耗的值,即未被变量捕获或以某种方式抑制的值,都被放入输出管道。作为一个实验,尝试用这个替换那个阶段:
foreach {'hello'; $_.FullName; 1; 2; 3}
实际尝试一下并检查输出。该代码块中有四个值。它们都没有被消耗。请注意,它们都出现在输出中。现在试试这个:
foreach {'hello'; $_.FullName; $ x = 1; 2; 3}
请注意,其中一个值正在被变量捕获。它不会出现在输出管道中。