Powershell脚本复制和顺序重命名文件

时间:2018-08-14 20:48:23

标签: powershell

我正在编写一个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 |

现在可以使用。希望这对其他人有帮助。

1 个答案:

答案 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模式仅适用于指定的最后一个路径分量
    • 可以在我的this answer中找到说明。
    • 还要注意,在PSv3 +中,您也可以使用Get-ChildItem *.pdf -Recurse,在这种情况下,*.pdf隐式绑定到-Path参数;但是,您已经注意到,这在PSv2中不起作用(但是使用-Filter可以)。
  • 一个 script-block参数用于指定目标路径,从而无需进行更慢的ForEach-Object调用。

    • 请注意,需要一个[ref]实例作为序列号值的持有者,并且需要通过.Count访问该值。
      • 这是必需的,因为传递给-Destination的脚本块在 child 变量范围内运行,而不是在调用者的范围内运行(传递给ForEach-Object的脚本块的方式是);这种差异将在this GitHub issue中进行讨论。