PowerShell脚本写出没有根目录的递归文件列表

PowerShell script to write out recursive list of files without the root directory

在检索目录中文件的递归列表时,是否有一种简单的方法来剥离根目录?

例如

Get-ChildItem -Recurse "C:\Test\Folder" | Where { ! $_.PSIsContainer } | Select FullName | Out-File "C:\Test\Folder\items.txt"

但是这并没有给我:

 C:\Test\Folder\shiv.png
 C:\Test\Folder\Another\kendall.png
 C:\Test\Folder\YetAnother\roman.png

它给了我:

 Folder\shiv.png
 Folder\Another\kendall.png
 Folder\YetAnother\roman.png

这是否可以在一行中实现,还是我必须编写一个循环?

还有没有一种输出方法不会在行与行之间产生间隙,或者也不会在顶部吐出select 属性的名称? (在这种情况下 'FullName'),还是我只需要手动循环并忽略它们?

这就是你所要求的:

Get-ChildItem -Recurse "C:\Test\Folder" | Where { ! $_.PSIsContainer } | Select -ExpandProperty FullName | % { $_.Split("\")[2..1000] -Join "\" }

输出:

Folder\shiv.png
Folder\Another\kendall.png
Folder\YetAnother\roman.png

说明: Get-ChildItem 的结果在 returns 数组的 \ 字符上拆分。下一位 [2..1000] 从元素 2 开始对数组进行切片(以及数组的其余部分,直到指定的数字,所以只要取一个足够大的数字)。最后,我们使用 -Join 运算符将数组连接成一个新字符串。

您遇到的“差距”问题是由于显示对象时 Powershell 的格式设置所致。如果你想获得普通值,你可以使用 -ExpandProperty 开关:

select -Expand FullName

至于你的问题,你可以这样做:

$dir = "C:\Test\Folder"
Get-ChildItem $dir -Recurse -File | foreach {
    $_.FullName.Replace("$dir\", "")
} | Out-File "C:\Test\Folder\items.txt"

请注意,这将区分大小写。如果这是一个问题,您可以使用正则表达式:

$dir = "d:\tmp"
$pattern = [Regex]::Escape($dir) + "\?"
Get-ChildItem $dir -Recurse -File | foreach {
    $_.FullName -replace $pattern, ""
}