Jak zmienić datę ostatniego użycia pliku tak, żeby była identyczna z datą ostatniej modyfikacji?
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 |