我有一个业务要求,每月将一些文件移动到类似于下面的文件夹格式。我之前使用过powershell将文件移动到已经存在的文件夹中,我已经阅读了一些关于PowerShell创建和命名文件夹的内容,但有没有办法每月进行一次而不更改它每个月创建的文件夹名称?
Client 1
Reports 2018
01Jan
02Feb
03Mar
etc.
Client 2
Reports 2018
01Jan
02Feb
03Mar
etc.
理想情况下,它将是一个脚本,它将为其运行的月份创建一个文件夹,然后将当月创建/修改的目录中的所有文件移动到其月份文件夹中。
这可能吗?
我尝试过的一些代码:
Get-ChildItem \\test\d$\Reports*.xlsx -Recurse | foreach {
$x = $_.LastWriteTime.ToShortDateString()
$new_folder_name = Get-Date $x -Format yyyy.MM
$des_path = "c:\test\test2\$new_folder_name"
if (test-path $des_path){
move-item $_.fullname $des_path
} else {
new-item -ItemType directory -Path $des_path
move-item $_.fullname $des_path
}
}
::
cd "\\test\d$\Reports\client1"
$fso = new-object -ComObject scripting.filesystemobject
$fso.CreateFolder("\03Mar")
cd "\\test\d$\Reports\client2"
$fso = new-object -ComObject scripting.filesystemobject
$fso.CreateFolder("\03Mar")
重复20个客户,但正如你所知,每个月都很难跟上,因为你必须更新03到04并且到3月和更进一步。
编辑: 根据要求,结构如下:
Client 1 - folder
Saved Reports - folder
2017 - folder
01Jan - folder
report 1
02Feb - folder
2018 - folder
01Jan - folder
02Feb - folder
重复20多个客户
同样编辑:
# Get the files which should be moved, without folders
$files = Get-ChildItem '\\test\d$\Reports\client\saved reports' -Recurse | where {!$_.PsIsContainer}
# List Files which will be moved
$files
# Target Filder where files should be moved to. The script will automatically create a folder for the year and month.
$targetPath = '\\test\d$\Reports\client\2018 client reports'
foreach ($file in $files)
{
# Get year and Month of the file
# I used LastWriteTime since this are synced files and the creation day will be the date when it was synced
$year = $file.LastWriteTime.Year.ToString()
$month = $file.LastWriteTime.Month.ToString("00")
$monthname = (Get-Culture).DateTimeFormat.GetAbbreviatedMonthName($month)
# Out FileName, year and month
$file.Name
$year
$month
$monthname
# Set Directory Path
$Directory = $targetPath + "\" + $month + $monthname
# Create directory if it doesn't exsist
if (!(Test-Path $Directory))
{
New-Item $directory -type directory
}
# Move File to new location
$file | Move-Item -Destination $Directory
}
以上似乎有效,但我必须为每个客户提供这整个代码块,并且每次都必须更改年份,是否可以概括或不推广?
上次修改: 另外 - 有没有办法做$ month -1所以文件夹说上个月名称不是当前月份名称?
谢谢,
答案 0 :(得分:0)
您需要使用以下Cmdlet:
New-Item -Path $path -Name "$((Get-Date).Month)_$((Get-Date).Year)" -ItemType Directory
Get-ChildItem $directoryWTheFiles -File -Recurse | where {$_.CreationTime.Month -eq ((Get-Date).Month) -or $_.LastWriteTime.Month -eq ((Get-Date).Month)} | Move-Item -Destination $dest
我还没有对它进行测试,但这可以让你在该脚本上完成70%的完成。
答案 1 :(得分:0)
这是我到目前为止所做的......这只是Roque Sosa答案的扩展
$folderName = "$(Get-Date -format MM)$(Get-Date -format MMM)"
New-Item -Path $path -Name $folderName -ItemType Directory
$destination = "$path/$folderName/"
Get-ChildItem $directoryWTheFiles -File -Recurse |
Where-Object {$_.LastWriteTime.Month -eq ((Get-Date).Month) -and $_.LastWriteTime.Year -eq ((Get-Date).Year)} |
Move-Item -Destination $destination
这至少会使文件夹名称格式正确,如上所示。然后它还会移动与lastwritetime属性的月份和年份匹配的文件。 一旦您向我提供了您正在搜索的客户端文件夹的结构,我就可以根据您的具体情况更新。
答案 2 :(得分:0)
我设法找到了答案,谢谢你的帮助。
我已使用代码更新了我的帖子。
再次感谢