批处理文件根据文件名命名文件夹

时间:2012-01-03 13:29:37

标签: batch-file

我已设法复制并操作执行以下操作的批处理脚本:

  • 查看.csv文件的最后4个字符
  • 创建一个名为
  • 的文件夹
  • 将文件移动到文件夹

    @echo off & setlocal EnableDelayedExpansion
    echo.
    pushd "%~dp0"
    for %%j in (*.csv) do (
        set file=%%~nj
        set folder=!file:~-4!
        if !folder!==FI_2 set folder=!file:~-6!
        if not exist !folder! md !folder!
        move "%%~j" "!folder!"
    echo "%%~j" -^> "!folder!"
    )
    popd
    echo.& echo.Done
    
    :: End_Of_Batch
    

我遇到的问题是我需要按月对文件进行分组。文件名如下所示:

BS_IDX_LEVEL_YYYYMMDD_BAFI.csv

(显然YYYYMMDD将替换为文件的日期)

因此任何名称为BS_IDX_LEVEL_20111231_BAFI.csv的文件都会进入名为“1112”的文件夹(文件夹的日期格式为YYMM) 名为BS_IDX_LEVEL_20111115_BAFI.csv的文件将进入文件夹名称“1111”

有没有我可以改变这个脚本,以便在按文件名组织文件之前先按日期对它们进行分组?

如果我能进一步解释,请告诉我

1 个答案:

答案 0 :(得分:0)

当您循环并获取文件名的最后4个字符时,您还可以查看日期。我不知道文件的开头是修复还是可以修改,但我认为假设date_end语法是一致的是合理的。

set filedate=!file:~-9,-7!

这将从!file!中存储的字符串末尾提取第9和第7之间的字符。使用您的语法,将是两位数的月份数。这也可以避免与2或4位数日期混淆。

一旦你拥有了这个和另一个文件夹名称,就可以一次创建两个文件夹并将文件直接放入子文件夹中,这样你仍然只需要对文件集进行一次传递。

@echo off & setlocal EnableDelayedExpansion
echo.
pushd "%~dp0"
for %%j in (*.csv) do (
    set file=%%~nj
    set folder=!file:~-4!
    if !folder!==FI_2 set folder=!file:~-6!
    set filedate=!file:~-9,-7!
    SET datefolder=!folder!\!filedate!
    if not exist !folder! md !folder!
    if not exist !folder!\!filedate! md !folder!\!filedate!
    move "%%~j" "!datefolder!"
echo "%%~j" -^> "!datefolder!"
)
popd
echo.& echo.Done

:: End_Of_Batch