Centrum skryptów - Systemy operacyjne

Jak zmienić datę ostatniego użycia pliku tak, żeby była identyczna z datą ostatniej modyfikacji?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak zmienić datę ostatniego użycia pliku tak, żeby była identyczna z datą ostatniej modyfikacji?

Cześć, Skrypciarze! Jak zmienić datę ostatniego użycia pliku tak, żeby była identyczna z datą ostatniej modyfikacji?

-- GW

Cześć, GW! Nie wiem czy wiesz, ale właśnie dziś rusza liga baseballowa Major League. Nie wiem tylko u nas czy w Japonii też, bo nie wiem również, czy zdajecie sobie sprawę z tego, że baseball (yakyu) jest w Japonii drugim co do popularności sportem. Z jedną przewagą co do Stanów, a może i wieloma. Po pierwsze, różne przedsiębiorstwa organizują własne ligi (polecam uwadze naszych przełożonych), po drugie (pominę fakt, że są bębniarze i fajerwerki) piwo sprzedawane jest nie na tacy w plastikowych kubeczkach, ale roznoszone jest profesjonalnie w plecaku przez takich oto sprzedawców:

Ponadto, w przeciwieństwie do naszej ligi, reklam prawie nie ma. To znaczy są, ale widocznie nie są tak przytłaczające i na każdym miejscu łącznie z bazami; zerknijcie tylko na tutaj (j.ang.). Nie to, żebym miał coś przeciwko Spidermanowi, o nie…

Nie opowiadam tego wszystkiego z zasłyszenia, ale byłem i wdziałem na własne oczy, a Skrypciarski Syn nawet z boiska.

Na potwierdzenie załączam jego bilet z wizerunkiem menedżera Bobbiego Valentine’a:

Niezły, nie?

Tyle chyba o baseballu, bo a pewno zestresowani jesteście faktem, że nie da się w żaden sposób zmodyfikować daty ostatniego użycia pliku za pomocą skryptu VBScript. Można oczywiście użyć obiektu FileSystemObject w celu pobrania wartości daty ostatniego użycia pliku, nie można jednak w żaden sposób jej zmienić.

Uwaga: No chyba, że przeczytacie nasz artykuł Our Favorite Shell Games (j.ang.) w naszym TechNet Magazine. Tam być może znajdziecie metodę na zmianę tej wartości.

Nie rozpaczajcie jednak, coś zawsze da się zrobić, nawet jeżeli trzeba zmienić datę ostatniego użycia wszystkich plików w danym folderze. Czy kiedykolwiek Was zawiedliśmy? No właśnie, tym razem też nie zawiedziemy, a to tylko i wyłącznie dzięki pomocy języka Windows PowerShell (j.ang.). Poniższy skrypt (a raczej skrypcik lub skrypciątko) powinien Wam dopomóc w tej sprawie:

Get-ChildItem C:\Scripts | Where-Object {$_.PSIsContainer -eq $False} |

ForEach-Object {$_.LastAccessTime = $_.LastWriteTime}

Jak widać na pierwszy rzut oka jest to pojedynczy wiersz kodu PowerShell (wygląda co prawda jak dwa wiersze, ale nie dajcie się zwieść). Zaczynamy w dość prosty sposób - cmdlet Get-ChildItem pobiera kolekcję wszystkich elementów z folderu C:\Scripts. Temu właśnie służy poniższy fragment kodu:

Get-ChildItem C:\Scripts

Jak już wspomnieliśmy, Get-ChildItem zwróci nam kolekcję wszystkich elementów folderu C:\Scripts, czyli zarówno podfolderów jak i plików. Bardzo pięknie, ale jak wiecie, interesują nas tylko i wyłącznie pliki. Bierzemy więc naszą kolekcję i przesyłamy potokiem do cmdletu Where-Object:

Where-Object {$_.PSIsContainer -eq $False}
Uwaga: Dla tych, którzy jeszcze nie pracowali z PowerShellem, składnia $_ odpowiada obiektowi znajdującemu się w potoku w danym czasie. Nie wiecie, czym jest potok? Zajrzyjcie do naszego artykułu na ten temat: Piping and the Pipeline (j.ang.).

Obiekt Where-Object filtruje teraz naszą kolekcję, pozostawiając tylko te elementy, których właściwość PSIsContainer jest równa False ($False). Jak się na pewno domyślacie, jeżeli właściwość PSIsContainer jest równa False, to mamy do czynienia z niczym innym jak plikiem. Jeżeli jego właściwości ma wartość True, to mamy do czynienia z folderem.

Naszą przefiltrowaną kolekcję przesyłamy następnie potokiem do cmdletu ForEach-Object:

ForEach-Object {$_.LastAccessTime = $_.LastWriteTime}

Obiekt ForEach-Object przejdzie teraz pętlą przez każdy obiekt przefiltrowanej kolekcji, a następnie ustawi wartość właściwości LastAccessTime obiektu na wartość właściwości LastWriteTime. Innymi słowy - zmieni datę ostatniego użycia na datę ostatniej modyfikacji.

Czy o to chodziło?

Mogliśmy oczywiście wspomnieć na początku, że można do tej samej operacji posłużyć się skryptem VBScript, nie chcieliśmy jednak psuć Wam zabawy. Możecie więc spokojnie skorzystać z poniższego skryptu, a rezultat będzie ten sam:

Set objShell = CreateObject("Shell.Application")

Set objFSO = CreateObject("Scripting.FileSystemObject")



Set objFolder = objShell.NameSpace("C:\Scripts")

Set colItems = objFolder.Items



For Each objItem In colItems

    Set objFile = objFSO.GetFile(objItem.Path)

    dtmNewDate = objFile.DateLastAccessed

    objItem.ModifyDate  = dtmNewDate

Next

W celu uzyskania dodatkowych informacji zajrzyjcie do artykułu w piśmie TechNet Magazine (j.ang.).

Co do naszej ligi, to postaram się nie zaczynać kolejnego artykułu w ten sam sposób, chociaż miejcie na uwadze, że jestem tylko człowiekiem i nie wykluczam, że jeszcze nie raz stanę się ofiarą przemożnej chęci pisania o baseballu. Myślę jednak, ze można potraktować dzisiejszy artykuł jako lekcję z wątkiem kulturowym jako przewodnim. Mało kto wie jak wyglądają meczowi sprzedawcy piwa w Japonii… Wy już wiecie i nikt nie zaskoczy Was w Milionerach.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne