根据txt文件中给出的名称复制文件,并根据一年中的季度将它们发送到文件夹中

时间:2015-10-06 17:09:09

标签: batch-file

我正在尝试创建一个查看abc.txt文件内部的脚本,该文件包含具有flow28092014collateral28102014和{{1}等命名约定的文件列表}。 例如:

trade28032014

因此脚本需要检查文件名并根据其名称(因为它们的名称有给定日期),它应该将这些文件逐个复制到所需的文件夹(文件夹名称为flow28092014 collateral28102014 trade28032014 ,{{ 1}},Q1-2015Q2-2015)。因此,对于例如Q3-2015来自 March 的文件,它应该将它们发送到Q4-2015,如果abc.txt具有来自 June 的文件名,那么它应该将它们发送到Q1-2015文件夹。

下面我给出了我的代码,但它同时发送了所有文件:

abc.txt

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

> %ftp_file% (for %%a in ("%src%\*.*") do echo %%~na)

for /f "usebackq tokens=*" %%A in ("%ftp_file%") do (
    set "filename=%%~nA"
    set "mm=!filename:~-6,2!"
    for /f "tokens=* delims=0" %%B in ("!mm!") do set "mm=%%B"
    set "yyyy=!filename:~-4!"
    if "!yyyy!"=="%year%" (

        if !mm! LEQ 3 (
            copy "%%~fA" "%dest%\Q1-%year%"
        ) else if !mm! LEQ 6 (
            copy "%%~fA" "%dest%\Q2-%year%"
        ) else if !mm! LEQ 9 (
            copy "%%~fA" "%dest%\Q3-%year%"
        ) else (
            copy "%%~fA" "%dest%\Q4-%year%"
        )
    ) else (
        echo Year does not match.
    )
)
  1. 更改了行以设置filename以仅获取纯名称(无扩展名);
  2. 我删除了if !filename!:~-1!==l查询,因为它在问题的代码摘录中令人困惑; (当然,它可以重新插入最终的脚本中;)
  3. 更正了月份部分mm的提取(由于filename的更改);
  4. 改编copy来源%%~fA已经是完整路径;并将目标路径放在""之间(假设dest不包含任何周围的双引号);
  5. 使用新变量yyyy;
  6. 介绍了年份部分的检查
  7. 简化if / else逻辑,用于正确排序文件;
  8. copy命令中,您错过了filename的延迟扩展(您声明为%filename%而不是!filename!);因为我使用%%~fA作为复制源,所以此问题不再存在;
  9. Q2副本行中,有一个拼写错误,目的地中的前导%丢失了(Q2-year%);
  10. 改进了初始重定向语法,将重定向>移出for主体,因此文件写入一次; (以前,这些行已被追加;)
  11. 使用mmfor /f中删除了前导零,还从if语句中的数字常量中删除了前导零;这样做是为了进行真正的数字比较;在if语句表达式中声明前导零定义为将数字解释为八进制而不是十进制数,但0809不是有效的八进制数,因此实际执行了字符串比较; < / LI>

答案 1 :(得分:0)

(for %%a in ("%src%\*.*") do echo %%~na) > %ftp_file%

for /F "tokens=*" %%A in (%ftp_file%) do (
   set "filename=%%A"
   set /A "quarter=(1!filename:~-6,2!-101)/3+1, year=!filename:~-4!"
   copy "%src%\%%A" "%dest%\Q!quarter!-!year!"
)

set /A命令将月份数转换为适当的年度季度。例如:

set "filename=trade28032014"
!filename:~-6,2!          is month number: 03
1!filename:~-6,2!-101     is month minus one without left zeros: 103-101 = 2
(2)/3+1                   is year quarter: 1