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, ""
}
在检索目录中文件的递归列表时,是否有一种简单的方法来剥离根目录?
例如
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, ""
}