【问题标题】:Batch file to move files to folders named with year and month from modification date批处理文件将文件移动到以修改日期起年和月命名的文件夹
【发布时间】:2014-12-29 20:53:04
【问题描述】:

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

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

以上文件名代表我正在使用的文件。

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

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

当我运行测试命令时:for /f %a in ("E:\backups\test*.*") do set 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>

我在这里缺少什么来完成这项工作?我确定这很简单。也许我只是太累了,无法接受它。

【问题讨论】:

    标签: sorting date batch-file for-loop move


    【解决方案1】:

    您没有在robocopy 行中说明!filedate! 参数应该做什么。

    如果没有/mindate: 开关(或其他),那么!filedate! 将被视为文件规范,我猜你没有名为"12/29/2014 12:44 PM" 的文件——顺便说一句,它与%%~ta 相同(那么为什么要使用 !filedate!`?)

    【讨论】:

    • 我没有在 Robocopy 命令中使用日期参数。 !文件日期!与 %filedate% 相同。它用于循环函数。
    • robocopy 行将被解析为robocopy "E:\backups\test" /XX /r:10 E:\backups\test\201412\ "12/29/2014 12:44 PM" /MOV &gt;&gt; C:\scripts\logs\logfile.name.yyyymmdd_hhmm.log。我认为 robocopy 语法无效,因为 "12/29/2014 12:44 PM" 不是有效的文件掩码。
    • 我明白你的意思。当我尝试使用 !filedate! 时,我的逻辑出现错误。代替。我已更正此问题,因此将返回完整的文件名,这正是我想要的。但是,我的主要字符串值仍未设置。这只是证明我确实太累了,看不到简单的东西。
    【解决方案2】:

    您可以使用 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
    

    【讨论】:

    • 这是我所拥有的更好的解决方案。我的是为网络移动而设计的,你的更好,因为它更适合本地移动。我收到日期文件夹名称错误:移动“LocalId=99a73-f852d-407907-98ce-4ab02dde5b41_SessionId=999999.flv”“E:\backups\test\%c%b”
    • 使用echo move "%dir%\%%a" "%dir%\%%c%%b" &amp; pause 看看生成了什么。错误信息是什么?
    • 对此进行了进一步调查。它只处理第一个文件然后停止。错误如下:文件名、目录名或卷标语法不正确。长而时髦的文件名似乎存在问题。我会多玩一点,看看能做些什么。
    • 如果你粘贴echo版本给你的信息,那么给你建议会更容易。您可以直接检查目录\文件名以查看问题所在 - 例如错误位置的空格 - 或者您在某处添加了引号。
    • 结果是: echo move "E:\backups\test\E:\backups\test*.flv" "E:\backups\test\201405" & pause。 %%a 返回文件的路径,这很奇怪。将 echo move "%dir%\%%a" "%dir%\%%c%%b" & pause 更改为 echo move "%%a" "%dir%\%%c%%b" & pause,其中消除了问题的第一部分。现在的结果是: move "E:\backups\test*.flv" "E:\backups\test\201405" & pause 将所有文件移动到创建的第一个文件夹中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多