1

我在 Windows XP 机器上安排了一个批处理文件,以从网络共享中复制大量文本文件。下次运行此任务时,文件将被简单地覆盖。批处理文件是这样的

copy \\networkshare1\*.txt C:\monitoring\files\
copy \\networkshare2\*.txt C:\monitoring\files\

然后我使用 Perl 来分析这些文件。我想知道的是,是否有一种简单的方法,无需更改文件名,在某处记录从网络共享复制文件的时间,以便我的 Perl 脚本知道它是在使用旧版本还是新版本文件。

4

3 回答 3

5

一种方法,假设目的地是 NTFS:

set dest=C:\monitoring\files\
for %%f in ("\\networkshare1\*.txt") do (
    copy "%%f" "%dest%"
    echo %TIME% >"%dest%%%~nxf:copywhen"
)

这会手动复制每个文件并将时间附加到数据流 copywhen中,当文件位于 NTFS 卷上时,它与文件永久关联。

确定 Perl 的标准文件例程将允许通过简单地传递路径来读取它C:\monitoring\files\whatever.txt:copywhen,如果不是,您可以从命令行捕获输出more <"C:\monitoring\files\whatever.txt:copywhen"

于 2012-12-21T15:55:02.400 回答
0

看一下File::stat包。这将内部 Perl stat命令替换为按名称接口。但是,您可以使用内置stat命令或File::stat包。

use File::stat;
use feature qw(say);

my $file_stat = stat($file_name);
say "The following times are displayed as seconds since January 1, 1970"
say "    File Last Access time: " . $file_stat->atime;
say "    File Last Modification time: " . $file_stat->mtime;
say "    File inode Change Time: " . $file_stat->ctime;

其中之一应该这样做。我认为你最好的选择可能是mtime

如果您不想File::Stat使用内置stat命令:

say "The following times are displayed as seconds since January 1, 1970"
say "    File Last Access time: " . (stat $my_file)[8]
say "    File Last Modification time: " . (stat $my_file)[9];
say "    File inode Change Time: " . (stat $my_file)[10];

要将时间转换为人类可读的时间,请使用Time::Piece模块。

于 2012-12-21T17:09:24.320 回答
0

一种简单的方法是在复制文件之前将其删除。由于它是从另一个驱动器复制的,因此时间/日期戳应该是它被复制到驱动器的时间。这就是 Windows 一直为我工作的方式。^_^

于 2012-12-22T20:21:14.113 回答