我正在编写一个PS脚本,该脚本采用扁平的目录结构,查找pdf,然后将其复制到具有顺序名称(即1.pdf,2.pdf等)的重命名文件夹中。我要做的是使它可以容纳Location中的嵌套目录,但是我对PS还是一个新手,不知道如何在维护count变量的同时执行此操作。
这是我所拥有的:
Set-Location -path "C:\Users\mmcintyre\Desktop\test pdfs"
Get-ChildItem *.pdf |
ForEach-Object -Begin { $count = 1 } -Process {
Copy-Item -LiteralPath $_ -Destination ".\renamed\$count.pdf";
Write-Host "Renamed $($_.fullname) to $count.pdf"
$count++
}
任何帮助将不胜感激。
编辑:正如我在Powershell = <2.0上一样,除了“递归”外,我还需要使用以下内容:
Get-ChildItem -Path .\* -Include *.pdf -Recurse |
现在可以使用。希望这对其他人有帮助。
答案 0 :(得分:0)
这是简化的PSv2 +解决方案:
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse |
Copy-Item -WhatIf -Destination { '.\renamed\{0}.pdf' -f ++$countRef.Value }
-WhatIf
预览复制操作;删除它以执行实际的复制。
与您的解决方案一样,遍历整个目录子树需要-Recurse
。
-Filter
代替-Include
,因为它是:
.\*
作为输入路径的解决方法(因为-Include
模式仅适用于指定的最后一个路径分量 )Get-ChildItem *.pdf -Recurse
,在这种情况下,*.pdf
隐式绑定到-Path
参数;但是,您已经注意到,这在PSv2中不起作用(但是使用-Filter
可以)。一个 script-block参数用于指定目标路径,从而无需进行更慢的ForEach-Object
调用。
[ref]
实例作为序列号值的持有者,并且需要通过.Count
访问该值。
-Destination
的脚本块在 child 变量范围内运行,而不是在调用者的范围内运行(传递给ForEach-Object
的脚本块的方式是);这种差异将在this GitHub issue中进行讨论。