Date 批处理-基于文件名提取关联变量值

Date 批处理-基于文件名提取关联变量值,date,batch-file,extract,filenames,classification,Date,Batch File,Extract,Filenames,Classification,我有这样的文件名 20120528_销售_商店_001.pdf 20120529_销售_商店_001.pdf 等 我需要从文件名中提取日期,然后将其与2个变量关联 月 周 因此,对于日历中的每个日期,我需要能够关联周数和月名 这些是会计日历周和月,因此与实际日历无关。 范例 20120528将是第4周和第4个月 20120529将是第5周和第5个月 由于财政日历每年都在变动,我知道我每年都要重做,但我正在寻找一种方法来尽量减少需要做的工作 所以我想设置一些类似于 第四周是从这个日期到这个日期,也

我有这样的文件名 20120528_销售_商店_001.pdf 20120529_销售_商店_001.pdf 等

我需要从文件名中提取日期,然后将其与2个变量关联 月 周

因此,对于日历中的每个日期,我需要能够关联周数和月名

这些是会计日历周和月,因此与实际日历无关。

范例

20120528将是第4周和第4个月

20120529将是第5周和第5个月

由于财政日历每年都在变动,我知道我每年都要重做,但我正在寻找一种方法来尽量减少需要做的工作

所以我想设置一些类似于

第四周是从这个日期到这个日期,也是在四月

4月财政年度将从20120403年至20120430年

并计算第1-2-3-4周(从每个星期日开始计算)

第五周是从这个日期到这个日期,也是在五月份

财政可能从20120501年到20120528年

通常,2个月有4周,然后第3个月有5周

否则,我将不得不每天做一次。。这将是looong每年都要做和更新的事情

之后我需要使用Month和Week变量进行目录分类,这就是我需要它的原因

setlocal ENABLEDELAYEDEXPANSION
set the_file=20120528_Sales_Store_001.pdf

for /f "tokens=1 delims=_" %%F in ("!the_file!") do (
   set date=%%F
   set month=!date:~4,6!
   set day=!date:~6!
   set /a week_of_the_month=!day! / 7
   set /a modolus="!day! %% 7"
   if !modolus! GEQ 4 (
       set /a week_of_the_month=!week_of_the_month!+1
   )

   echo !the_file! is in the !week_of_the_month!th week of the month
   echo !the_file! >> week_!week_of_the_month!_of_!month!_month.txt

)
endlocal
这应该会将文件名写入一个星期的月份。这可以用另一个遍历文件的
FOR/F
包装。这些文件也可以被复制,再多一点
集合
就可以将月份数改成它的名称。我找不到更好的方法来计算这个月的星期。你需要吗更多的改进

更新:

setlocal ENABLEDELAYEDEXPANSION
pushd %traverse_dir% 
for /f %%D  in ('dir /b *.pdf ^|findstr "[1234567890_]" ') do (
        for /f "tokens=1 delims=_" %%F in ("%%D") do (
           set date=%%F
           set month=!date:~4,6!
           set day=!date:~6!
           set /a week_of_the_month=!day! / 7
           set /a modolus="!day! %% 7"
           if !modolus! GEQ 4 (
               set /a week_of_the_month=!week_of_the_month!+1
           )

           echo !the_file! is in the !week_of_the_month!th week of the month
           echo !the_file! >> week_!week_of_the_month!_of_!month!_month.txt

        )
)
endlocal
popd
这应该会将文件名写入一个星期的月份。这可以用另一个遍历文件的
FOR/F
包装。这些文件也可以被复制,再多一点
集合
就可以将月份数改成它的名称。我找不到更好的方法来计算这个月的星期。你需要吗更多的改进

更新:

setlocal ENABLEDELAYEDEXPANSION
pushd %traverse_dir% 
for /f %%D  in ('dir /b *.pdf ^|findstr "[1234567890_]" ') do (
        for /f "tokens=1 delims=_" %%F in ("%%D") do (
           set date=%%F
           set month=!date:~4,6!
           set day=!date:~6!
           set /a week_of_the_month=!day! / 7
           set /a modolus="!day! %% 7"
           if !modolus! GEQ 4 (
               set /a week_of_the_month=!week_of_the_month!+1
           )

           echo !the_file! is in the !week_of_the_month!th week of the month
           echo !the_file! >> week_!week_of_the_month!_of_!month!_month.txt

        )
)
endlocal
popd

你的操作系统是什么?批处理的日期算法会让人头疼。如果你运行的是Win7,它会因为powershell而简单得多。否则,最好使用vbscript/jscript,它可以在每个windows系统上使用。我假设您的会计月由整周组成。您声明您的工作周从周日开始,而2012年4月的财政年度从20120403开始,也就是周二。某处出了问题。4月是你财政年度的开始吗?您的会计月是否从每月的第一个整周开始?还是在这个月的最后一整周结束?(或者完全是别的什么?)。一旦建立了规则,创建一个脚本来编写包含一年中的每一天以及月份名称和周数的查找文件应该不会太困难。但是规则必须被知道。你是对的,我犯了一个错误。我在看2011年的日历。我很抱歉。2012年4月为4月1日至4月28日,5月为4月29日至5月26日等。。总是4周,4周,然后5周。我正在Windows 7上进行测试,但它将在Windows 2008上运行。您的操作系统是什么?批处理的日期算法将非常麻烦。如果您运行的是Win7,则由于powershell,它将更加容易。否则,最好使用vbscript/jscript,它可以在每个windows系统上使用。我假设您的会计月由整周组成。您声明您的工作周从周日开始,而2012年4月的财政年度从20120403开始,也就是周二。某处出了问题。4月是你财政年度的开始吗?您的会计月是否从每月的第一个整周开始?还是在这个月的最后一整周结束?(或者完全是别的什么?)。一旦建立了规则,创建一个脚本来编写包含一年中的每一天以及月份名称和周数的查找文件应该不会太困难。但是规则必须被知道。你是对的,我犯了一个错误。我在看2011年的日历。我很抱歉。2012年4月为4月1日至4月28日,5月为4月29日至5月26日等。。总是4周,4周,然后5周。我正在Windows 7上测试,但它将在Windows 2008上运行。非常感谢!您将如何处理其他/F,使其自动处理当前目录中的所有文件?我正在Windows 7上测试,但它将在Windows 2008上运行。非常感谢!您将如何处理其他/F,使其自动处理当前目录中的所有文件?我正在Windows7上测试,但它将在Windows2008上运行