脚本创建每月文件夹并每月将文件移动到它

时间:2018-03-15 21:22:24

标签: powershell

我有一个业务要求,每月将一些文件移动到类似于下面的文件夹格式。我之前使用过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所以文件夹说上个月名称不是当前月份名称?

谢谢,

3 个答案:

答案 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)

我设法找到了答案,谢谢你的帮助。

我已使用代码更新了我的帖子。

再次感谢