我有一个名为“四月报告”的文件夹,其中包含一个月中每一天的文件夹。然后,每个文件夹都包含另一个包含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”的步骤有效,但是文件尚未移动。
答案 0 :(得分:3)
您的代码中有2个错误:
Get-ChildItem *\*\*
枚举dayreport
文件夹(这就是删除文件夹的原因),而不是其中的文件。您需要Get-ChildItem $files
或Get-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