按日期组织文件并将其放入目录中

按日期组织文件并将其放入目录中

有可能在 Windows 上做出这样的事情吗?我有在不同日期创建的文件。例如:

test.txt   01.09.2015 11:56
test2.txt  04.11.2016 12:23
test3.txt  04.11.2016 12:24
.
.
.
test100.txt 02.02.2012 18:34

我想把每个文件放在一个以创建日期命名的文件夹中。例如:

move test.txt to folder "01.09.2015"
move test2.txt and test3.txt to folder "04.11.2016"
etc

一切都在一个目录中。

答案1

我会这样做 - 而不是比较 DateTime 对象,只需使用该.toshortdatestring()方法:

$location = "C:\install"
gci $location -file | % { 
    $date = $_.creationtime.toshortdatestring()
    $fullpath = "$location\$date"
    if (!(Test-Path $fullpath)) { mkdir $fullpath }
    move-item $_.FullName $fullpath -Force
}

这将查找中的所有文件$location,获取每个对象的创建日期,test-path如果文件夹已存在,则创建它,如果不存在,则将文件移动到该文件夹​​中。

答案2

假设你从包含文件的文件夹运行此程序,

# get unique creation dates of files in the current working directory
$dates = Get-ChildItem * | Select-Object -ExpandProperty CreationTime | Get-Date -Format "MM-dd-yyyy" | Sort-Object -Unique

foreach ($date in $dates) {
    # create directories based on the date
    New-Item -ErrorAction Ignore -ItemType Directory $date
}

# get each file's creation date
$files = Get-ChildItem -File

foreach ($file in $files) {
    # get the file's creation date (the folder to move to)
    $folder = $file | Select-Object -ExpandProperty CreationTime | Get-Date -Format "MM-dd-yyyy"
    Move-Item $file $folder
}

答案3

这个 GitHub 项目完全符合您的要求,并且具有最新版本的代码。以下是派生的 PowerShell 脚本,它将执行您想要的操作:

[string] $SourceDirectoryPath = 'C:\FilesToMove'
[string] $TargetDirectoryPath = 'C:\SortedFiles'

[System.Collections.ArrayList] $filesToMove = Get-ChildItem -Path $SourceDirectoryPath -File -Force -Recurse

$filesToMove | ForEach-Object {
    [System.IO.FileInfo] $file = $_

    [DateTime] $fileDate = $file.LastWriteTime
    [string] $dateDirectoryName = $fileDate.ToString('yyyy-MM-dd')
    [string] $dateDirectoryPath = Join-Path -Path $TargetDirectoryPath -ChildPath $dateDirectoryName

    if (!(Test-Path -Path $dateDirectoryPath -PathType Container))
    {
        Write-Verbose "Creating directory '$dateDirectoryPath'."
        New-Item -Path $dateDirectoryPath-ItemType Directory -Force > $null
    }

    [string] $filePath = $file.FullName
    Write-Information "Moving file '$filePath' into directory '$dateDirectoryPath'."
    Move-Item -Path $filePath -Destination $dateDirectoryPath
}

请注意,它会先将文件路径复制到数组中,然后再对其进行迭代。这对于将文件复制到其当前目录的子目录的情况非常重要,否则Get-ChildItem可能会扫描文件两次,迭代刚刚移动的文件。

相关内容