Batch file 正在创建一个批处理文件,以便将日志排序到各自的月-年文件夹中。。。?

Batch file 正在创建一个批处理文件,以便将日志排序到各自的月-年文件夹中。。。?,batch-file,windows-7,batch-processing,Batch File,Windows 7,Batch Processing,关于这一点,有一些模糊或类似的问题,我试图尽我所能拼凑起来,但不确定我是否做对了 批处理文件的目标是查找文件名上的日期,创建一个文件夹,其中该文件名日期的月份和年份以“01”前缀指定,然后将其移动到该文件夹中。创建文件夹的位置将比当前日志文件所在的位置高一级。如果已存在前缀为“01”的文件夹名称,但其月份和年份不同,则将创建前缀为“02”的文件夹名称,如果该文件夹名称已存在,则将继续创建前缀为“03”的文件夹名称这会一直持续下去,直到它找不到更多的带有它试图创建的前缀的文件夹,这些前缀已经被使用

关于这一点,有一些模糊或类似的问题,我试图尽我所能拼凑起来,但不确定我是否做对了

批处理文件的目标是查找文件名上的日期,创建一个文件夹,其中该文件名日期的月份和年份以“01”前缀指定,然后将其移动到该文件夹中。创建文件夹的位置将比当前日志文件所在的位置高一级。如果已存在前缀为“01”的文件夹名称,但其月份和年份不同,则将创建前缀为“02”的文件夹名称,如果该文件夹名称已存在,则将继续创建前缀为“03”的文件夹名称这会一直持续下去,直到它找不到更多的带有它试图创建的前缀的文件夹,这些前缀已经被使用,然后继续创建一个带有未使用前缀的月份-年份文件夹

现在代码,这就是我现在拥有的:

SETLOCAL ENABLEDELAYEDEXPANSION
for %%a in (*.log) do (
    if exist *-10-2017*.log (
        if exist 01* && not *01*.log (
            set "iter="
            set /p iter=01
            set /a iter+=1 
            set f1=!%inter%" October"!
            md "..\!f1!"
            move "%%a" "!f1!"
        ) else (
        md "01 October 2017" 2>nul
        move "%%a" "01 October 2017"
        )
    ) 
)
这仅适用于2017年10月,因此应该检查日志文件名的日期,如果文件名中有“-10-2017”,则在当前文件夹上方的目录中创建一个文件夹“2017年10月1日”,并移动到该文件夹,假设不存在另一个名为2017年5月1日的文件夹或任何其他以名称01开头的文件夹(除了已创建的目标文件夹,在这种情况下,批处理只需移动文件,而无需创建同一月份和年份的单独文件夹,但前缀不同,这是不必要的,因此,如果已经存在2017年10月1日,我不想要“2017年10月1日”和“2017年10月2日”文件夹,例如),它应该很酷,如果有,它将迭代直到找到一个未使用的数字,每次go+01,然后继续使用它作为前缀

但这不起作用,因为我被停在:

E:\SteamCMD\KFServer\UserLogs\11\unread\test>SETLOCALENABLEDELAYEDEXPANSION
&& was unexpected at this time.
我已经找到了一个工件,我从中修改了它:

SETLOCAL ENABLEDELAYEDEXPANSION
for %%a in (*.log) do (
    set f=%%a
    set g=!f:~92,10!
    md "!g!" 2>nul
    move "%%a" "!g!"
    )
)
但它只是将它们移动到它们的尊重日期文件夹中,我希望它们处于月-年命名约定中,并向上一级,还希望在文件夹名称中添加01前缀,以便以后进行排序和搜索……还有另一个问题是,如果出现同一个月和年但不同日期的另一个日志(例如15-10-2017.log和10-10-2017.log),当我只需按月、年而不是按天对日志进行分组时,它将位于它们自己的文件夹中,从而造成更多的混乱

因此,我有两个选择——用这个将我的手臂举向空中,或者只是使用工作批,但手动完成额外的任务来完成它……因此,是的,我更愿意让计算机以最少的努力为我完成这一切,所以请帮我做这件事或更正我的代码,并解释为什么它是错的或那件事一定是这样

亲切问候,,
新的(oo)b编码器仍然不太确定,我没有搞错。请尝试下面的代码并检查它的输出,如果有,您想要什么

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set m=0
for %%a in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
  set /a m+=1
  set "m[!m!]=%%a"
)

for /l %%Y in (2010,1,2020) do (
  for /l %%M in (1,1,12) do (
    set /a mm=%%M+100
    set "mm=!mm:~-2!"
    if exist "*!mm!-%%Y*.log" (
      ECHO md "!mm! !m[%%M]! %%Y" 2>nul
      ECHO move "*!mm!-%%Y*.log" "!mm! !m[%%M]! %%Y\"
    )
  )
)

出于安全原因,我解除了
md
move
命令的武装
if
语法错误(请参见
if?
)。没有
&
或诸如此类的命令。另外请注意:以
0
开头的数字作为八进制数处理,
08
不是有效的八进制数(此外,用前导零递增的方法不是这样工作的)看,如果helps@Stephan谢谢;那么检查并实现命名文件夹的前缀呢?编辑:如果不能使用&&或和…,那么如何将语句连接在一起?如何使用前导零递增?@Stephan,在编辑后,该脚本仅用了1分40秒对11个测试文件进行排序代码,以反映我的日志文件(而不是excel文件)工作所需的更改,并添加位以提升级别并创建文件夹这里不是在同一个目录级别上,而是在月份和年份单词之间有一个空格……如果我能做到这一点,我会考虑让它运行超过10k个日志文件……这意味着至少有11.57407407天的时间让计算机可以正常运行……@Stephan实际上,我错了,因为我无法再编辑之前的评论,因为它已经超过5分钟了…这是115.7407天…我已经手动尝试了大约30000条评论,甚至在决定通过批处理脚本将其自动化之前,只剩下超过100k条评论需要手动或通过批处理脚本自动排序…哦,天哪,这是一个chore!哈哈哈哈哈,禁用md和move命令有什么安全原因?!哈哈哈…无论如何,为迟来的回复道歉,我的计算机决定进行调整,嗯,很接近-根据编号,最初希望从01开始,即使Jan不存在,所以举个例子,我在2017年12月只有一个日志,但在其他月份没有其他日志,它将创建一个名为2017年12月1日的文件夹,并将文件移动到其中;但我想这样就可以了。我自己也在研究for循环及其工作原理,但我猜在我回复任何结果之前,你已经在这方面击败了我。我当然希望我可以在评论中创建小段落,让它们易于消化,不管是谁;离你的code,它错过了向上移动一个级别,在那里创建文件夹,并将文件移动到那里,我想就是这样,速度几乎是瞬时的,纯cmd,而不是cmd+powershell的混合-是的,这就可以了,非常感谢!只是要将年终日期从2020年增加到更高的水平…我编辑对了吗de>@echo off SETLOCAL ENABLEDELAYEDEXPANSION set m=0 for%%a in(1-2-3-4-5-6-8-9-10-11-12)do(set/a m+=1 set“m[!m!]=%%%a”)for/l%%Y in(2010,12050)do(for/l%%m in(1,1,12)do(set/a mm=%%m+100 set