创建批处理文件以将日志分类到各自的月年文件夹中......?
Posted
技术标签:
【中文标题】创建批处理文件以将日志分类到各自的月年文件夹中......?【英文标题】:Creating a batch file to sort logs into their respective month year folders...? 【发布时间】:2019-02-14 14:03:30 【问题描述】:有一些模糊或类似的问题,我试图尽我所能拼凑起来,但不确定我是否做得正确。
批处理文件的目标是查找文件名上的日期,创建一个文件夹,其中该文件名日期的月份和年份以“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 日”文件夹),它应该很酷而且如果有,它会迭代直到找到一个未使用的数字,每次 +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 编码器
【问题讨论】:
您的if
语法错误(请参阅if ?
)。没有&&
或AND
或类似的东西。另请注意:以0
开头的数字被处理为八进制 - 而08
不是有效的八进制数字(此外,以前导零递增不能像这样工作)
看看this是否有帮助
@Stephan 谢谢你;检查和实施命名文件夹的前缀怎么样?编辑:那么如果你不能使用 && 或 AND...,你如何将语句连接在一起?那我如何用前导零递增呢?
@Stephan,在编辑代码以反映我的日志文件而不是 excel 文件工作所需的更改并添加提升一个级别并在那里创建文件夹而不是在同一目录级别......以及月份和年份之间的空格......如果我能做到这一点,我会正在考虑让它运行超过 10k 的日志文件......这意味着至少需要 11.57407407407407 天才能让计算机直接运行......
@Stephan 实际上留下了超过 100k 的日志文件,我的错误,因为我无法再编辑之前的评论,因为它已经超过 5 分钟了......所以那是 115.7407407407407 天......我有已经手动尝试通过其中大约 30k,甚至在尝试决定通过批处理脚本自动化它之前,只有超过 100k 仍然需要手动或使用批处理脚本自动排序......哦,天哪,这是一件苦差事!哈哈哈哈哈哈
【参考方案1】:
还是不太确定,我猜对了。请尝试下面的代码并检查它的输出,如果是的话,你想要什么。
@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
命令
【讨论】:
禁用 md 和 move 命令有什么安全原因?!哈哈哈....无论如何,抱歉回复晚了,我的电脑决定适应一下,嗯,它很接近 - 编号,最初希望它从 01 开始,即使 Jan 不存在,所以例如我只在 2017 年 12 月有一个日志,但在其他月份没有其他日志,它将创建一个名为 2017 年 12 月 1 日的文件夹并将文件移到那里;但我想这会做。我也在研究 for 循环以及它是如何工作的,但我想在我回复任何结果之前你已经打败了我。 当然希望我可以在 cmets 中制作迷你段落,以便它们易于消化,任何人;离你的代码很远,它错过了被上移一级并在那里创建文件夹并将文件移动到那里,我认为就是这样,速度几乎是瞬时的和纯 cmd,而不是 cmd + powershell 的混合 - 是的会做的,非常感谢!只是要将年末日期从 2020 年增加到更高的日期...... 我编辑的对吗?@echo off SETLOCAL ENABLEDELAYEDEXPANSION set m=0 for %%a in (January February March April May June July August September October November December) do ( set /a m+=1 set "m[!m!]=%%a" ) for /l %%Y in (2010,1,2050) do ( for /l %%M in (1,1,12) do ( set /a mm=%%M+100 set "mm=!mm:~-2!" if exist "*!mm!-%%Y*.log" ( md "..\!mm! !m[%%M]! %%Y" 2>nul move "..\*!mm!-%%Y*.log" "!mm! !m[%%M]! %%Y\" ) ) )
其实你知道吗?搞砸评论格式,这是一个 pastebin 链接:pastebin.com/yMHzbE6X 更漂亮! ☺ 该死的 5 分钟确实飞得很快......所以当我运行修改后的代码时,我得到“A duplicate file name exists, or the file cannot be found.
”
“安全原因”是为了防止您的数据在您选择检查它是否符合您的要求之前被划伤/重命名。想象一下,ren
命令并不完全符合您的要求 - 您可能会留下一堆错误重命名的文件(甚至可能不一致,因此您需要做很多工作才能撤消它)以上是关于创建批处理文件以将日志分类到各自的月年文件夹中......?的主要内容,如果未能解决你的问题,请参考以下文章