【问题标题】:Move files in folders dependent on the file date根据文件日期移动文件夹中的文件
【发布时间】:2013-06-10 07:57:31
【问题描述】:

我正在尝试将 Windows 服务器上的数千个文件分类到多个文件夹中。文件名是 Extract_YYYYMMDDHHMISS.dat,其中 YYYY 是年份,MM 是月份,DD 是日期。我想将这些文件移动到我定义如下的文件夹层次结构中:

Archive\2013\01\01
Archive\2013\01\02
Archive\2013\01\03
...
Archive\2013\02\01

等等。

@echo off
setlocal enabledelayedexpansion
for /f %%f in ('dir Extract_* /b') do (
echo %%f
echo %%~15,8f
)
endlocal

我正在尝试使用 for 循环和字符串格式将 YYYYMMDD 部分转换为变量,然后进一步拆分它,但我现在被卡住了。

任何帮助表示赞赏。

【问题讨论】:

    标签: windows date batch-file cmd directory


    【解决方案1】:

    如果输出正常,试试这个并删除echo

    @echo off &setlocal
    for %%i in (Extract_*.dat) do (
        set "fname=%%~i"
        setlocal enabledelayedexpansion
        set "name=!fname:*_=!"
        set "year=!name:~0,4!"
        set "month=!name:~4,2!"
        set "day=!name:~6,2!"
        echo move "!fname!" "Archive\!year!\!month!\!day!"
        endlocal
    )
    

    【讨论】:

    • 它对我不起作用。一些测试表明它没有进入 for 循环。也许是 /f 标志?其次,“Extract”可能包含多个 _ 字符。所以全名就像 Extract_Full_Data_Over_Time_20130101121314.dat。我看到你正在使用 _ 检查。我可以做最后一个下划线检查吗?
    • @Endoro:这对我来说听起来就像一句格言。 :) 无论如何,您可以轻松地修复您的脚本。您可以只提取名称 (%%~ni),然后处理最后 8 个字符 (!fname:~-8!)。并且"%%~i" 仍然可以用作原始名称(move 命令的第一个参数),因此除了您已经拥有的变量之外不需要任何变量。
    • @AndriyM 你是对的 :) 大部分工作已经完成。验证码的第二个答案很容易被 OP 包含在此处。
    • @Endoro 你能解释一下 !fname! 之间的区别吗?还有 %fname%?
    【解决方案2】:

    您可以使用“YYYY”=="20NN" 模式来提取核心文件名:

    @echo off &setlocal
    set name=Extract_Full_Data_Over_Time_20130101121314.dat
    set core=%name:*_2=2%
    echo %core%
    20130101121314.dat
    

    显然您不应该对 2000 年之前的文件日期执行此操作。

    【讨论】:

    • 太棒了。这基本上有效。我正在尝试使用 for 循环访问所有文件,如下所示。循环的语法是否不同? for /f %%f in ('Extract_Full_Data_Over_Time_* /b') do ( echo %%f echo %f:*_2=2% )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2018-10-17
    相关资源
    最近更新 更多