Jak odczytać plik tekstowy na komputerze zdalnym?
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 odczytać plik tekstowy na komputerze zdalnym?
Cześć, Skrypciarze! Jak odczytać plik tekstowy na komputerze zdalnym?
-- BM
Cześć, BM. Musimy się do czegoś przyznać: używamy Twojego pytania do własnych, niecnych celów. Kilka dni temu odpowiadaliśmy na pytanie dotyczące odczytywania ostatniego wiersza z grupy plików tekstowych; obiecaliśmy wtedy, że powiemy, jak zrobić to samo, tyle że na komputerze zdalnym. Żaden kłopot, poza jednym – potrzebowaliśmy odpowiedniego pytania, by na nie odpowiedzieć. Nawinęło się akurat Twoje.
Jak wiadomo, FileSystemObject (obiekt używany do odczytywania i zapisywania plików tekstowych) powstał z myślą o zastosowaniach lokalnych; szczerze mówiąc, prawie każde zdalne zastosowanie FileSystemObject jest bardzo problematyczne czy nawet niemożliwe. FileSystemObject jest jednak w stanie korzystać ze ścieżek UNC. Załóżmy, że plik, który chcemy odczytać, znajduje się w udziale sieciowym (\\atl-fs-01\public\myfile.txt). W takim razie jego odczytanie będzie łatwe:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("\\atl-fs-01\public\myfile.txt", ForReading)
strContents = objTextFile.ReadAll
objTextFile.Close
Wscript.Echo strContents
Jak widać, zaczynamy od zdefiniowania stałej o nazwie ForReading, której wartość ustawiamy na 1. Następnie tworzymy odwołanie do FileSystemObject i wywołujemy metodę OpenTextFile, podając dwa parametry: ścieżkę UNC interesującego nas pliku oraz stałą ForReading. Teraz możemy zrobić z plikiem co tylko przyjdzie nam do głowy. Mały przykład: wywołujemy metodę ReadAll, która odczytuje całą zawartość pliku i zapisuje ją w zmiennej strContents. Następnie zamykamy plik, wywołujemy echo wartości strContents – i koniec.
Działa to świetnie, dopóki plik znajduje się w folderze udostępnionym. Co jednak zrobić, jeśli tak nie jest? No cóż, musimy wtedy użyć udziałów administracyjnych (np. C$). Poniższy skrypt odczyta zawartość pliku MyFile.txt nawet, jeśli folder C:\Public nie został udostępniony:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("\\atl-fs-01\C$\public\myfile.txt", ForReading)
strContents = objTextFile.ReadAll
objTextFile.Close
Wscript.Echo strContents
Jeśli udziały administracyjne są niedostępne, to już niewiele się da zrobić. (Chyba żeby zastosować coś naprawdę dziwacznego, np. obiekt WSHController. Ale to temat na osobny artykuł.)
Dochodzimy teraz do zasadniczego tematu dzisiejszego artykułu: jak dobrać się do wszystkich plików w folderze zdalnym i użyć FileSystemObject do otwarcia i odczytania każdego z nich? Na przykład tak:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
strComputer = "atl-fs-01"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _
& "ResultClass = CIM_DataFile")
For Each objFile In colFileList
strFilePath = "\\" & strComputer & "\C$\Logs\" & _
objFile.FileName & "." & objFile.Extension
Set objTextFile = objFSO.OpenTextFile(strFilePath, ForReading)
strContents = objTextFile.ReadAll
Wscript.Echo strContents
objTextFile.Close
Next
Łączymy się tu ze zdalnym komputerem atl-fs-01 i pobieramy kolekcję plików znajdujących się w folderze C:\Logs. Problem polega na utworzeniu ścieżek dla każdego z plików; w tym celu musimy użyć udziału administracyjnego, np. tak:
\\atl-fs-01\C$\Logs\MyFile.log
Tworząc ścieżkę, częściowo używamy WMI, a częściowo wklepujemy z klawiatury:
strFilePath = "\\" & strComputer & "\C$\Logs\" & _
objFile.FileName & "." & objFile.Extension
Po kolei:
- Zaczynamy od dwóch odwrotnych ukośników: \\
- Dodajemy nazwę komputera: \\atl-fs-01
- Dodajemy odwrotny ukośnik (\) i ścieżkę udziału administracyjnego (C$\Logs\): \\atl-fs-01\C$\Logs\
- Dodajemy właściwość WMI FileName (tzn. nazwę pliku bez rozszerzenia): \\atl-fs-01\C$\Logs\MyFile
- Wstawiamy kropkę pomiędzy nazwę pliku a rozszerzenie (kropki nie ma we właściwości Extension języka WMI): \\atl-fs-01\C$\Logs\MyFile.
- Dodajemy właściwość WMI Extension: \\atl-fs-01\C$\Logs\MyFile.log
Może i jest to trochę skomplikowane, ale w ten sposób otrzymujemy potrzebną nam ścieżkę UNC. Co więcej, za każdym przejściem pętli podstawiona zostanie nowa nazwa pliku i nowe rozszerzenie (nazwa komputera i ścieżka folderu się nie zmieniają). W ten sposób otworzymy i odczytamy każdy z plików w zdalnym folderze.
Do początku strony |