Centrum skryptów - Systemy operacyjne

W jaki sposób mogę dodać do pliku tekstowego słowo, którego jeszcze w nim nie ma? 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.

W jaki sposób mogę dodać do pliku tekstowego słowo, którego jeszcze w nim nie ma?

Cześć Skrypciarzu! W jaki sposób mogę sprawdzić, czy w pliku tekstowym występuje jakieś słowo, a jeśli go nie ma – jak mogę je dodać?

-- JO

Cześć JO. Ostatnio zadawano nam to pytanie już kilka razy. Wspomniałeś też o dodawaniu słów do niestandardowego słownika Microsoft Word; inne osoby pytały o dodawanie wpisów do plików LMHost i podobnych. Tak więc dziś podamy rozwiązanie na uniwersalnym przykładzie (dodawanie komputera do listy nazw komputerów przechowywanej w pliku tekstowym), którego zaadaptowanie do innych potrzeb nie powinno przedstawiać problemu.

Na początek przyjmijmy, że mamy bardzo prosty plik tekstowy (C:\Scripts\Computers.txt), w którym podane są nazwy komputerów, po jednej w każdym wierszu:

atl-dc-01

atl-dc-02

atl-dc-03

Wyobraźmy sobie, że nabyliśmy właśnie nowy komputer (atl-dc-99) i chcemy dodać go do listy, upewniając się, że nazwa atl-dc-99 nie pojawia się w pliku. Jeśli po odczytaniu pliku okaże się, że ta nazwa już w nim jest, kończymy; jeśli jej nie ma, dodajemy ją do listy. Wykonamy to w trzech krokach: odczytanie pliku, sprawdzenie, czy nazwa nie znajduje się już na liście, dodanie (w razie potrzeby) nazwy do pliku.

Odczytajmy zatem plik. Oto kod który spowoduje otwarcie pliku C:\Scripts\Computers.txt, odczyta całą zawartość jako zmienną o nazwie strWordList, po czym zamknie plik:

Const ForReading = 1

Const ForAppending = 8



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile _

    ("C:\Scripts\Computers.txt", ForReading)

strWordList = objFile.ReadAll

objFile.Close

Zaczynamy definiując dwie stałe – ForReading oraz ForAppending – których użyjemy potem w pracy z plikiem tekstowym. Na razie potrzebujemy jednak jedynie stałej ForReading, dzięki której FileSystemObject wie, że chcemy otworzyć plik i odczytać jego zawartość. Plik można otworzyć w celu odczytania, zapisania lub zmodyfikowania (appending), ale naraz możliwe jest przeprowadzenie tylko jednej operacji.

Następnie tworzymy wystąpienie obiektu FileSystemObject i korzystając z metody OpenTextFile otwieramy plik w celu odczytania go. Następnie używamy metody ReadAll do odczytania całego pliku i przechowania zawartości w zmiennej strWordList. Teraz wywołujemy metodę Close i zamykamy plik.

Uwaga: Dlaczego plik trzeba zamknąć zaraz po otwarciu? Otóż, jeśli nazwa atl-dc-99 już znajduje się w pliku, to jest to właściwie koniec naszej z nim przygody. Co jednak, jeśli nazwa ta nie znajduje się w pliku Computers.txt? W takim wypadku musimy ją dodać do pliku. Jak wspomnieliśmy powyżej, niemożliwe jest odczytanie i modyfikacja pliku za jednym otwarciem. Dlatego też musimy zamknąć plik (otworzony w celu odczytania) i otworzyć go ponownie, tym razem w celu zmodyfikowania.

Kończymy zatem krok 1. W kroku 2 musimy określić, czy nazwa atl-dc-99 nie występuje już w pliku. W tym celu musimy zdefiniować poszukiwany ciąg znaków:

strSearchWord = "atl-dc-99" & vbCrLf

Proszę zwrócić uwagę, ze tworzymy ciąg znaków składający się z poszukiwanego słowa (atl-dc-99) oraz znaku powrotu karetki i przesunięcia o wiersz. Po co zadawać sobie tyle trudu? Otóż chcemy się upewnić, że znajdziemy ciąg atl-dc-99 oznaczający całą nazwę komputera, a nie stanowiący część dłuższej nazwy. Załóżmy że w skrypcie pominęliśmy powrót karetki i przesunięcie o wiersz, a nasze polecenie sprowadzało się do „Znajdź wszystkie wystąpienia ciągu atl-dc-99.” W takim razie znalezione byłyby nazwy takie jak:

atl-dc-999

atl-dc-9999

atl-dc-99-mail-server

No właśnie. Chcemy mieć pewność że każdy ciąg atl-dc-99 jaki znajdziemy stanowi całość wiersza, tak jak poniżej:

atl-dc-99

Innymi słowy, chodzi o określenie, czy osoba tworząca listę wpisała atl-dc-99, a potem nacisnęła ENTER. Dlatego potrzebny nam jest znak powrotu karetki i przesunięcia o wiersz bezpośrednio za ciągiem atl-dc-99.

Trzeba jednak pamiętać, że nawet przy takim podejściu nie jesteśmy całkiem bezpieczni. Skrypt zostanie na przykład oszukany przez nazwę taką jak ta:

seast-atl-dc-99

Jak zatem możemy określić, czy poszukiwany ciąg znaków pojawia się w pliku tekstowym? Pamiętajmy, że odczytana zawartość pliku przechowywana jest w zmiennej strWordList. Dlatego też możliwe jest użycie metody VBScript InStr do określenia, czy nasz poszukiwany ciąg pojawia się w pliku:

If InStr(strWordList, strSearchWord) = 0 Then

Jeśli ciąg zostanie znaleziony, metoda InStr poda miejsce zmiennej, gdzie zaczyna się on zaczyna; jeśli ciąg nie zostanie znaleziony, metoda InStr poda wynik 0. Tak więc obecność lub nieobecność ciągu atl-dc-99 możemy określić, sprawdzając wartość podawaną przez metodę InStr. Jeśli wartość ta jest różna od 0, oznacza to, ze poszukiwany ciąg został znaleziony i kończymy pracę z plikiem Computers.txt. Jeśli wartość jest równa 0, musimy dodać nazwę atl-dc-99 do pliku tekstowego. Zrobi to za nas poniższy kod:

Set objFile = objFSO.OpenTextFile _

    ("C:\Scripts\Computers.txt ", ForAppending)

objFile.WriteLine "atl-dc-99"

objFile.Close

Otwieramy tu ponownie plik (tym razem w celu zmodyfikowania go), po czym używamy metody WriteLine do zapisania ciągu atl-dc-99 w dole pliku. (Modyfikowanie – appending – z założenia powoduje dopisanie informacji na końcu pliku.) Następnie zamykamy plik i przechodzimy do ważniejszych zajęć.

A oto cały skrypt:

Const ForReading = 1

Const ForAppending = 8



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile _

    ("C:\Scripts\Computers.txt", ForReading)

strWordList = objFile.ReadAll

objFile.Close



strSearchWord = "atl-dc-99" & vbCrLf



If InStr(strWordList, strSearchWord) = 0 Then

    Set objFile = objFSO.OpenTextFile _

        ("C:\Scripts\Computers.txt ", ForAppending)

    objFile.WriteLine "atl-dc-99"

    objFile.Close

End If

 Do początku strony Do początku strony


Centrum skryptów - Systemy operacyjne