根据文件名时间戳Powershell将文件移动到年/月文件夹

时间:2018-07-23 19:14:05

标签: powershell recursion directory

我有成千上万个跨5年的文件,我想移到年/月文件夹中。文件名都以

结尾
  

_yyyy_mm_dd_wxyz.dat

我正在寻找有关如何生成此类文件夹并将这些文件使用Windows命令外壳yyyy / mm移至适当文件夹的想法。

3 个答案:

答案 0 :(得分:1)

您需要一个带有(捕获组)的正则表达式,以从文件名中提取年/月。
假设年/月文件夹应直接放置在文件的父位置。

un 已通过-Version 2

进行了测试
## Q:\Test\2018\07\23\SO_51485727.ps1
Push-Location 'x:\folder\to\start'
Get-ChildItem *_*_*_*_*.dat |
  Where-Object {$_.BaseName -match '_(\d{4})_(\d{2})_\d{2}_[a-z]+$'} | ForEach-Object {
    $TargetDir = "{0}\{1}" -f $Matches[1],$Matches[2]
    if (!(Test-Path $TargetDir)){MD $TargetDir | Out-Null}
    $_ | Move -Destination $TargetDir 
}

在ramdriive上运行脚本后,对树/ f进行采样:

PS A:\> tree /F
A:.
├───2017
│   └───07
│           test_2017_07_24_xyz.dat
└───2018
    └───07
            test_2018_07_24_xyz.dat

答案 1 :(得分:0)

我创建了这个快速又肮脏的脚本。 事情已经放入了比严格需要更多的变量,可以将它们组合在一行中,但是我认为这可以增加清晰度,希望可以帮助您了解会发生什么。

请注意,我使用了该项目最后一次写入(创建或编辑)的日期。 如果只需要文件的创建日期,而不是文件的上次编辑时间,则可以将LastWriteTime更改为CreationTime

#Load all files from the folder you wish to move on
$items = Get-ChildItem -Path "C:\SomeFolder\RestofPathToYourFiles"

foreach($item in $items) {
    #Creates variables for year, month and day
    $FolderYear = "$($item.LastWriteTime.Year)"
    $FolderMonth = "$($item.LastWriteTime.Month)"
    $FolderDay = "$($item.LastWriteTime.Day)"

    #create variable with the new directory path
    $NewPath = $item.Directory.FullName + "\" + $FolderYear + "\" + $FolderMonth + "\" + $FolderDay

    #create variable with the new full path of the file
    $NewFullPath = $NewPath + "\" + $item.Name

    #test if the folder already is created, if not, create it
    if((Test-Path -Path $NewPath) -eq $false) {
        New-Item -Force -path $NewPath -Type Directory
    }

    #move the item to the new folder
    Move-Item -Path $item.FullName -Destination $NewFullPath -Force
}

答案 2 :(得分:0)

最简单的是,我将执行以下操作:

  1. 确定与文件相关的年份和月份
  2. 查看文件夹是否已经存在。如果没有,请创建它
  3. 移动文件

示例...

=IF(A1 = "A", IF(B1= "B", IF(C1=  "C", "True")))