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