Centrum skryptów - Systemy operacyjne

Czy można usunąć adresy IP z całego pliku tekstowego, nie usuwając innych danych?

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.

Czy można usunąć adresy IP z całego pliku tekstowego, nie usuwając innych danych?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam plik zawierający w każdym wierszu adres IP i nazwę serwera. Chcę usunąć adresy IP, pozostawiając jedynie nazwy serwerów?

-- RR

Cześć Skrypciarze! Odpowiedź

Cześć, RR. Jeśli Cię to interesuje, to w czasie pisania tego artykułu temperatura wynosi ciągle około zera, a wszędzie wokół widać śnieg i lód. Zauważmy, że niektórzy z naszych czytelników wcale nie współczują Skrypciarzom. „Macie koło zera i mówicie, że to za zimno?? Do diabła, u nas w [tu wstaw nazwę miejscowości] jest minus 15 i jakoś nikt nie narzeka! Czy w Seattle są same cieniasy?”

Spieszymy z odpowiedzią: jak najbardziej. Nikogo oprócz cieniasów tu nie uświadczysz.

Co gorsza, niektórzy z nas są nie tylko cieniasami, ale i dziwakami. I tak, wczoraj rano, kiedy Skrypciarz piszący te słowa dotarł na przystanek, zastał tam kilka osób czekających na ulubiony przez wszystkich autobus 245. Jeden z czekających miał na sobie bluzę z kapturem założonym na wełnianą czapę. Miał też adidasy i spodenki do joggingu, ale nie miał skarpet. Czekając w takim stroju (a rękawiczki trzymał w rękach, zamiast mieć je na rękach!), zagadnął sąsiada: „Ale dzisiaj zimno, no nie?”

Trudno, żeby nie!

Jak sobie zatem takie cieniasy jak my radzą w ten smutny zimowy czas? Trudno powiedzieć, jak inni mieszkańcy Seattle, ale Skrypciarze zajmują się pisaniem skryptów mogących usunąć z pliku tekstowego wyłącznie adresy IP, pozostawiając w nim nazwy serwerów:

Const ForReading = 1

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)



Do Until objFile.AtEndOfStream

    strLine = objFile.ReadLine

    arrItems = Split(strLine, ", ")

    strNewContent = strNewContent & arrItems(1) & vbCrLf

Loop



objFile.Close



Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForWriting)

objFile.Write strNewContent

objFile.Close

Cudnie: nic tak nie rozgrzewa, jak piękny skrypt, prawda? Za chwilę wyjaśnimy, jak on działa, ale na razie zwróćmy uwagę, że zawartość omawianego pliku wygląda mniej-więcej tak:

192.168.1.1, atl-dc-01

192.168.1.2, atl-dc-02

192.168.1.3, atl-dc-03

192.168.1.4, atl-dc-04

Chcemy natomiast, aby wyglądała tak:

atl-dc-01

atl-dc-02

atl-dc-03

atl-dc-04

Jak to zrobimy? Patrzcie i podziwiajcie.

Na początek definiujemy dwie stałe: ForReading (o wartości równej 1) i ForWriting (o wartości równej 2); użyjemy ich po otwarciu pliku tekstowego. To nie pomyłka, że są dwie stałe – będziemy otwierać plik dwukrotnie: pierwszy raz w celu odczytania istniejącej zawartości, a drugi w celu zapisania zmian. Niestety nie da się inaczej pracować z plikami tekstowymi.

Po zdefiniowaniu stałych, za pomocą poniższych dwóch wierszy kodu tworzymy wystąpienie obiektu Scripting.FileSystemObject i otwieramy do odczytu plik C:\Scripts\Test.txt:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)

Teraz zaczyna się zabawa.

Na dobry początek tworzymy pętlę Do Until, która będzie działać, dopóki nie dojdzie do końca pliku tekstowego (w Seattle mamy taki zwrot: dopóki właściwość AtEndOfStream pliku nie osiągnie wartości True). Wewnątrz pętli używamy metody ReadLine , która odczytuje pierwszy wiersz pliku tekstowego i zapisuje go w zmiennej o nazwie strLine. Oznacza to, że po pierwszym uruchomieniu pętli, wartość strLine będzie wyglądać tak:

192.168.1.1, atl-dc-01

Bardzo dobrze, tyle tylko, że wartość ta powinna wyglądać nieco inaczej. A konkretnie tak:

atl-dc-01

Dlatego też w kolejnym wierszu kodu uruchamiamy metodę Split która tworzy tablicę (o nazwie arrItems), używając przecinka i spacji (, ) jako delimitera. Co dzięki temu zyskamy? Otóż zyskamy tablicę składającą się z dwóch elementów:

  • 192.168.1.1
  • atl-dc-01

Jak widzimy, drugi element (jego numer porządkowy to 1; pierwszy element tablicy zawsze ma numer 0) jest nazwą komputera, czyli tą wartością, którą chcemy zachować w pliku. Dlatego też pobieramy wartość elementu 1 i zapisujemy jego wartość w zmiennej strNewContent:

strNewContent = strNewContent & arrItems(1) & vbCrLf

Może ktoś zauważył, że tak naprawdę nie tylko zapisujemy wartość tego elementu. Przypisujemy zmiennej strNewContent jej dotychczasową wartość i dodajemy do niej element 1 oraz znak powrotu karetki (vbCrLf). Rzecz jasna, przed pierwszym uruchomieniem pętli zmienna strNewContent nie będzie miała żadnej wartości. Tak więc ostatecznie będzie ona wyglądać tak:

atl-dc-01

Teraz pętla uruchamia się po raz drugi, powtarzając cały proces dla drugiego wiersza naszego pliku. Element arrItems(1) ma wartość atl-dc-02, a po ukończeniu pętli, zmienna strNewContent ma wartość:

atl-dc-01

atl-dc-02

Teraz po raz trzeci uruchamiamy pętlę, powtarzając proces, dopóki nie zmodyfikujemy wszystkich wierszy naszego pliku. Po zakończeniu, zmienna strNewContent będzie wyglądać tak:

atl-dc-01

atl-dc-02

atl-dc-03

atl-dc-04

Czyli tak właśnie, jak powinien wyglądać nasz plik tekstowy.

Reszta jest prosta. Zamykamy plik Test.txt i natychmiast otwieramy go ponownie, tym razem do zapisu (używamy w tym celu stałej ForWriting). Za pomocą metody WriteLine zapisujemy w nim wartość zmiennej strNewContent, a następnie zamykamy go na dobre. I możemy wrócić do narzekania na pogodę.

Skrypciarz piszący te słowa, jako absolwent University of Washington, poczuwa się do jeszcze jednej uwagi na zakończenie. Pamiętacie tego wariata, który miał krótkie spodenki, nie miał skarpet i narzekał na zimno? Na bluzie miał logo tego właśnie uniwersytetu. Dalsze komentarze są zbędne.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne