2016-04-01 71 views
0

我有一些格式化像日志文件这样"name.log"复制和重命名创建日期(批处理脚本)文件

我想那些从一个文件夹复制到另一个文件夹一样

xcopy /y "C:\Folder1" "D:\Folder2"

添加我需要使用原始文件的创建日期(无副本文件)重命名文件,以便Folder2中的文本文件将与"yyyymmddhhmm.log"一样,如果某个文件具有相同的名称(创建日期),它将被覆盖。

我有@Wes Larson帮助的代码,但有一些错误。

set Source=C:\Users\user1\Desktop\1 
set Dest=C:\Users\user1\Desktop\2 
if not exist %Dest% md %Dest% 
for /F %%a in ('dir /b "%Source%\*.txt"') do call :Sub %%a 
goto :eof 

:Sub 
set "filename=%1" 
for /F %%s in ("%Source%\%1") do if %%~zs==0 goto :eof 
set "datepart=" 
FOR /F "tokens=1-5 delims=/-: " %%a IN ('dir /tc "%filename%" ^| findstr "%filename%"') DO (
    IF "%%c" neq "" SET "datepart=%%c%%a%%b%%d%%e" 
) 
FOR /F %%a IN ("%filename%") DO (
    set "NewName=%%~na %datepart%%%~xa" 
) 
xcopy /y "%Source%\%filename%" "%Dest%\%NewName%*" 
GOTO :EOF 

问题是如果我不把.bat放在原始文件(Folder1)的同一文件夹中,有些文件不会更改名称。例如,如果某些文件已经删除,则会使用旧名称和一个空格来更改名称。命令窗口告诉我它在获取创建日期时没有找到该文件。这很奇怪,因为有些文件复制得很好。

我需要什么来解决这个问题?

+3

这是很难诊断的问题当问题 说法是根本,“它不工作”。请编辑您的 问题,以更全面地描述您的 预期会发生什么,以及与实际的 结果有何不同。请参阅[问]提示什么使得一个好的 解释。 –

+0

你好,我理解你,但问题是我没有结果,所以我敢肯定,我的代码是错误的。当我执行蝙蝠命令窗口打开后关闭,我什么都看不到。 – Eduard

+3

调试的简单方法是暂时删除'@echo off',然后进入'cmd.exe'并调用你的批处理文件。在大多数错误中,'cmd.exe'应该保持打开状态,并且可以让您查看是否出现语法错误或错误的退出位置。 – Bloodied

回答

0

在我们找到答案之前:排除故障/调试批处理脚本时,请勿使用@echo off一旦你按照你想要的方式工作,这很好,但是当你需要看到你的代码正在逐行执行时,它会被注释掉。此外,您需要打开cmd窗口并从命令行运行脚本,因此脚本完成后该窗口不会关闭。

现在到您的代码。这for循环是你的问题的一部分:

FOR /f "tokens=1-3delims=/-:" %%a IN ('dir /tc "%filename%"') DO IF "%%c" neq "" SET "datepart=%%a-%%b-%%c" 

首先,你还没有设置%filename%,所以这个循环会失败。你或许应该有一条线在你:Sub这样的:

set "filename=%1" 

现在,假设%filename%是固定的,在这个时间循环已完成,您%%a%%b%%c变量被设置为值命令'dir /tc "%filename%"'的输出的最后一行,类似于X Dir(s) XXX,XXX,XXX,XXX bytes free,而不是您要查找的信息。

所以,相反,你可以调整它一点点,让你管的dirfindstr输出,寻找只有一个,要使用单线,像这样:

FOR /f "tokens=1-3delims=/-:" %%a IN ('dir /tc "%filename%" ^| findstr "%filename%"') DO (
    IF "%%c" neq "" SET "datepart=%%a-%%b-%%c" 
) 

但那么,你有另一个问题:你的%datepart%看起来像MM-DD-YYYY hh。这是因为您将delims从默认值(其中包括空格和制表符)更改为仅指定的字符。另外,从你的问题中,你还想包括所有格式为“yyyymmddhhmm.log”的小时和分钟,这意味着你还需要这两个令牌。那么你的线变成这样:

FOR /f "tokens=1-5 delims=/-: " %%a IN ('dir /tc "%filename%" ^| findstr "%filename%"') DO (
    IF "%%c" neq "" SET "datepart=%%c%%a%%b%%d%%e" 
) 

接下来,你的嵌套for循环是混乱的,不必要的,造成的问题:

FOR /f %%a IN ("%filename%") DO FOR /f %%d IN ("%datepart%") DO (
    set NewName="%%~na %%d%%~xa 
    xcopy e/d/y "%Source%\%OrgName%" "%Dest%\%NewName%" 
) 

你已经有%datepart%变量,而你不知道t需要将它变成for%%d变量之一以便能够引用它。因此,它变得简单多了,当你做这样的:

FOR /f %%a IN ("%filename%") DO (set "NewName=%%~na %datepart%%%~xa") 

此外,因为您遇到延迟扩展的问题,它更简单采取xcopy命令退出循环。

再次,你有一个变量%OrgName%,你从来没有设置。幸运的是,这实际上是不必要的,因为您已将原始文件名捕获为%filename%。所以,你的过于复杂的嵌套循环for成为本:

FOR /f %%a IN ("%filename%") DO (
    set "NewName=%%~na %datepart%%%~xa" 
) 
echo xcopy e/d/y "%Source%\%filename%" "%Dest%\%NewName%" 
+0

我有一些文件没有在文件夹2上写日期时出现问题。我从命令窗口运行脚本,我可以看到消息“它找不到文件”。我已经写下了完整的问题。非常感谢你。 – Eduard

相关问题