Sorting 批处理文件,将文件移动到从修改日期起以年和月命名的文件夹中

Sorting 批处理文件,将文件移动到从修改日期起以年和月命名的文件夹中,sorting,date,batch-file,for-loop,move,Sorting,Date,Batch File,For Loop,Move,我有数千个文件需要移动到以修改日期的年份和月份命名的文件夹中。我以前成功地完成了这项工作,但由于某些原因,它失败了,因为没有设置主字符串值。以下是我所拥有的: 包含3个文件的测试文件夹。所有文件都有很长的名称。例如: LocalId=99a73-f852d-407907-98ce-4AB02DDEB41_SessionId=999999.flv 上面的文件名代表我正在处理的文件 它们存在于一个文件夹中:E:\backups\test 它们是此文件夹中唯一的项目 当我运行test命令时:对于中的/

我有数千个文件需要移动到以修改日期的年份和月份命名的文件夹中。我以前成功地完成了这项工作,但由于某些原因,它失败了,因为没有设置主字符串值。以下是我所拥有的:

包含3个文件的测试文件夹。所有文件都有很长的名称。例如: LocalId=99a73-f852d-407907-98ce-4AB02DDEB41_SessionId=999999.flv

上面的文件名代表我正在处理的文件

它们存在于一个文件夹中:E:\backups\test

它们是此文件夹中唯一的项目

当我运行test命令时:对于中的/f%a(“E:\backups\test**”),请设置filedate=%~ta

返回正确的信息:set filedate=12/29/2014 12:44 PM

我的批处理文件如下所示:

@rem ############################################################
@rem SETTING TIME AND DATE PARAMETERS FOR CREATION OF LOG FILES
set hr=%time:~0,2%
if "%hr:~0,1%" equ " " set hr=0%hr:~1,1%
set outFile=%date:~-4,4%%date:~-10,2%%date:~-7,2%_%hr%%time:~3,2%%time:~6,2%
@rem ############################################################
@rem ############################################################
@rem SETTING PATHS FOR PROCESSING LOG FILES
SETLOCAL ENABLEDELAYEDEXPANSION
SET dir=E:\backups\test
SET logDir=C:\scripts\logs
SET datesort=%logDir%\logfile.name.%outFile%.log
@rem ############################################################
@rem PARSING FILE MODIFIED DATE FOR YEAR AND MONTH
@rem CALLS PROCESS TO SET YEAR AND MONTH
@rem MOVES FILES INTO DATED FOLDERS
@rem ROBOCOPY TAKES CARE OF FOLDER CREATION AUTOMATICALLY
@rem SETS YEAR AND MONTH
FOR /f %%a IN ('dir /b /a-d "%dir%\*.flv" ') DO (
 SET "filedate=%%~ta"
  CALL :finddate
  robocopy "%dir%" /XX /r:10 %dir%\!year!!month!\ "!filedate!" /MOV >> %datesort%
)
GOTO sendmail
:finddate
SET year=%filedate:~6,4%
SET month=%filedate:~0,2%
GOTO :EOF
GOTO finddate
:sendmail
@rem ############################################################
@rem SENDING MAIL NOTIFICATION WITH LOG
<command for sending email notification>
@rem############################################################
@rem设置创建日志文件的时间和日期参数
设置hr=%time:~0,2%
如果“%hr:~0,1%”“eq”设置hr=0%hr:~1,1%
设置输出文件=%date:~-4,4%%日期:~-10,2%%日期:~-7,2%\u%hr%%时间:~3,2%%时间:~6,2%
@雷姆############################################################
@雷姆############################################################
@rem设置处理日志文件的路径
SETLOCAL ENABLEDELAYEDEXPANSION
SET dir=E:\backups\test
设置logDir=C:\scripts\logs
SET datesort=%logDir%\logfile.name.%outFile%.log
@雷姆############################################################
@rem解析年和月的文件修改日期
@rem调用进程来设置年份和月份
@rem将文件移动到已过时的文件夹中
@rem ROBOCOPY负责自动创建文件夹
@rem设置年份和月份
对于('dir/b/a-d”%dir%\*.flv“')中的/f%%a,请执行以下操作(
设置“filedate=%%~ta”
电话:finddate
机器人复制“%dir%”/XX/r:10%dir%\!year!!month!\“!filedate!”/MOV>>%datesort%
)
转到sendmail
:finddate
设置年份=%filedate:~6,4%
设置月份=%filedate:~0,2%
后藤:EOF
后藤芬达
:sendmail
@雷姆############################################################
@rem使用日志发送邮件通知

我在这里错过了什么让这一切成功?我相信这很简单。也许我只是太累了,没法继续

你没说什么
!文件日期参数应该在
robocopy
行中执行


如果没有
/mindate:
开关(或任何东西),那么
!文件日期
将被视为文件规范,我猜您没有名为
“12/29/2014 12:44 PM”
-顺便说一句,这与
%%~ta
相同(为什么要使用!filedate!`?

您可以使用for元变量,而无需将它们设置为环境变量

不需要延迟扩展

@echo off
@rem ############################################################
@rem SETTING TIME AND DATE PARAMETERS FOR CREATION OF LOG FILES
set hr=%time:~0,2%
if "%hr:~0,1%" equ " " set hr=0%hr:~1,1%
set outFile=%date:~-4,4%%date:~-10,2%%date:~-7,2%_%hr%%time:~3,2%%time:~6,2%
@rem ############################################################
@rem ############################################################
@rem SETTING PATHS FOR PROCESSING LOG FILES
SET dir=E:\backups\test
SET logDir=C:\scripts\logs
SET datesort=%logDir%\logfile.name.%outFile%.log
@rem ############################################################
@rem PARSING FILE MODIFIED DATE FOR YEAR AND MONTH
@rem MOVES FILES INTO DATED FOLDERS
FOR /f "delims=" %%a IN ('dir /b /a-d "%dir%\*.flv" ') DO (
  for /f "tokens=1,3 delims=/\. " %%b in ("%%~ta") do (
     md "%dir%\%%c%%b" 2>nul
     move "%dir%\%%a" "%dir%\%%c%%b"
  )
)
@rem ############################################################
@rem SENDING MAIL NOTIFICATION WITH LOG
:: <command for sending email notification>
pause
@echo关闭
@雷姆############################################################
@rem设置创建日志文件的时间和日期参数
设置hr=%time:~0,2%
如果“%hr:~0,1%”“eq”设置hr=0%hr:~1,1%
设置输出文件=%date:~-4,4%%日期:~-10,2%%日期:~-7,2%\u%hr%%时间:~3,2%%时间:~6,2%
@雷姆############################################################
@雷姆############################################################
@rem设置处理日志文件的路径
SET dir=E:\backups\test
设置logDir=C:\scripts\logs
SET datesort=%logDir%\logfile.name.%outFile%.log
@雷姆############################################################
@rem解析年和月的文件修改日期
@rem将文件移动到已过时的文件夹中
对于/f“delims=“%%a IN('dir/b/a-d”%dir%\*.flv“'),请执行以下操作:(
对于/f“tokens=1,3 delims=/\.”中的%%b(“%%~ta”)do(
md“%dir%\%%c%%b”2>nul
移动“%dir%\%%a”“%dir%\%%c%%b”
)
)
@雷姆############################################################
@rem使用日志发送邮件通知
:: 
暂停

这是一个比我所拥有的更好的解决方案。我的是为网络迁移而设计的,你的更好,因为它适合本地迁移。我在注明日期的文件夹名称上收到一个错误:move“LocalId=99a73-f852d-407907-98ce-4ab02dde5b41\u SessionId=999999.flv”“E:\backups\test\%c%b”使用
回送移动“%dir%\%a”“%dir%\%c%%b”&pause
查看生成了什么。错误消息是什么?对此进行了进一步的调查。它只处理第一个文件,然后停止。错误如下:文件名、目录名或卷标语法不正确。它似乎在长而时髦的文件名方面有问题。我会再玩一会儿,看看能做些什么。如果你粘贴
echo
版本提供给你的信息,那么给你建议就会更容易。您可以直接检查目录\文件名,以查看是否有错误(例如错误位置的空格),或者在某处添加了引号。结果是:echo移动“E:\backups\test\E:\backups\test*.flv”“E:\backups\test\201405”&暂停%%a正在返回文件的路径,这是奇数。将回显移动“%dir%\%%a”“%dir%\%%c%%b”和暂停更改为回显移动“%%a”“%dir%\%%c%%b”和暂停,从而消除了问题的第一部分。现在的结果是:移动“E:\backups\test*.flv”“E:\backups\test\201405”&暂停,将所有文件移动到创建的第一个文件夹中。我在robocy命令中没有使用日期参数!文件日期!与%filedate%相同。它用于循环函数。
robocopy
行随后将解析为
robocopy“E:\backups\test”/XX/r:10 E:\backups\test\201412\“12/29/2014 12:44 PM”/MOV>>C:\scripts\logs\logfile.name.yyyymmdd\u hhmm.log
。我认为这是无效的
robocopy
语法,因为
“12/29/2014 12:44 PM”
不是有效的文件掩码。我明白你的意思。当我试图使用时,我的逻辑有一个错误!文件日期!而不是%%a。我已经纠正了这一点,所以完整的文件名将被返回,这是我想要的。但是,我的主字符串值仍然没有设置。这正好证明我实在太累了,看不到简单的事情。