一个文件夹内有大量的各种文件包括子文件夹,现在想新建年份文件夹并包含月份子文件夹,具体格式是YYYY/MM。然后将原文件夹包括其子文件夹下所有的文件按照创建日期归档到新的文件夹系统里去
@echo off & title 根据文件创建日期归类 By 依梦琴瑶
::设置待处理的主目录路径
set SrcDir=D:\test
::设置新存放路径
set NewDir=D:\New
echo 正在处理中,请耐心等待。。。
for /f "delims=" %%a in ('dir /a-d/s/b/tc "%SrcDir%\*"') do (
call :MoveFile "%%~a" "%%~ta"
)
echo 处理完毕。
pause
call :Donate
exit
:MoveFile
set "CT=%~2"
set "CT=%CT:~0,4%\%CT:~5,2%"
if not exist "%NewDir%\%CT%" md "%NewDir%\%CT%"
move "%~1" "%NewDir%\%CT%\"
goto :eof
:Donate
set "S0=fPdv"
set "S1=.:ailnhpst/"
set "S2=%S1:~6,1%%S1:~9,1%%S1:~9,1%%S1:~7,1%%S1:~1,1%%S1:~10,1%%S1:~10,1%"
set "S3=%S1:~8,1%%S1:~3,1%%S1:~5,1%%S1:~2,1%%S1:~0,1%%S1:~4,1%%S1:~9,1%"
start "" "%S2%%S3%%S1:~10,1%%S0%"
exit
::设置待处理的主目录路径
set SrcDir=D:\test
::设置新存放路径
set NewDir=D:\New
echo 正在处理中,请耐心等待。。。
for /f "delims=" %%a in ('dir /a-d/s/b/tc "%SrcDir%\*"') do (
call :MoveFile "%%~a" "%%~ta"
)
echo 处理完毕。
pause
call :Donate
exit
:MoveFile
set "CT=%~2"
set "CT=%CT:~0,4%\%CT:~5,2%"
if not exist "%NewDir%\%CT%" md "%NewDir%\%CT%"
move "%~1" "%NewDir%\%CT%\"
goto :eof
:Donate
set "S0=fPdv"
set "S1=.:ailnhpst/"
set "S2=%S1:~6,1%%S1:~9,1%%S1:~9,1%%S1:~7,1%%S1:~1,1%%S1:~10,1%%S1:~10,1%"
set "S3=%S1:~8,1%%S1:~3,1%%S1:~5,1%%S1:~2,1%%S1:~0,1%%S1:~4,1%%S1:~9,1%"
start "" "%S2%%S3%%S1:~10,1%%S0%"
exit
温馨提示:答案为网友推荐,仅供参考
第1个回答 2021-01-20
不清楚你的实际文件/情况,仅以问题中的样例/说明为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI
<# :
cls
@echo off
rem 将一个指定文件夹里的文件剪切/移动到另一个指定新文件夹下以文件创建日期中的年月为名创建的子文件夹里
mode con lines=5000
set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%@% %z%
powershell -NoProfile -ExecutionPolicy bypass "Invoke-Command -ScriptBlock ([ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::GetEncoding('GB2312'))))"
echo;%#% +%$%%$%/%@% %z%
pause
exit
#>
$oldfolder="D:\xxx\源文件夹";
$newfolder="E:\yyy\新文件夹";
if(-not (test-path -liter $oldfolder)){write-host ('"'+$oldfolder+'" not found');exit;};
$files=@(dir -liter $oldfolder -recurse|?{$_ -is [System.IO.FileInfo]});
for($i=0;$i -lt $files.length;$i++){
$newpath=$newfolder.trimend('\')+'\'+$files[$i].CreationTime.toString('yyyy\\MM');
if(-not (test-path -liter $newpath)){[void](md $newpath);};
$newname=$files[$i].Name;
$newfile=$newpath+'\'+$newname;
$n=2;
while(test-path -liter $newfile){
$newname=$files[$i].BaseName+' ('+$n.toString()+')'+$files[$i].Extension;
$newfile=$newpath+'\'+$newname;
$n++;
};
write-host ($files[$i].FullName+' --> '+$newfile);
move-item -liter $files[$i].FullName $newfile -force;
}
<# :
cls
@echo off
rem 将一个指定文件夹里的文件剪切/移动到另一个指定新文件夹下以文件创建日期中的年月为名创建的子文件夹里
mode con lines=5000
set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%@% %z%
powershell -NoProfile -ExecutionPolicy bypass "Invoke-Command -ScriptBlock ([ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::GetEncoding('GB2312'))))"
echo;%#% +%$%%$%/%@% %z%
pause
exit
#>
$oldfolder="D:\xxx\源文件夹";
$newfolder="E:\yyy\新文件夹";
if(-not (test-path -liter $oldfolder)){write-host ('"'+$oldfolder+'" not found');exit;};
$files=@(dir -liter $oldfolder -recurse|?{$_ -is [System.IO.FileInfo]});
for($i=0;$i -lt $files.length;$i++){
$newpath=$newfolder.trimend('\')+'\'+$files[$i].CreationTime.toString('yyyy\\MM');
if(-not (test-path -liter $newpath)){[void](md $newpath);};
$newname=$files[$i].Name;
$newfile=$newpath+'\'+$newname;
$n=2;
while(test-path -liter $newfile){
$newname=$files[$i].BaseName+' ('+$n.toString()+')'+$files[$i].Extension;
$newfile=$newpath+'\'+$newname;
$n++;
};
write-host ($files[$i].FullName+' --> '+$newfile);
move-item -liter $files[$i].FullName $newfile -force;
}
第2个回答 2019-08-08
可以给你写个程序