2013-12-09 12 views
0

,我想在未來加入20年,在windows 2008環境中的文件上次訪問時間而改變,我試圖用我的Windows服務器上安裝Unix工具和使用touch –a –t命令時,它的作品,但作爲我每天都有新文件在我的路徑文件夾z:\data\backup\*.bkf第二次,我不能通過跳過已修改的舊文件來修改新文件。更改文件的最後訪問時間

例如命令&輸出:

C:\ UNIX \ wbin>觸摸-a -t 120312002033 Z:\ DATA \備份*將.bkf

信息:所有文件*將.bkf在修改路徑如下:

發佈:今天,2013年12月9日 修改:今天,2013年12月9日 訪問:星期六2033年12月3日

如想象一下,今天我有1000個文件,在其上,我已經改變了最後訪問時間到+20歲,明天我將在與延伸將.bkf同一文件夾中1500多個文件我的路徑文件夾z:\data\backup\*.bkf,所以現在我想只改變這些新文件並將它們帶到+20年,並且每天通過跳過已完成的文件並僅觸摸新文件並通過批量運行繼續這樣做。

請注意:一旦我改變最後訪問時間,並添加20年,這些文件將直接鎖定在文件夾z:\data\backup 20年,不能刪除或修改,但一次只能讀取它們,這是一個 保留EMC Data Domain的鎖定功能。

我真的不是一個CLI或PowerShell的專家。 我真的很感謝你的幫助,並且提前感謝你的時間。

最好的問候, 鮑比。

回答

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年。每個其他文件都是獨立的。

+0

你好,我試過這樣的東西似乎不工作,但我非常接近。感謝您的幫助 –

+0

PS D:\> $ files = Get-ChildItem「D:\ folder1 \ *。bkp」; foreach($ f在$ files中){$ f.LastAccesstime =($ f.LastAccesstime).AddHours(23); } –

+0

PS D:\> $ files = Get-ChildItem「D:\ folder1 \ *。bkp」; foreach($ f在$ files中){$ f.LastAccesstime =($ f.LastAccesstime).Addyears(20); } –

-1

我個人會做到這一點使用C或類似的東西(不是必須的,但是這是因爲我類似的前幾天工作的東西)

你可以通過執行opendir在你的文件運行,READDIR然後STAT或LSTAT所有文件一個接一個,然後你會得到一個st_atime字段的結構,你可以將它與time()比較,因爲如果st_atime大於當前時間戳,那麼你正在查看一個已經修改的結果,如果沒有,只需更新st_atime。

希望我能夠幫助你。

相關問題