我需要在windows2003服务器中创建一个批处理文件。我们确实安装了Cygwin,因此能够运行unix命令。
每天晚上,进程都会将一个带时间戳的文件file*%yyyy%%mm%%dd%.txt下载到c:\temp\download。
FTP进程会将其FTP到另一个位置,并将文件移动到c:\temp\download\archived。
我们试图实现的是,在ftping之前,将c:\temp\download中的新文件与c:\temp\dwnload\archived中最后一个修改过的文件进行文件比较,以便只显示自上次文件上传以来更改的ftp行。当前日期txt文件应仅包含与前几天不同的行。
我成功地运行了以下脚本来对两个文件进行排序和比较:
@echo on
set archive=C:tempdownloadarchived
set download=C:tempdownload
pushd "%archive%"
for /f "tokens=*" %%G in ('dir *.txt /b /a-d /od') do SET oldfile=%%G
pushd "%download%"
for /f "tokens=*" %%H in ('dir *.txt /b /a-d /od') do SET newfile=%%H
echo The last file processed was %oldfile%
echo The new file is %newfile%
comm -2 -3 <(sort %archive%%oldfile%) < (sort %download%%newfile%) > %download%%newfile%
pushd "%download%"
popd
脚本在没有排序的情况下工作,但一旦添加了排序,脚本就会失败。
运行comm-2-3%archive%\%oldfile%%download%\%newfile%有效,但添加排序时无效,错误为:
comm-2-3 C:\temp\download\archive\CPSNS_20140527075503.txt)C: \temp\download\CPSNS_20140602075502.txt)0<(排序1>c:\temp\download\workplease.txt系统找不到指定的文件
如有任何协助,我们将不胜感激!
看起来它现在正在工作。下面是我使用的脚本。欢迎提出任何改进建议。它包括对两个文件进行排序,然后对它们运行COMM,并且只输出%newfile%与%oldfile%中发生更改的行。
@echo on
set archive=C:tempdownloadarchived
set download=C:tempdownload
pushd "%archive%"
for /f "tokens=*" %%G in ('dir *.txt /b /a-d /od') do SET oldfile=%%G
pushd "%download%"
for /f "tokens=*" %%H in ('dir *.txt /b /a-d /od') do SET newfile=%%H
echo The last file processed was %oldfile%
echo The new file is %newfile%
sort %archive%%oldfile% > tmp && mv tmp %download%%oldfile%
sort %download%%newfile% > tmp && mv tmp %download%%newfile%
comm -2 -3 %download%%newfile% %download%%oldfile% > tmp && mv tmp %download%%newfile%
pushd "%download%"
del %oldfile%
popd