将文件上移一级文件夹

时间:2018-07-15 09:14:33

标签: powershell directory parent file-move

我有一个名为“四月报告”的文件夹,其中包含一个月中每一天的文件夹。然后,每个文件夹都包含另一个包含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每天都有相同的名称,所以我要做的第一件事是将它们上移一个级别,这样我就可以使用包含日期的文件夹名称来重命名每个文件,以便包含日期。我尝试过的脚本是这样的(在“四月报告”中设置了路径):

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

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

3 个答案:

答案 0 :(得分:3)

您的代码中有2个错误:

  • 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

答案 1 :(得分: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 $_
    }
}

答案 2 :(得分:0)

April reports目录中运行以下脚本,将文件上移一级。

Get-ChildItem -Recurse -Filter "dayreports" | Get-ChildItem | Move-Item -Destination {$_.Directory.Parent.FullName}

以下行将删除dayreports。将文件移到父文件夹后,请使用它。您可以检查`dayreports'是否为空。假设您已经移动了文件,我将跳过这一部分。

Get-ChildItem -Recurse -Filter "dayreports" | Remove-Item -Recurse

要使其成为一个衬板,就-

Get-ChildItem -Recurse -Filter "dayreports" | Get-ChildItem | Move-Item -Destination {$_.Directory.Parent.FullName}; Get-ChildItem -Recurse -Filter "dayreports" | Remove-Item -Recurse