将文件上移一个文件夹级别

Move files up one folder level

我有一个名为 "April reports" 的文件夹,其中包含每个月的每一天的文件夹。然后每个文件夹包含另一个包含 PDF 文件的文件夹:

April reports
├─01-04-2018
│ └─dayreports
│   ├─approved.pdf
│   └─unapproved.pdf
│
├─02-04-2018
│ └─dayreports
│   ├─approved.pdf
│   └─unapproved.pdf
╎
╎
└─30-04-2018
  └─dayreports
    ├─approved.pdf
    └─unapproved.pdf

PDF 每天都有相同的名称,所以我要做的第一件事就是将它们上移一个级别,这样我就可以使用包含日期的文件夹名称来重命名每个文件,使其包含日期.我试过的脚本是这样的(路径设置在"April Reports"):

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

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

应该这样做:

$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 $_
    }
}

您的代码中有 2 个错误:

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

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

不是错误,而是过于复杂:Move-Item可以直接从管道中读取,所以你不需要把它放在一个循环中。

将您的代码更改为类似这样的代码,它将执行您想要的操作:

$files = Get-ChildItem '*\*\*'
Get-ChildItem $files | Move-Item -Destination { $_.Directory.Parent.FullName }
$files | Remove-Item -Recurse