批处理文件以查找文件夹中的最新文件,然后将其重命名并重命名为另一个文件夹

时间:2012-07-12 21:24:18

标签: csv batch-file copy directory

在这里发现了同样的问题..我正在尝试使用代码但是我的数据。我绝不是一个程序员..我几乎可以采取任何代码,然后让它适合我。

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 . . .

我认为它与文件名中的空格有关。我尝试了一些其他代码,它给出了相同的结果。我只是需要一点点推动。 谢谢你的时间和帮助。

2 个答案:

答案 0 :(得分:6)

这应该有效

@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

答案 1 :(得分:0)

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

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

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

如果列出的最后一个“文件”恰好是目录而不是文件,您的代码也会失败。您希望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%