6

我有一个名为“四月报告”的文件夹,其中包含一个月中每一天的文件夹。然后每个文件夹包含另一个包含 PDF 文件的文件夹:

四月报告
├─01-04-2018
│ └─dayreports
│ ├─approved.pdf
│ └─unapproved.pdf
│
├─02-04-2018
│ └─dayreports
│ ├─approved.pdf
│ └─unapproved.pdf
╎
╎
└─30-04-2018
  └─dayreports
    ├─批准.pdf
    └─未经批准.pdf

PDF 每天都有相同的名称,所以我要做的第一件事就是将它们上移一层,以便我可以使用包含日期的文件夹名称来重命名每个文件,使其包含日期。我尝试过的脚本是这样的(路径设置为“四月报告”):

$files = Get-ChildItem *\*\*
Get-ChildItem *\*\* | % {
    Move-Item $_.FullName (($_.Parent).Parent).FullName
}
$files | Remove-Item -Recurse

删除额外文件夹“dayreports”的步骤有效,但文件尚未移动。

4

2 回答 2

8

您的代码中有两个错误:

  • Get-ChildItem *\*\*枚举dayreport文件夹(这就是文件夹删除起作用的原因),而不是其中的文件。您需要Get-ChildItem $filesGet-ChildItem *\*\*\*枚举文件。

  • FileInfo对象没有属性Parent,只有DirectoryInfo对象有。Directory使用对象的属性FileInfo。此外,点访问通常可以是菊花链,因此不需要所有括号。

不是错误,而是过于复杂:Move-Item可以直接从管道中读取,因此您无需将其放入循环中。

把你的代码改成这样,它会做你想做的事:

$files = Get-ChildItem '*\*\*'
Get-ChildItem $files | Move-Item -Destination { $_.Directory.Parent.FullName }
$files | Remove-Item -Recurse
于 2018-07-15T10:53:50.050 回答
0

这样的事情应该这样做:

$rootPath = "<FULL-PATH-TO-YOUR-April reports-FOLDER>"

Get-ChildItem -Path $rootPath -Directory | ForEach-Object {
    # $_ now contains the folder with the date like '01-04-2018'
    # this is the folder where the .pdf files should go
    $targetFolder = $_.FullName
    Resolve-Path "$targetFolder\*" | ForEach-Object {
        # $_ here contains the fullname of the subfolder(s) within '01-04-2018'
        Move-Item -Path "$_\*.*" -Destination $targetFolder -Force
        # delete the now empty 'dayreports' folder
        Remove-Item -Path $_
    }
}
于 2018-07-15T10:10:20.900 回答