批处理文件找到文件夹中的最新文件,然后复制并重命名为另一个文件夹
在这里找到了同样的问题..我想使用代码,但我的数据。我绝不是程序员..然而,我可以采取几乎任何代码,并使其适用于我。批处理文件找到文件夹中的最新文件,然后复制并重命名为另一个文件夹
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
你是对的,你的直接问题是文件名中的空格。您可以通过添加引号来解决该问题: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%
谢谢你答复,但你的解决方案似乎没有做任何事情。我添加了引号..并收到了相同的消息。我用你提供的代码创建了一个新的bat文件,它不给我任何消息。我是否应该将它添加到我的第一个bat文件中?我很抱歉,因为对此感到陌生。我们的文件名将如系统闪烁计数_2012-07-12 01_00_34.csv – jestexman 2012-07-12 22:13:22
@jestexman - 引号确实应该修复您的原始代码。我不确定你出错的地方。我已经修复了我的代码,存在重大问题。 – dbenham 2012-07-13 00:09:17
我真的很感激你为我寻找这个。我仍然没有得到任何结果。 N和G是映射的网络驱动器。这可能会导致批处理不工作?我在这个批处理文件的东西方式新。我尝试了所有三个文件。我将文本复制到一个空白的txt文件中,然后重命名为amirname.bat,然后从那里运行它。 dos窗口弹出半秒钟然后关闭。这就是我得到的。再次感谢你的时间。 – jestexman 2012-07-13 13:26:40
诀窍!看起来像光盘让它打开映射的网络驱动器是什么让它的工作..我可能是错误的:) ..感谢您的帮助@ dbnham和巴厘岛C – jestexman 2012-07-13 16:00:21