将文件上移一个文件夹级别
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 $files
或 Get-ChildItem *\*\*\*
来枚举文件。
FileInfo
对象没有 属性 Parent
,只有 DirectoryInfo
对象有。对 FileInfo
个对象使用 属性 Directory
。此外,点访问通常可以菊花链式连接,因此不需要所有括号。
不是错误,而是过于复杂:Move-Item
可以直接从管道中读取,所以你不需要把它放在一个循环中。
将您的代码更改为类似这样的代码,它将执行您想要的操作:
$files = Get-ChildItem '*\*\*'
Get-ChildItem $files | Move-Item -Destination { $_.Directory.Parent.FullName }
$files | Remove-Item -Recurse
我有一个名为 "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 $files
或Get-ChildItem *\*\*\*
来枚举文件。FileInfo
对象没有 属性Parent
,只有DirectoryInfo
对象有。对FileInfo
个对象使用 属性Directory
。此外,点访问通常可以菊花链式连接,因此不需要所有括号。
不是错误,而是过于复杂:Move-Item
可以直接从管道中读取,所以你不需要把它放在一个循环中。
将您的代码更改为类似这样的代码,它将执行您想要的操作:
$files = Get-ChildItem '*\*\*'
Get-ChildItem $files | Move-Item -Destination { $_.Directory.Parent.FullName }
$files | Remove-Item -Recurse