0

我需要在 Windows 2003 服务器中创建一个批处理文件。我们确实安装了 Cygwin,因此能够运行 unix 命令。

每天晚上,一个进程会将一个带时间戳的文件 FILE*%yyyy%%mm%%dd% .txt下载到c:\temp\download

然后 FTP 进程会将其 FTP 到另一个位置并将文件移动到c:\temp\download\archived

我们正在尝试完成的是,在 ftping 之前,将文件与 c:\temp\download 中的新文件与 c:\temp\download\archived 中的最后修改文件进行比较,以便仅 ftp 已更改的行自上一个文件上传以来。当前日期 txt 文件应仅包含与前几天不同的行。

我已成功运行以下脚本来对两个文件进行排序和比较:

@echo on
set archive=C:\temp\download\archived
set download=C:\temp\download\
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\archived\CPSNS_20140527075503.txt) C:\temp\download\CPSNS_20140602075502.txt) 0<(sort 1>c:\temp\download\workplease.txt 系统找不到指定的文件。

任何帮助将不胜感激!

4

1 回答 1

0

看起来它现在正在工作。下面是我使用的脚本。随时提出任何改进建议。它涉及对两个文件进行排序,然后对它们运行 COMM,并且只输出在 %newfile% 与 %oldfile% 中发生变化的行。

@echo on
set archive=C:\temp\download\archived
set download=C:\temp\download\
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
于 2016-04-01T18:18:38.787 回答