Centrum Skryptów - Systemy Operacyjne

Jak odczytać plik tekstowy na komputerze zdalnym?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

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! Pytanie

Cześć, Skrypciarze! Jak odczytać plik tekstowy na komputerze zdalnym?

-- BM

Cześć Skrypciarze! Odpowiedź

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 Do początku strony

Centrum Skryptów - Systemy Operacyjne