批处理文件找到文件夹中的最新文件,然后复制并重命名为另一个文件夹

问题描述:

在这里找到了同样的问题..我想使用代码,但我的数据。我绝不是程序员..然而,我可以采取几乎任何代码,并使其适用于我。批处理文件找到文件夹中的最新文件,然后复制并重命名为另一个文件夹

How to code a batch file to copy and rename the most recently dated file?

这里是我的

@echo on 
setLocal DisableDelayedExpansion 
pushd N:\ 
setLocal EnableDelayedExpansion 

for /f "tokens=* delims= " %%G in ('dir/b/od') do (set newest=%%G) 

copy %newest% G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 

PAUSE 
POPD 

而结果...

C:\Documents and Settings\belcherj\Desktop\AMI_BATCH>setLocal DisableDelayedExpa 
nsion 

C:\Documents and Settings\belcherj\Desktop\AMI_BATCH>pushd N:\ 

N:\>setLocal EnableDelayedExpansion 

N:\>for /F "tokens=* delims= " %G in ('dir/b/od') do (set newest=%G) 

N:\>(set newest=System Blink Count__2012-06-27 01_00_46.csv) 

N:\>(set newest=System Blink Count__2012-06-28 01_00_32.csv) 

N:\>(set newest=System Blink Count__2012-06-29 01_00_33.csv) 

N:\>(set newest=System Blink Count__2012-06-30 01_00_42.csv) 

N:\>(set newest=System Blink Count__2012-07-01 01_00_32.csv) 

N:\>(set newest=System Blink Count__2012-07-02 01_00_31.csv) 

N:\>(set newest=System Blink Count__2012-07-03 01_00_29.csv) 

N:\>(set newest=System Blink Count__2012-07-04 01_00_39.csv) 

N:\>(set newest=System Blink Count__2012-07-05 01_00_34.csv) 

N:\>(set newest=System Blink Count__2012-07-06 01_00_31.csv) 

N:\>(set newest=System Blink Count__2012-07-07 01_00_32.csv) 

N:\>(set newest=System Blink Count__2012-07-08 01_00_30.csv) 

N:\>(set newest=System Blink Count__2012-07-09 01_00_40.csv) 

N:\>(set newest=System Blink Count__2012-07-10 01_00_29.csv) 

N:\>(set newest=System Blink Count__2012-07-11 01_00_44.csv) 

N:\>(set newest=System Blink Count__2012-07-12 01_00_34.csv) 

N:\>copy System Blink Count__2012-07-12 01_00_34.csv G:\Server_Files\AMI_DATA\TE 
XT_FILES\NewFile.csv 
The system cannot find the file specified. 

N:\>PAUSE 
Press any key to continue . . . 

我认为这是与在文件名中的空格..我尝试了一些我发现的代码,它给出了相同的结果。我接近只需要一点点推动。 感谢您的时间和帮助。

这应该工作

@echo off 
cd /d N:\ 
for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a 
echo f| xcopy "%newest%" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
+0

诀窍!看起来像光盘让它打开映射的网络驱动器是什么让它的工作..我可能是错误的:) ..感谢您的帮助@ dbnham和巴厘岛C – jestexman 2012-07-13 16:00:21

你是对的,你的直接问题是文件名中的空格。您可以通过添加引号来解决该问题:copy "%newest%" "G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv"

但还有其他问题。 FOR选项应该是“eol =:delims =”。如果文件名以空格或分号开头,则您现有的选项将会失败。

如果文件名包含感叹号,您的代码也可能会失败,因为您在使用FOR %% G变量时启用了延迟epansion。您启用延迟扩展,但您不使用它。

如果列出的最后一个“文件”碰巧是一个目录而不是文件,那么您的代码也会失败。您需要DIR /A-D选项来过滤目录名称。

糟糕!我的原始发布代码不起作用,因为PUSHD已被删除,DIR/B在输出中不包含路径信息。

下面是避免潜在问题的解决方案,并且还增加了一些额外的错误检查:

@echo on 
setlocal disableDelayedExpansion 
set "quit=pause & exit /b" 
pushd N:\ || %quit% 
set "newest=" 
for /f "eol=: delims=" %%F in ('dir /b /od /a-d') do set "newest=%%F" 
if defined newest copy "%newest%" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
%quit% 

禁用延迟扩展可能是没有必要的,因为它是在大多数安装的默认状态。但它不能伤害。

由于使用SETLOCAL,一旦脚本结束,对环境的任何更改都将丢失。 (一旦脚本结束,就有一个隐含的ENDLOCAL)。 ENDLOCAL(隐式或显式)也解除了PUSHD的结果,这就是为什么POPD不是必需的。

我定义了一个退出“宏”,以便使用相同的两个命令始终退出脚本:PAUSE,然后是EXIT/B。脚本最后不需要EXIT/B,但它不会受伤。

通过按降序排列文件列出文件并使用GOTO在第一个文件后跳出循环,可以使脚本更加高效。

@echo on 
setlocal disableDelayedExpansion 
set "quit=pause & exit /b" 
pushd N:\ || %quit% 
set "newest=" 
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d') do set "newest=%%F" & goto :break 
:break 
if defined newest copy "%newest%" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
%quit% 

或文件可以在循环中没有定义的环境变量被复制,此时该脚本可以立即结束:

@echo on 
setlocal disableDelayedExpansion 
set "quit=pause & exit /b" 
pushd N:\ || %quit% 
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d') do (
    copy "%%F" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
    %quit% 
) 
%quit% 
+0

谢谢你答复,但你的解决方案似乎没有做任何事情。我添加了引号..并收到了相同的消息。我用你提供的代码创建了一个新的bat文件,它不给我任何消息。我是否应该将它添加到我的第一个bat文件中?我很抱歉,因为对此感到陌生。我们的文件名将如系统闪烁计数_2012-07-12 01_00_34.csv – jestexman 2012-07-12 22:13:22

+0

@jestexman - 引号确实应该修复您的原始代码。我不确定你出错的地方。我已经修复了我的代码,存在重大问题。 – dbenham 2012-07-13 00:09:17

+0

我真的很感激你为我寻找这个。我仍然没有得到任何结果。 N和G是映射的网络驱动器。这可能会导致批处理不工作?我在这个批处理文件的东西方式新。我尝试了所有三个文件。我将文本复制到一个空白的txt文件中,然后重命名为amirname.bat,然后从那里运行它。 dos窗口弹出半秒钟然后关闭。这就是我得到的。再次感谢你的时间。 – jestexman 2012-07-13 13:26:40