我想通过在未来添加+ 20年来改变文件的最后访问时间,在Windows 2008环境中,我尝试在我的Windows服务器上安装unix实用程序并使用touch –a –t
命令它可以工作但是因为我每天都有新文件在我的路径文件夹z:\data\backup\*.bkf
中,所以第二次我无法通过跳过已经修改的旧文件来修改新文件。
e.g。指挥&输出:
C:\ unix \ wbin> touch -a -t 120312002033 z:\ data \ backup * .bkf
信息:路径中的所有文件* .bkf修改如下:
创建:今天2013年12月9日 修改:2013年12月9日 访问时间:2033年12月3日星期六
e.g。想象一下,今天我在我的路径文件夹z:\data\backup\*.bkf
中有1000个文件,我已经将上次访问时间更改为+ 20年,明天我将在同一个文件夹中添加1500个文件,扩展名为.bkf,所以现在我会喜欢只改变那些新文件并将它们带到+ 20年,并通过跳过已经完成的文件并通过运行批处理只触及新文件来继续这样做。
请注意:一旦我更改上次访问时间并添加+ 20年,这些文件将立即锁定在文件夹z:\data\backup
中20年,并且无法删除或修改,但只能读取它们,这是一个
EMC Data Domain的保留锁定功能。
我不是cli或powershell专家。 非常感谢您的帮助,并感谢您提前花时间。
最诚挚的问候, 波比。
答案 0 :(得分:1)
我给你一些合作的东西:
get-childitem | select LastWriteTime
最后,如果您想检查每个文件的特定日期,请使用:
get-childitem | foreach-object {
if ($_.lastwritetime.year -eq 2013) {
write-host $_.Name was created 2013
} else {
write-host $_ was not created 2013
}
}
在批处理中你会这样做:
for /d %%f in (*) do @echo %%f is born on %%~tf
所以你理论上可以有类似的东西:
@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%f in (*) do (
set FILE_DATE="%%~tf"
set FILE_YEAR=!FILE_DATE:~7,4!
if !FILE_YEAR! == 2013 (
echo %%f was born in 2013
) else (
echo %%f was not born in 2013
)
)
但请注意,首先要看看 %% ~tf 会在您的计算机上输出,因为DateTime输出的格式通常会因不同的文化而异。基本上你必须在!FILE_DATE!
中处理子字符串最终修改:
所以这就是我去做你的工作:)
new-variable now -value (date)
new-variable nact -value ((date).addyears(20))
get-childitem *.bkf | foreach-object {
set-variable nact -value (($_.lastaccesstime).addyears(20))
if ($_.lastaccesstime.year -le $now.year) {
write-host [$now]: Updateing LastAccessTime of $_.name to $nact
$_.lastaccesstime = ($nact)
} else {
write-host [$now]: Ignoring $_.name
}
}
这将查看当前文件夹中的每个 * .bkf 文件,如果它按年份的最后访问时间小于或等于当前年份,则会为其上次访问添加20年时间。其他所有文件都是独立的。
答案 1 :(得分:0)
看一下这个链接,似乎已经为你完成了一些编辑。
http://gallery.technet.microsoft.com/scriptcenter/Set-file-time-stamps-using-e7044069
答案 2 :(得分:-1)
我个人会使用C或类似的东西来做这件事(没有必要,但这是因为我几天前做过类似的事情)
您可以使用opendir和readdir然后使用stat或lstat逐个文件来运行您的文件然后您将获得带有字段st_atime的结构,您可以将它与time()进行比较,因为如果st_atime大于当前时间戳然后你正在看一个已经修改过的,如果没有,只需更新st_atime。
希望我能帮到你。