Centrum skryptów - Systemy operacyjne

Jak sprawdzić, czy dwa wiersze tekstu znajdują się w jakimś pliku i jeżeli nie, to dodać je do tego pliku? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

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 sprawdzić, czy dwa wiersze tekstu znajdują się w jakimś pliku i jeżeli nie, to dodać je do tego pliku?

Cześć, Skrypciarze! Zacznę od tego, że bardzo lubię Wasze skrypty, są przydatne, a przede wszystkim dowcipne. Jesteście pissa's (czyli po australijsku „dowcipni”). Tyle z pochwał, teraz utyskiwanie. Chodzi o to, że mam skrypt, który ma otworzyć plik, zorientować się czy dwa wiersze tekstu znajdują się w tym pliku, a następnie, jeżeli są, to zostawić plik w świętym spokoju, jeżeli zaś nie ma, to dodać te dwie linijki. Myślałem, że ten skrypt nie jest za bardzo skomplikowany, jakimś cudem jednak nie działa jak powinien, tylko dodaje te dwa wiersze niezależnie od tego, czy ona są już tam zawarte czy nie. Czy możecie mi pomóc?

-- GT

Cześć, GT, g’day! To chyba też po Waszemu. Zawsze fajnie jest usłyszeć od kogoś z drugiego końca świata, ma się wrażenie, że świat stał się rzeczywiście taką globalną wioską. Ponoć Wasza wielka wioska została ostro zjechana za swoją reklamę dla cudzoziemców jakiś czas temu przez użycie sformułowania “bloody…”. Nie skomentuję, ale uważam, że to bardzo fajna reklama promująca turystykę i że Brytoni bardzo przesadzili.

Dobra, podlizałem się już w odpowiedzi na pochwałę, czas więc zająć się Twoim pytaniem. Z tego, co zrozumiałem wynika, że musisz zmodyfikować plik All.js, czyli plik, którego używa się do konfiguracji przeglądarki Firefox. Jeżeli więc myślisz, że tylko dlatego, że nas pochwaliłeś odpowiemy Ci na to pytanie zamiast nakłaniać do korzystania w przeglądarki Internet Explorer to grubo…

Nie mylisz się.

Właśnie tak zrobimy i odpowiemy na Twoje pytanie, tacy przewrotni jesteśmy.

Z tego, co nam napisałeś wynika, że podczas przechodzenia skryptu przez plik All.js wyszukuje on następujące wiersze tekstu:

pref("general.config.obscure_value", 0);

pref("general.config.filename", "mozilla.cfg");

Potrzebny nam skrypt, który ustali, czy te dwa wiersze znajdują się w danym pliku czy nie. Jeżeli nie, to skrypt musu dodać te dwa wiersze do pliku All.js. Innymi słowy, potrzebny nam następujący skrypt:

Const ForReading = 1

Const ForAppending = 8



blnMissingA = True

blnMissingB = True

 

strTextA = "pref(" & Chr(34) & "general.config.obscure_value" & chr(34) & ", 0);"

strTextB = "pref(" & Chr(34) & "general.config.filename" & chr(34) & ", " & Chr(34) & "mozilla.cfg" & Chr(34) & ");"



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\All.js", ForReading)



Do Until objFile.AtEndOfStream

    strLine = objFile.ReadLine

    If InStr(strLine, strTextA) Then

        blnMissingA = False

    ElseIf InStr(strLine, strTextB) Then

        blnMissingB = False

    End If    

Loop

 

objFile.Close



If blnMissingA  Then 

    strAdder = strTextA & vbCrLf

End If

   

If blnMissingB Then 

    strAdder = strAdder & strTextB & vbCrLf

End If 



If strAdder <> "" Then

    Set objFile = objFSO.OpenTextFile("C:\Scripts\All.js", ForAppending)

    objFile.Write strAdder

    objFile.Close

End If

Popatrzmy jak działa powyższy skrypt. Zaczynamy od zdefiniowania pary stałych - ForReading oraz ForAppending; będą nam one potrzebne podczas pracy z plikiem tekstowym. Następnie przypisujemy wartość true zmiennym blnMissingA oraz blnMissingB. Tych zmiennych będziemy używać w celu wyszukania naszych dwóch zmiennych w tekście i stwierdzenia, czy znajdują się tam, czy nie. Ustawiamy tę wartość na True ponieważ jeszcze nie odnaleźliśmy żadnej z tych wartości (w sumie to nie zaczęliśmy jeszcze na dobre szukać).

W następnych dwóch wierszach przypisujemy dwa docelowe wiersze tekstu do zmiennych strTextA oraz strTextB. Nie byliśmy pijani pisząc ten skrypt, musieliśmy po prostu poumieszczać podwójne cudzysłowy wewnątrz ciągu. Każde wystąpienie Chr(34) reprezentuje bowiem podwójny cudzysłów:

strTextA = "pref(" & Chr(34) & "general.config.obscure_value" & chr(34) & ", 0);"

strTextB = "pref(" & Chr(34) & "general.config.filename" & chr(34) & ", " & Chr(34) & "mozilla.cfg" & Chr(34) & ");"

W pierwszym wierszu zatem łączymy wszystkie te elementy i przypisujemy ciąg zmiennej strTextA:

  • pref(
  • "
  • general.config.obscure_value
  • "
  • , 0);

Dość standardowo, nie?

Po zdefiniowaniu stałych i zmiennych przystępujemy teraz do otworzenia pliku All.js (dla potrzeb niniejszego skryptu zachowaliśmy go w folderze C:\Scripts). Poniższe dwa wiersze kodu tworzą wystąpienie obiektu Scripting.FileSystemObject, a następnie otwierają plik C:\Scripts\All.js do odczytu:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Scripts\All.js", ForReading)

Zgaduj zgadula co teraz. Dobrze, ustawiamy teraz pętlę Do Until, która przechodzi przez plik wiersz po wierszu:

Do Until objFile.AtEndOfStream

Wewnątrz pętli korzystamy z metody ReadLine i czytamy pierwszy wiersz w pliku, nadając tę wartość zmiennej strLine:

strLine = objFile.ReadLine

Następnie korzystamy z funkcji InStr i sprawdzamy, czy dany wiersz zawiera wartość przechowywaną w zmiennej strTextA:

If InStr(strLine, strTextA) Then

Jeżeli odnajdziemy żądany tekst, to zmieniamy wartość blnMissingA na False:

blnMissingA = False

Następnie sprawdzamy w ten sam sposób wartość ciągu przechowywaną w strTextB. Po zrobieniu tego wracamy do góry pętli i powtarzamy cały proces dla kolejnego wiersza pliku tekstowego. Po przejściu przez cały plik zamykamy go:

objFile.Close

Teraz sprawdzamy czy wartość blnMissingA jest równa True. Jeżeli jest, to dodajemy wartość strTextA nowej zmiennej o nazwie strAdder. Do tego służy poniższy fragment kodu:

If blnMissingA Then 

    strAdder = strTextA & vbCrLf

End If

Dlaczego tak robimy? Jeżeli nie można odnaleźć strTextA w All.jsto oznacza to, że: 1) blnMissingA nadal będzie miała wartość true; 2) musimy dodać wartość strTextA do pliku tekstowego. Następnie sprawdzamy w ten sam sposób blnMissingB; a jeżeli blnMissingB ma wartość true, dodajemy strTextB do zmiennej strAdder:

If blnMissingB Then 

    strAdder = strAdder & strTextB & vbCrLf

End If

Jeżeli nie udało się odnaleźć żadnego z naszych wierszy docelowych, to strAdder będzie równa:

pref("general.config.obscure_value", 0);

pref("general.config.filename", "mozilla.cfg");

Już zbliżamy się do końca. Trzeba najpierw sprawdzić czy strAdder nie jest pustym ciągiem:

If strAdder <> "" Then

Jeżeli jest, to oznacza to, że oba nasze ciągi znajdują się w pliku All.js. W takim wypadku nasza praca dobiegła końca. Jeżeli jednak strAdder nie jest pustym ciągiem, to musimy uruchomić poniższy wiersz kodu:

Set objFile = objFSO.OpenTextFile("C:\Scripts\All.js", ForAppending)

objFile.Write strAdder

objFile.Close

Otwieramy tu ponownie plik All.js, tym razem w celu dodania. Za pomocą metody Write dodajemy do pliku wartość strAdder, a następnie zamykamy plik.

Powinno działać. Idę sobie zrobić kanapkę z Vegemite na Twoją cześć, GT chociaż wiem, że kłócicie się z Brytonami o pierwszeństwo Vegemite nad Marmite! Mam nadzieję, że nie zasiałem wśród czytelników ziarna niezgody, tylko każdy po prostu pójdzie zrobić sobie z czymś kanapkę, bo ile można tak na głodniaka ślęczeć przed monitorem?

Ta, mates; see you all tomorrow.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne