Centrum Skryptów - Systemy Operacyjne

Jak znaleźć i zastąpić tekst w pliku tekstowym?

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 znaleźć i zastąpić tekst w pliku tekstowym?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak użyć skryptu uruchamianego z wiersza poleceń do otwarcia pliku i zastąpienia wybranego tekstu, np. zamiany wszystkich wystąpień imienia „Jim” na „James”?

-- JW

Cześć Skrypciarze! Odpowiedź

Cześć, JW. Jak już wiele razy mieliśmy okazję się przekonać przy pracy z plikami tekstowymi, nie jest to wcale oczywiste – nie istnieje polecenie typu ReplaceText, które otwierałoby plik tekstowy i po prostu zamieniało tekst. Na całe szczęście, podobnie jak to ma miejsce w większości problemów w pracy z plikami tekstowymi, nie jest to oczywiste, ale jak najbardziej możliwe.

Nie możemy więc bezpośrednio wyszukać i zastąpić tekstu, ale możemy zrobić to, że tak powiem, podstępem. Najpierw otworzymy plik tekstowy, a następnie odczytamy jego zawartość i przechowamy ją w zmiennej. Dzięki temu będziemy mogli wyszukać i zastąpić tekst w naszej zmiennej, po czym ponownie zapiszemy plik. Wszystko to można zrobić z poziomu wiersza poleceń – wyjaśnimy to za chwilę. Tymczasem zajmijmy się tym prostym skryptem, który wykona operację wyszukania i zastąpienia:

Const ForReading = 1

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")

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



strText = objFile.ReadAll

objFile.Close

strNewText = Replace(strText, "Jim ", "James ")



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

objFile.WriteLine strNewText

objFile.Close

Zaczynamy od utworzenia dwu stałych (ForReading i ForWriting), których użyjemy, kiedy będziemy otwierać plik (otworzymy go zresztą dwukrotnie). Tworzymy wystąpienie obiektu FileSystemObject, a następnie używamy metody OpenTextFile do otwarcia pliku C:\Scripts\Text.txt do odczytu.

Po otwarciu pliku używamy metody ReadAll, która odczytuje całą zawartość pliku i przechowuje ją w zmiennej strText. Następnie zamykamy plik C:\Scripts\Text.txt tylko po to, by zaraz go ponownie otworzyć, tym razem do zapisu. Wydaje się to głupie, ale tak właśnie działa FileSystemObject: plik można otworzyć tylko do odczytu lub do zapisu, ale nie można wykonać obu działań za jednym zamachem. (Jak już pewnie wiecie, FileSystemObject to bardzo tajemniczy obiekt.)

Po zapisaniu zawartości pliku w zmiennej strText, używamy funkcji Replace języka VBScript, która zastępuje wszystkie wystąpienia imienia Jim imieniem James. Służy do tego poniższy wiersz kodu:

strNewText = Replace(strText, "Jim ", "James ")

Zwróćmy uwagę, że wyszukujemy wystąpienia ciągu „Jim ” (tzn. Jim i spacja) i zastępujemy je ciągiem „James ” (James i spacja). Skrypt nie stanie się może dzięki temu inteligentny, ale zyska może chociaż bardzo mały rozumek – jeśli natkniemy się na imię Jimmy, występujący w nim fragment Jim nie zostanie zastąpiony (co utworzyłoby ciąg znaków Jamesmy). Nowoutworzony plik – ten, w którym każdy Jim został zamieniony na Jamesa – jest przechowywany w pamięci w zmiennej strNewText.

Następnie otwieramy ponownie plik, tym razem do odczytu, wywołujemy metodę WriteLine by zapisać w nim zawartość zmiennej strNewText, po czym zamykamy plik. Co nam to daje? Jeśli na początku mieliśmy taki plik:

Jim Jones

Mary Smith

Jim Doe

Jim Johnson

Mary Johnston

to teraz wygląda on tak:

James Jones

Mary Smith

James Doe

James Johnson

Mary Johnston

Jeśli chcemy zrobić to z wiersza poleceń, musimy po prostu zmodyfikować skrypt tak, by przyjął on trzy argumenty – odpowiednio: nazwę pliku, który chcemy otworzyć; tekst, który chcemy wyszukać; tekst, którym chcemy go zastąpić. Poniżej znajduje się właśnie taki skrypt. Zwróćmy uwagę, że argumenty wiersza poleceń przechowujemy w zmiennych strFileName, strOldText i strNewText, a następnie używamy tych zmiennych przy otwieraniu i zapisywaniu pliku oraz przy wywoływaniu funkcji Replace:

Const ForReading = 1

Const ForWriting = 2



strFileName = Wscript.Arguments(0)

strOldText = Wscript.Arguments(1)

strNewText = Wscript.Arguments(2)



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile(strFileName, ForReading)



strText = objFile.ReadAll

objFile.Close

strNewText = Replace(strText, strOldText, strNewText)



Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)

objFile.WriteLine strNewText

objFile.Close

Aby uruchomić zmodyfikowany skrypt (który nazwaliśmy replace.vbs) wystarczy wpisać w polecenie takie jak poniżej:

cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
 Do początku strony Do początku strony

Centrum Skryptów - Systemy Operacyjne