有可能在 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
可能会扫描文件两次,迭代刚刚移动的文件。