【问题标题】:Batch Scripting Moving files with timestamp批处理脚本移动带有时间戳的文件
【发布时间】:2014-07-25 04:07:39
【问题描述】:

所以基本上我有一个文件系统 C:\Test\BaseLine。在 BaseLine 文件夹下我有很多文件夹,可能是一个文件夹或 15 个文件夹,在这些文件夹中是图像文件。我想将不包括 BaseLine 文件夹的 INSIDE 文件夹中的所有图像复制到另一个位置,即 C:\Test\Achieve Images,每个图像末尾的日期戳为 03-07-2014。

例如,我会有这样的文件夹系统:
基线 - 1.jpg、2.jpg
->[文件夹 123] - 3.jpg, 4.jpg
->[文件夹 321] - 5.jpg, 6.jpg

在我的脚本结束时,我的 C:\Test\Achieve 图像应该具有这些图像,如下所示:
实现图像 - 3_03-07-2014.jpg、4_03-07-2014.jpg、5_03-07-2014.jpg、6_03-07-2014.jpg

注意它不包含任何 BaseLine 主文件夹图像。

到目前为止,我有一个这样的脚本:

cd /d "C:\Test\BaseLine\" @SET DATE_FOLDER=%date:~7,2%-%date:~4,2%-%date:~10,4% SET "ACHIEVE_DIR=C:\Test\Master Achieve" for /d %%a in ("*") do xcopy "%%a\*.*" "%ACHIEVE_DIR%\" /s/h/e/k/f/c/y
PS:此代码是在 [user] foxidrive 的帮助下完成的。再次感谢哥们解决我遇到的另一个问题!

这可行,但不会将时间戳附加到每个图像文件的末尾 谢谢!

【问题讨论】:

    标签: batch-file scripting move


    【解决方案1】:

    您无法使用 xcopy 执行此操作,但正如您在 cmets 中所述,这会在复制之前重命名文件。

    此代码的前四行将在 XP Pro 及更高版本中为您提供可靠的 YY DD MM YYYY HH Min Sec 变量。

    @echo off
    for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
    set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
    set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
    
    SET "DATE_FOLDER=%YYYY%%MM%%DD%"
    
    cd /d "C:\Test\BaseLine\"
    SET "ACHIEVE_DIR=C:\Test\Master Achieve" 
    md "%ACHIEVE_DIR%" 2>nul
    
    for /d %%a in (*) do (
    for /r %%b in ("%%a\*.jpg") do ren "%%~b" "%%~nb - %DATE_FOLDER%%%~xb"
    xcopy "%%a\*.jpg" "%ACHIEVE_DIR%\" /s/h/e/k/f/c/y
    )
    pause
    

    编辑代码将所有 *-tasty.jpg 文件移动到 %ACHIEVE_DIR% 并为其添加日期戳,然后删除 C:\Test\BaseLine\ 下的原始包含文件夹以及所有剩余文件,但将文件保留在 C:\Test\BaseLine\完好无损。

    @echo off
    for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
    set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
    set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
    
    SET "DATE_FOLDER=%YYYY%%MM%%DD%"
    
    cd /d "C:\Test\BaseLine\"
    SET "ACHIEVE_DIR=C:\Test\Master Achieve" 
    md "%ACHIEVE_DIR%" 2>nul
    
    for /d %%a in (*) do (
    for /r %%b in ("%%a\*-tasty.jpg") do move "%%~b" "%ACHIEVE_DIR%\%%~nb - %DATE_FOLDER%%%~xb"
    rd /s /q "%%a"
    )
    pause
    

    【讨论】:

    • 这是做什么的,它会在文件夹上创建另一个带有日期戳的文件夹。这不完全是我想要的,因为基本上我想查看“Master Achieve”文件夹,其中包含一个文件夹中的所有图像,甚至从去年开始。由于我不覆盖任何图像,这就是我放置日期戳的原因(它不必有日期戳,但它会更容易) - 我不介意在同一天覆盖它。但是我不想在年底查看很多文件夹。
    • 您需要额外的代码来为文件添加日期戳。一个问题是您不能只重命名存档文件夹中的每个文件,因为您已经说过有不止一代的文件。如果我可以在文件名中从未出现过的每个重命名文件名中添加一个字符串,例如--== 可能在日期戳之前,它可以相当容易地完成。这将允许代码识别哪些文件是新添加的,然后重命名它们。
    • 或者我想在移动之前重命名所有文件。 IE。在旧文件夹中重命名它们,然后将它们移动到 Master Achieve 文件夹...这是我到目前为止所拥有的 '@SET DATE_FOLDER=%date:~7,2%-%date:~4,2%
      设置folder=C:\Test\BaseLine\03-07-2014

      for /r "%folder%" %%n in (*) do call :renamefile "%%~nn" "%%~xn " "%%~dpn"
      转到 :EOF

      :renamefile
      ren "%~3\%~1" "%~1_%DATE_FOLDER%%"'
      然后有上面的代码移动我做错的所有文件
    • 由于某种原因它说系统找不到指定的路径。这么奇怪。在这行 `ren "C:\Test\BaseLine\03-07-2014\This is a test.jpg" "This is a test - 01-7/-.jpg"' 之后,日期格式也出现错误
    • 我发现它与 'SET DATE_FOLDER=%date:~7,2%-%date:~4,2%-%date:~10,4%' 如果我将其更改为 'SET DATE_FOLDER="TEST"' 工作正常,因此某些格式是错误的
    【解决方案2】:

    这行得通 -

    @echo off
    for /f "skip=1 delims=." %%i in ('wmic OS Get localdatetime') do set ts=%%i
    set dt=%ts:~6,2%-%ts:~4,2%-%ts:~0,4%
    
    set workdir=D:\test\baseline\
    set newdir=D:\test\Achieve\
    
    cd %workdir%
    
    for /f "delims=" %%i in ('dir /b /s *.jpg') do call :search "%%i"
    goto :eof
    
    :search
    set filepath=%~f1
    set dirpath=%~dp1
    set filename=%~n1
    set fileextn=%~x1
    if "%dirpath%" EQU "%workdir%" goto :eof
    copy /y "%filepath%" %newdir%\%filename%_%dt%%fileextn% >nul 2>&1
    
    :eof
    

    测试输出 -

    D:\>dir "d:\test\baseline", "d:\test\baseline\Folder 123", "d:\test\baseline\Folder 321"
     Volume in drive D is New Volume
     Volume Serial Number is B04C-AB59
    
     Directory of d:\test\baseline
    
    23/07/2014  21:24    <DIR>          .
    23/07/2014  21:24    <DIR>          ..
    23/07/2014  20:35                 2 1.jpg
    23/07/2014  20:35                 2 2.jpg
    23/07/2014  20:36    <DIR>          Folder 123
    23/07/2014  20:37    <DIR>          Folder 321
                   2 File(s)              4 bytes
    
     Directory of d:\test\baseline\Folder 123
    
    23/07/2014  20:36    <DIR>          .
    23/07/2014  20:36    <DIR>          ..
    23/07/2014  20:36                 2 3.jpg
    23/07/2014  20:36                 2 4.jpg
                   2 File(s)              4 bytes
    
     Directory of d:\test\baseline\Folder 321
    
    23/07/2014  20:37    <DIR>          .
    23/07/2014  20:37    <DIR>          ..
    23/07/2014  20:37                 2 5.jpg
    23/07/2014  20:37                 2 6.jpg
                   2 File(s)              4 bytes
                   2 Dir(s)   7,037,329,408 bytes free
    
    D:\>draft.bat
    
    D:\test\baseline>cd\
    
    D:\>dir d:\test\Achieve
     Volume in drive D is New Volume
     Volume Serial Number is B04C-AB59
    
     Directory of d:\test\Achieve
    
    23/07/2014  21:24    <DIR>          .
    23/07/2014  21:24    <DIR>          ..
    23/07/2014  20:36                 2 3_23-07-2014.jpg
    23/07/2014  20:36                 2 4_23-07-2014.jpg
    23/07/2014  20:37                 2 5_23-07-2014.jpg
    23/07/2014  20:37                 2 6_23-07-2014.jpg
                   4 File(s)              8 bytes
                   2 Dir(s)   7,037,329,408 bytes free
    

    干杯, G

    编辑 - 这基于您的原始问题。我还没有看到其他答案的cmets。如果您需要更改,请告诉我。

    【讨论】:

    • 问题是文件夹 123 将包含名为 3-tasty.jpg 3-not taste.jpg 4-tasty.jpg 4-not taste.jpg 的文件,文件夹 321 5-tasty 也是如此。 jpg 5-not taste.jpg 6-tasty.jpg 6-not taste.jpg.. 所以最后所有的-not tasty.jpg 都会进入baseline 的主目录,所有-tasty.jpg 都会进入到abstract 文件夹中-tasty.jpg-not tasty.jpg 扩展名只是文件名。因此,这个批处理脚本最终将包含您帮助我解决的其他编码 - 在所有这些之后,基线中的所有文件夹都将被删除
    • 现在您的实现文件夹看起来正确。最终结果应该是这样的。但是您的D:\test\baseline: 应该是 1.jpg、2.jpg、3.jpg、4.jpg、5.jpg 并且在此批处理运行结束时没有其他文件夹
    • 所以你不想添加日期?
    • 不不,我确实需要添加它。这就是为什么我说你的成就文件夹是正确的
    • 只在不好吃的文件上附加日期?
    【解决方案3】:

    在运行 draft.bat 之前

    D:\>dir "d:\test\baseline", "d:\test\baseline\Folder 123", "d:\test\baseline\Folder 321"
    Volume in drive D is New Volume
    Volume Serial Number is B04C-AB59
     Directory of d:\test\baseline
    
    23/07/2014  21:24    <DIR>          .
    23/07/2014  21:24    <DIR>          ..
    23/07/2014  20:35                 2 1.jpg
    23/07/2014  20:35                 2 2.jpg
    23/07/2014  20:36    <DIR>          Folder 123
    23/07/2014  20:37    <DIR>          Folder 321
                   2 File(s)              4 bytes
    
     Directory of d:\test\baseline\Folder 123
    
    23/07/2014  20:36    <DIR>          .
    23/07/2014  20:36    <DIR>          ..
    23/07/2014  20:36                 2 3-tasty.jpg
    23/07/2014  20:36                 2 3-not tasty.jpg
    23/07/2014  20:36                 2 4-tasty.jpg
    23/07/2014  20:36                 2 4-not tasty.jpg
                   2 File(s)              4 bytes
    
     Directory of d:\test\baseline\Folder 321
    
    23/07/2014  20:37    <DIR>          .
    23/07/2014  20:37    <DIR>          ..
    23/07/2014  20:37                 2 5-tasty.jpg
    23/07/2014  20:37                 2 5-not tasty.jpg
    23/07/2014  20:37                 2 6-tasty.jpg
    23/07/2014  20:37                 2 6-not tasty.jpg
                   2 File(s)              4 bytes
                   2 Dir(s)   7,037,329,408 bytes free
    
    D:\>draft.bat
    

    之后

    D:\test\baseline>cd\
    
    D:\>dir d:\test\Achieve
     Volume in drive D is New Volume
     Volume Serial Number is B04C-AB59
    
     Directory of d:\test\Achieve
    
    23/07/2014  21:24    <DIR>          .
    23/07/2014  21:24    <DIR>          ..
    23/07/2014  20:36                 2 3_23-07-2014.jpg
    23/07/2014  20:36                 2 4_23-07-2014.jpg
    23/07/2014  20:37                 2 5_23-07-2014.jpg
    23/07/2014  20:37                 2 6_23-07-2014.jpg
                   4 File(s)              8 bytes
                   2 Dir(s)   7,037,329,408 bytes free
    
    
     Directory of d:\test\baseline
    
    23/07/2014  21:24    <DIR>          .
    23/07/2014  21:24    <DIR>          ..
    23/07/2014  20:35                 2 1.jpg
    23/07/2014  20:35                 2 2.jpg
    23/07/2014  20:35                 2 3.jpg
    23/07/2014  20:35                 2 4.jpg
    23/07/2014  20:35                 2 5.jpg
    23/07/2014  20:35                 2 6.jpg
                   2 File(s)              4 bytes
    

    注意baseline 没有更多文件夹,因为它们在移动所有文件后都被删除了
    non-tasty -> 没有non-tasty 扩展的基线
    tasty -> 没有@987654327 实现@ 但带有日期戳

    我希望你现在能理解。 非常感谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多