Jak mogę określić numer wersji pliku?
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 mogę określić numer wersji pliku?
Cześć, Skrypciarzu! W jaki sposób mogę uzyskać informacje dotyczące wersji pliku DLL lub innego?
-- DM
Cześć, DM. Znamy co najmniej dwa sposoby uzyskania tych informacji: jeden z nich działa tylko na komputerze lokalnym, drugi zaś można zastosować również zdalnie. A że porządni z nas goście, przedstawimy oba rozwiązania.
Tak naprawdę dla porządku należałoby, aby Microsoft zapłacił nam za drugie rozwiązanie ekstra, ale to chyba sprawa beznadziejna, przedstawimy więc oba skrypty za darmo i powiemy, że to promocja.
Ale z chęcią przyjmiemy wszelką dodatkową płatność w czeku lub w gotówce…
Na początek wersja dla komputera lokalnego. Skrypt korzysta z obiektu FileSystemObject i zajmuje całe dwa wiersze kodu:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Wscript.Echo objFSO.GetFileVersion("c:\windows\system32\scrrun.dll")
Jak widać, niewiele się tu dzieje (m.in. dlatego jest to nasz jeden z ulubionych skryptów). Proste: tworzymy wystąpienie obiektu FileSystemObject i wywołujemy echo wartości podanej przez metodę GetFileVersion. Wywołanie tej metody również nie jest szczególnie trudne; wystarczy wskazać interesujący nas skrypt – czyli, w tym wypadku, C:\Windows\System32\Scrrun.dll – a resztą zajmie się FileSystemObject.
Dlaczego zatem, skoro jest to takie łatwe, nie poprzestaniemy na poleceniu tego skryptu? Z dwóch powodów. Po pierwsze, obiekt FileSystemObject został stworzony z myślą o komputerach lokalnych; nie bardzo nadaje się więc do uzyskiwania informacji z komputerów zdalnych. (Niekiedy możliwe jest połączenie ze zdalnym komputerem jeśli poda się udział administracyjny: \\atl-ws-01\C$\Windows\System32\Scrrun.dll. Jednak nawet ta metoda nie zawsze skutkuje.)
I po drugie, metoda GetFileVersion jest w stanie zrobić tylko jedno: podać numer wersji pliku. (Chodzi tu przede wszystkim o pliki .dll lub .exe; zazwyczaj tylko one posiadają numer wersji.) Nie uzyska się więc w ten sposób żadnych informacji dodatkowych – o rozmiarze pliku czy dacie ostatniej modyfikacji; konieczne byłoby dodanie do naszego dwuwierszowego skryptu kodu umożliwiającego pobranie większej ilości informacji o właściwościach pliku.
Dlatego też do określenia wersji pliku użyć można WMI. Mechanizm WMI równie dobrze działa lokalnie, jak zdalnie; oprócz tego, klasa CIM_Datafile służąca do określenia wersji pliku może również podać wszystkie inne informacje dotyczące pliku. Jakie są wady? Skrypt WMI jest troszkę bardziej skomplikowany (ale tylko troszkę) i działa nieco wolniej niż skrypt z FileSystemObject. Poza tym oba skrypty działają tak samo: podają wersję określonego pliku.
Oto skrypt WMI podający wersję pliku C:\Windows\System32\Scrrun.dll:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * from CIM_Datafile Where Name = 'c:\\windows\\system32\\scrrun.dll'")
For Each objFile in colFiles
Wscript.Echo objFile.Version
Next
Jak zapowiadaliśmy, nie jest źle. Warto zwrócić jeszcze uwagę na sposób podawania ścieżek dostępu w zapytaniu:
"Select * from CIM_Datafile Where Name = 'c:\\windows\\system32\\scrrun.dll'"
W całej ścieżce używamy znaków \\. Jest to konieczne, bo pojedynczy znak \ jest zastrzeżony w WMI, więc chcąc użyć go w wyrażeniu typu Where musimy poprzedzić go drugim znakiem \. Nic wielkiego, ale trzeba o tym pamiętać.
Teraz skrypt jest już zupełnie prosty. Skrypt przykładowy podaje informacje o pliku Scrrun.dll na komputerze lokalnym. W celu uzyskania tych informacji z komputera zdalnego należy zmienić wartość zmiennej strComputer. I tak, poniższy wiersz kodu przypisuje tej zmiennej wartość atl-ws-01:
strComputer = "atl-ws-01"
Skrypt z tą wartością poda informacje z komputera computer atl-ws-01.
Do początku strony