Centrum Skrypciarzy - Systemy Operacyjne

Jak zastąpić pięć pierwszych znaków w pliku tekstowym pięcioma pierwszymi znakami w nazwie komputera?

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 zastąpić pięć pierwszych znaków w pliku tekstowym pięcioma pierwszymi znakami w nazwie komputera?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak otworzyć plik tekstowy i zastąpić pięć pierwszych znaków pierwszymi pięcioma znakami nazwy lokalnego komputera?

-- EC

Cześć Skrypciarze! Odpowiedź

Cześć, EC. Czasami piszący te słowa Skrypciarz gada po próżnicy. Na przykład kilka miesięcy temu napisał, że zamierza wrócić na studia, ale czy naprawdę chciał to zrobić? Prawdę mówiąc, nie. Już dawno minął czas, gdy chciał ciężko pracować i uczyć się czegokolwiek. Aż do wczoraj, kiedy jego życie zmieniło się na zawsze.

Dawno temu piszący te słowa Skrypciarz był dość bystry. Gdy ukończył szkołę średnią, zasypano go ofertami uczelni. Ostatecznie zdecydował się zostać w stanie Waszyngton – koniec końców, uniwersytet to uniwersytet. Albo tak mu się wydawało – dopóki Skypciarz nie zobaczył reklamy Dunkin’ Donuts University. Właśnie, uczelni, w której zajęcia dotyczą jedynie robienia i jedzenia pączków. Niestety, Skrypciarz piszący te słowa nie otrzymał zaproszenia na Dunkin’ Donuts University mimo sporego doświadczenia w jedzeniu pączków. Cóż, zapewne szukają bystrych, ciężko pracujących i odpowiedzialnych ludzi. Zawsze musi być jakiś haczyk.

Chyba że... Hej, komisjo rekrutacyjna Uniwersytetu Dunkin’ Donuts! Co myślicie o bystrym, ciężko pracującym i odpowiedzialnym gościu, który potrafi napisać skrypt mogący zastąpić pięć pierwszych znaków w pliku tekstowym nazwą lokalnego komputera? No dobra. A co powiecie na ten sam skrypt napisany przez nie tak bystrego, leniwego i nieszczególnie odpowiedzialnego gościa?

Const ForReading = 1

Const ForWriting = 2



Set objFSo = CreateObject("Scripting.FileSystemObject")

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



strContents = objFile.ReadAll

objFile.Close



Set objNetwork = CreateObject("Wscript.Network")

strComputer = objNetwork.ComputerName

strComputer = Left(strComputer, 5)



intlength = Len(strContents)

strRemainder = Right(strContents, intLength - 5)

strNewContents = strComputer & strRemainder



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

objFile.WriteLine strNewContents



objFile.Close

Żeby komisja rekrutacyjna nie pomyślała sobie, że Skrypciarz piszący te słowa po prostu ściągnął skrypt z Internetu (jak swoją pracę magisterską), poświęćmy trochę czasu na wyjaśnienie, jak on działa. Zacznijmy od tego, że mamy plik tekstowy o nazwie C:\Scripts\Test.txt, który wygląda tak:

XXXXX This is our text file. We want to replace the first five

characters (the Xs) with the first five characters of the

local computer's name.

Jak widzicie i możecie sami przeczytać, pięć pierwszych znaków w pliku tekstowym to po prostu iksy. Naszym zadaniem jest zastąpienie ich pięcioma pierwszymi znakami nazwy lokalnego komputera.

Aby to zrobić, zaczniemy od zdefiniowania dwóch stałych, ForReading i ForWriting; będziemy musieli ich użyć, gdy otworzymy plik Test.txt. (Tak, czy tego chcemy, czy nie, musimy otworzyć go dwa razy: raz, aby odczytać istniejącą zawartość i drugi raz, aby zastąpić ją nową, zmodyfikowaną.) Po zdefiniowaniu tych dwóch stałych użyjemy dwóch wierszy kodu, aby utworzyć wystąpienie Scripting.FileSystemObject i otworzyć plik tekstowy do odczytu:

Set objFSo = CreateObject("Scripting.FileSystemObject")

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

Mając już otwarty plik, użyjemy metody ReadAll do odczytania zawartości pliku (przechowując informacje w zmiennej o nazwie strContents), a następnie zamkniemy Test.txt:

strContents = objFile.ReadAll

objFile.Close

Co teraz? Naszym kolejnym krokiem jest uruchomienie następującego fragmentu kodu:

Set objNetwork = CreateObject("Wscript.Network")

strComputer = objNetwork.ComputerName

Tworzymy tu wystąpienie obiektu Wscript.Network, a następnie przydzielamy wartość właściwości ComputerName zmiennej strComputer. Zapewne nie jest zbyt wielką niespodzianką, że wartością właściwości ComputerName jest właśnie nazwa komputera. Oczywiście nie chcemy całej nazwy komputera, a jedynie pięć pierwszych znaków. Pamiętając o tym, używamy funkcji Left, aby otrzymać te pięć znaków i przechować je w zmiennej strComputer:

strComputer = Left(strComputer, 5)

Na przykład, jeśli uruchomimy skrypt na komputerze o nazwie GIZMONIC, zmienna strComputer będzie miała wartość:

GIZMO

Mamy już pięć pierwszych znaków nazwy komputera. Naszym kolejnym zadaniem jest zastąpienie pierwszych pięciu znaków w pliku tekstowym znakami z nazwy komputera. Zależnie od rodzaju informacji w pliku tekstowym, może to być możliwe przy użyciu operacji wyszukiwania i zamiany; operacja ta zadziała, jeśli pięcioma pierwszymi znakami pliku tekstowego zawsze będzie XXXX i jeśli problemem nie będzie zastąpienie innych wystąpień XXXXX ciągiem znaków GIZMO. Nie możemy być pewni, czy te warunki zawsze będą spełnione, więc zdecydowaliśmy się na następujące podejście:

intlength = Len(strContents)

strRemainder = Right(strContents, intLength - 5)

strNewContents = strComputer & strRemainder

W pierwszym wierszu tego fragmentu kodu używamy metody Len do obliczenia liczby znaków w strContents; wynosi ona 149. Jak wiecie, chcemy zastąpić jedynie pięć pierwszych znaków w tym ciągu; chcemy zachować znaki od 6 do 149 nietknięte. Po to właśnie jest drugi wiersz kodu; używamy w nim funkcji Right, aby zacząć na końcu ciągu i iść do początku, zbierając po drodze znaki. Ile znaków chcemy zebrać? Chcemy zebrać liczbę znaków równą całkowitej ich liczbie minus 5. (149 – 5 równa się 144, co oznacza, że chcemy zacząć na końcu ciągu i, pracując od prawej do lewej, zebrać pierwsze 144 znaki.) Następnie zmienna strRemainder otrzyma wartość równą wszystkim znakom ciągu oprócz pierwszych pięciu (bo zanim do nich doszliśmy przestaliśmy zbierać znaki).

Innymi słowy, strRemainder przyjmuje następującą wartość:

This is our text file. We want to replace the first five

characters (the Xs) with the first five characters of the

local computer's name.

Jak widzicie, jest to cały ciąg oprócz pierwszych pięciu znaków.

I w końcu w wierszu 3 łączymy zmienne strComputer i strRemainder, a następnie przydzielamy tę wartość zmiennej o nazwie strNewContents. Zmienna ta przyjmuje wartość:

GIZMO This is our text file. We want to replace the first five

characters (the Xs) with the first five characters of the

local computer's name.

W ten sposób zastąpiliśmy pięć pierwszych znaków w pliku tekstowym (XXXXX) pierwszymi pięcioma znakami nazwy komputera (GIZMO).

Zostało tylko ponowne otwarcie pliku Test.txt (tym razem do zapisu), użycie metody WriteLine w celu nadpisania nowej, zmodyfikowanej treści na starej i zamknięcie pliku:

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

objFile.WriteLine strNewContents



objFile.Close

To by było na tyle.

Mamy nadzieję, że to pomogło, EC. (I że zrobiło wrażenie na komisji rekrutacyjnej Dunkin’ Donuts University.) Chcielibyśmy zostać i odpowiedzieć na jeszcze parę pytań od publiczności, ale musimy pobiec do piekarni i kupić kilkadziesiąt pączków. W końcu nigdy nie jest za wcześnie na naukę do egzaminów wstępnych. Przynajmniej jeśli chcemy dostać się na Dunkin’ Donuts University.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Systemy Operacyjne