Poprzedni | Spis treści | Następny
DROGI UŻYTKOWNIKU! JEŚLI NIE JEST CI OBOJĘTNY LOS TEJ STRONY I JEJ AUTORA PROSZĘ O WSPARCIE FINANSOWE!
DALSZE FUNKCJONOWANIE TEJ STRONY ZALEŻY TYLKO I WYŁĄCZNIE OD CIEBIE I TWOJEGO WSPARCIA FINANSOWEGO! KAŻDA, NAWET NAJMNIEJSZA WPŁATA MA SENS!

WSZYSTKIE MATERIAŁY I PROJEKTY, KTÓRE UDOSTĘPNIONE SĄ NA MOJEJ STRONIE INTERNETOWEJ SĄ WCIĄŻ DOSTĘPNE BEZPŁATNIE (BEZ NATRĘTNYCH REKLAM I WYSKAKUJĄCYCH OKIENEK).

E. Przydatne pliki nagłówkowe

Ten dokument zgodny jest z NSIS 3.04


E.1 Funkcje operujące na pliku



E.1.1 Wprowadzenie


Dołączenie pliku nagłówkowego:

!include "FileFunc.nsh"

Wywołanie funkcji:

Section Install
     ${GetFileExt} "C:\Pobrane elementy\Index.html" $R0
     ; $R0="html"
SectionEnd
Section un.Install
     ${GetParent} "C:\Pobrane elementy\Index.html" $R0
     ; $R0="C:\Pobrane elementy"
SectionEnd


E.1.2 Locate


  • Wyszukuje pliki, katalogi oraz puste katalogi z maską oraz z opcją rozmiaru.

Składnia:

${Locate} "[Ścieżka]" "[Opcje]" "Funkcja"
"[Ścieżka]"   ; Dysk lub katalog
                    ;
"[Opcje]"      ; /L=[FD|F|D|DE|FDE]
                    ;     /L=FD	- Lokalizuje pliki oraz katalogi (domyślne)
                    ;     /L=F	- Lokalizuje tylko pliki
                    ;     /L=D	- Lokalizuje tylko katalogi
                    ;     /L=DE	- Lokalizuje tylko puste katalogi
                    ;     /L=FDE	- Lokalizuje pliki oraz puste katalogi
                    ; /M=[maska]
                    ;     /M=*.*			- Lokalizuje wszystko (domyślnie)
                    ;     /M=*.doc		- Lokalizuje Work.doc, 1.doc ...
                    ;     /M=Pho*			- Lokalizuje PHOTOS, phone.txt ...
                    ;     /M=win???.exe	- Lokalizuje winamp.exe, winver.exe ...
                    ;     /M=winamp.exe	- Lokalizuje tylko winamp.exe
                    ; /S=No:No[B|K|M|G]
                    ;     /S=			- Nie wykrywa rozmiaru pliku (szybsze) (domyślne)
                    ;     /S=0:0B		- Lokalizuje tylko pliki o rozmiarze 0 bajtów
                    ;     /S=5:9K		- Lokalizuje tylko pliki o rozmiarze od 5 do 9 kilobajtów
                    ;     /S=:10M		- Lokalizuje tylko pliki o rozmiarze 10 megabajtów lub mniej
                    ;     /S=1G		- Lokalizuje tylko pliki o rozmiarze 1 gigabajt lub więcej
                    ; /G=[1|0]
                    ;     /G=1		- Lokalizuje z podkatalogami (domyślnie)
                    ;     /G=0		- Lokalizuje bez podkatalogów
                    ; /B=[0|1]
                    ;     /B=0		- Baner nie jest używany (domyślnie)
                    ;     /B=1		- Baner jest używany. Wywołanie zwrotne, gdy funkcja
                    ;				   zaczyna wyszukiwać w nowym katalogu
"Funkcja"      ; Funkcja zwrotna, po znalezieniu

Function "Funkcja"
	; $R9    "path\name"
	; $R8    "path"
	; $R7    "name"
	; $R6    "size"  ($R6="", jeśli katalog, $R6="0", jeśli plik z parametrem /S=)

	; $R0-$R5  nie używane (zapisywanie do nich danych).
	; ...

	Push $var    ; jeśli $var="StopLocate" to wyjście z funkcji
FunctionEnd
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli katalog lub dysk nie istnieją
  • - Ustawiana jest flaga błędu, jeśli składnia jest błędna
  • - Czytaj więcej tutaj: Wtyczka Locate

Przykład (wyszukiwanie jednego pliku):

Section
	${Locate} "C:\ftp" "/L=F /M=RPC DCOM.rar /S=1K" "Przyklad1"
	; Plik 'RPC DCOM.rar' w katalogu 'C:\ftp' o rozmiarze 1 Kb lub więcej

	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2
	MessageBox MB_OK "$$R0=$R0"
SectionEnd

Function Przyklad1
	StrCpy $R0 $R9
	; $R0="C:\ftp\files\RPC DCOM.rar"

	MessageBox MB_YESNO '$R0$\n$\nSzukać kolejnego?' IDYES +2
	StrCpy $0 StopLocate

	Push $0
FunctionEnd

Przykład (zapisuje wyniki do pliku tekstowego):

Section
	GetTempFileName $R0
	FileOpen $R1 $R0 w
	${Locate} "C:\ftp" "/S=:2M /G=0" "Przyklad2"
	; Katalogi i wszystkie pliki o rozmiarze 2 Mb lub mniej
	; nie skanuj podkatalogów
	FileClose $R1

	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2
	Exec '"notepad.exe" "$R0"'
SectionEnd

Function Przyklad2
	StrCmp $R6 '' 0 +3
	FileWrite $R1 "Katalog=$R9$\r$\n"
	goto +2
	FileWrite $R1 "Plik=$R9  Rozmiar=$R6 Mb$\r$\n"

	Push $0
FunctionEnd

Przykład (zapisuje wyniki do pliku INI):

Section
	GetTempFileName $R0
	${Locate} "C:\ftp" "/L=F /S=0K" "Przyklad3"
	; Wszystkie pliki w katalogu 'C:\ftp' o rozmiarze w Kb

	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2
	Exec '"notepad.exe" "$R0"'
SectionEnd

Function Przyklad3
	WriteIniStr $R0 "$R8" "$R7" "$R6 Kb"

	Push $0
FunctionEnd

Przykład (usuwanie pustych katalogów):

Section
	StrCpy $R2 0
	StrCpy $R3 0

	loop:
	StrCpy $R1 0
	${Locate} "C:\ftp" "/L=DE" "Przyklad4"
	IntOp $R3 $R3 + 1
	IntOp $R2 $R2 + $R1
	StrCmp $R0 StopLocate +2
	StrCmp $R1 0 0 loop

	IfErrors 0 +2
	MessageBox MB_OK 'Błąd' IDOK +2
	MessageBox MB_OK '$R2 katalogi zostały usunięte$\n$R3 przebiegów'
SectionEnd

Function Przyklad4
	MessageBox MB_YESNOCANCEL 'Usunąć pusty katalog "$R9"?' IDNO end IDCANCEL cancel
	RMDir $R9
	IntOp $R1 $R1 + 1
	goto end

	cancel:
	StrCpy $R0 StopLocate

	end:
	Push $R0
FunctionEnd

Przykład (przeniesienie wszystkich plików do jednego katalogu):

Section
	StrCpy $R0 "C:\ftp"  ; Katalog, z którego przenosimy pliki
	StrCpy $R1 "C:\ftp2" ; Katalog, do którego przenosimy pliki

	StrCpy $R2 0
	StrCpy $R3 0
	${Locate} "$R0" "/L=F" "Przyklad5"

	IfErrors 0 +2
	MessageBox MB_OK 'Błąd' IDOK +4
	StrCmp $R3 0 0 +2
	MessageBox MB_OK '$R2 plików zostało przeniesionych' IDOK +2
	MessageBox MB_OK '$R2 plików zostało przeniesionych$\n$R3 NIE zostało przeniesionych'
SectionEnd

Function Przyklad5
	StrCmp $R8 $R1 +6
	IfFileExists '$R1\$R7' +4
	Rename $R9 '$R1\$R7'
	IntOp $R2 $R2 + 1
	goto +2
	IntOp $R3 $R3 + 1

	Push $0
FunctionEnd

Przykład (kopiowanie plików z logowaniem):

Section
	StrCpy $R0 "C:\ftp"  ; Katalog, z którego kopiujemy pliki
	StrCpy $R1 "C:\ftp2" ; Katalog, do którego kopiujemy pliki
	StrLen $R2 $R0

	GetTempFileName $0
	FileOpen $R3 $0 w
	${Locate} "$R0" "/L=FDE" "Przyklad6"
	FileClose $R3

	IfErrors 0 +2
	MessageBox MB_OK 'Błąd'

	Exec '"notepad.exe" "$0"'    ; Wyświetl dziennik w notatniku
SectionEnd

Function Przyklad6
	StrCpy $1 $R8 '' $R2

	StrCmp $R6 '' 0 +3
	CreateDirectory '$R1$1\$R7'
	goto end
	CreateDirectory '$R1$1'
	CopyFiles /SILENT $R9 '$R1$1'

	IfFileExists '$R1$1\$R7' 0 +3
	FileWrite $R3 "-stary:$R9  -nowy:$R1$1\$R7  -sukces$\r$\n"
	goto +2
	FileWrite $R3 "-stary:$R9  -nowy:$R1$1\$R7  -błąd$\r$\n"

	end:
	Push $0
FunctionEnd

Przykład (odtworzenie struktury katalogów):

Section
	StrCpy $R0 "C:\ftp"    ; Pobierana struktura katalogów
	StrCpy $R1 "C:\ftp2"   ; Katalog, do którego przeniesiona zostanie struktura katalogów
	StrLen $R2 $R0

	${Locate} "$R0" "/L=D" "Przyklad7"

	IfErrors 0 +2
	MessageBox MB_OK 'Błąd'
SectionEnd

Function Przyklad7
	StrCpy $1 $R9 '' $R2
	CreateDirectory '$R1$1'

	Push $0
FunctionEnd

Przykład:

(Lokalizacja z banerem - wymagana jest wtyczka NxS)

Section
	nxs::Show /NOUNLOAD `Instalator $(^Name)` /top \
       `Trwa wyszukiwanie$\r$\nProszę czekać..., jeśli możesz...` /h 1 /can 1 /end
	${Locate} "C:\WINDOWS" "/L=F /M=*.inf /B=1" "Przyklad8"
	nxs::Destroy
SectionEnd

Function Przyklad8
	StrCmp $R0 $R8 abortcheck
	StrCpy $R0 $R8
	nxs::Update /NOUNLOAD /sub "$R8" /pos 78 /end

	abortcheck:
	nxs::HasUserAborted /NOUNLOAD
	Pop $0
	StrCmp $0 1 0 +2
	StrCpy $0 StopLocate

	StrCmp $R9 '' end
	; ...

	end:
	Push $0
FunctionEnd


E.1.3 GetSize


  • Znajduje rozmiar pliku, maskę plików lub katalog.
  • Znajduje liczbę plików, katalogów i podkatalogów.

Składnia:

${GetSize} "[Ścieżka]" "[Opcje]" $var1 $var2 $var3
"[Ścieżka]"   ; Dysk lub katalog
              ;
"[Opcje]"     ; /M=[maska]
                   ;     /M=*.*			- Znajduje wszystko (domyślnie)
                   ;     /M=*.doc			- Znajduje Work.doc, 1.doc ...
                   ;     /M=Pho*			- Znajduje PHOTOS, phone.txt ...
                   ;     /M=win???.exe		- Znajduje winamp.exe, winver.exe ...
                   ;     /M=winamp.exe	- Znajduje tylko winamp.exe
                   ; /S=No:No[B|K|M|G]
                   ;     /S=			- Nie wykrywa rozmiaru pliku (szybsze) (domyślnie)
                   ;     /S=0:0B		- Wyszukuje tylko pliki o rozmiarze równym dokładnie 0 bajtów
                   ;     /S=5:9K		- Wyszukuje tylko pliki o rozmiarze od 5 do 9 kilobajtów
                   ;     /S=:10M		- Wyszukuje tylko pliki o rozmiarze 10 megabajtów lub mniejsze
                   ;     /S=1G		- Wyszukuje tylko pliki o rozmiarze 1 gigabajt lub większe
                   ; /G=[1|0]
                   ;     /G=1		- Wyszukuje w podkatalogach (domyślnie)
                   ;     /G=0		- Wyszukuje bez podkatalogów
                   ;
$var1           ; Wynik1: Rozmiar
$var2           ; Wynik2: Suma plików
$var3           ; Wynik3: Suma katalogów
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli katalog lub dysk nie istnieją
  • - Ustawiana jest flaga błędu, jeśli składnia jest błędna
  • - Czytaj więcej tutaj: Wtyczka Locate

Przykład (1):

Section
	; Znajduje rozmiar pliku "C:\WINDOWS\Explorer.exe" w kilobajtach

	${GetSize} "C:\WINDOWS" "/M=Explorer.exe /S=0K /G=0" $0 $1 $2
	; $0="220" Kb
	; $1="1"   plików
	; $2=""    katalogów

	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Przykład (2):

Section
	; Znajduje rozmiar katalogu "C:\Installs\Reanimator\Drivers" w megabajtach

	${GetSize} "C:\Installs\Reanimator\Drivers" "/S=0M" $0 $1 $2
	; $0="132" Mb
	; $1="555" plików
	; $2="55"  katalogów

	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Przykład (3):

Section
	; Znajduje liczbę plików i katalogów "C:\WINDOWS" (bez podkatalogów)

	${GetSize} "C:\WINDOWS" "/G=0" $0 $1 $2
	; $0=""    rozmiar
	; $1="253" plików
	; $2="46"  katalogów

	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd


E.1.4 DriveSpace


  • Zwraca całkowitą, zajmowaną lub wolną przestrzeń na dysku.

Składnia:

${DriveSpace} "[Napęd]" "[Opcje]" $var
"[Napęd]"     ; Dysk do sprawdzenia
                    ;
"[Opcje]"      ; /D=[T|O|F]
                    ;     /D=T  - Całkowita przestrzeń (domyślnie)
                    ;     /D=O  - Zajęta przestrzeń
                    ;     /D=F  - Wolna przestrzeń
                    ; /S=[B|K|M|G]
                    ;     /S=B  - Rozmiar w bajtach (domyślnie)
                    ;     /S=K  - Rozmiar w kilobajtach
                    ;     /S=M  - Rozmiar w megabajtach
                    ;     /S=G  - Rozmiar w gigabajtach
                    ;
$var             ; Wynik: Rozmiar
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli dysk nie istnieje lub nie jest gotowy
  • - Ustawiana jest flaga błędu, jeśli składnia jest błędna

Przykład:

Section
	${DriveSpace} "C:\" "/D=F /S=M" $R0
	; $R0="2530"   megabajtów wolnego miejsca na dysku C:
SectionEnd


E.1.5 GetDrives


  • Znajduje wszystkie dostępne napędy w systemie.

Składnia:

${GetDrives} "[Opcja]" "Funkcja"
"[Opcja]"       ; [FDD+HDD+CDROM+NET+RAM]
                     ;   FDD    Napędy stacji dyskietek
                     ;   HDD    Napędy dysku twardego
                     ;   CDROM  Napędy CD-ROM
                     ;   NET    Napędy sieciowe
                     ;   RAM    Napędy dysków RAM
                     ;
                     ; [ALL]
                     ;   Znajduje wszystkie napędy po literze (domyślnie)
                     ;
"Funkcja"       ; Funkcja zwrotna po znalezieniu

Function "Funkcja"
	; $9    "litera napędu"  (a:\ c:\ ...)
	; $8    "typ napędu"    (FDD HDD ...)

	; $R0-$R9 nie są używane (przechowywane są w nich dane).
	; ...

	Push $var    ; jeśli $var="StopGetDrives", to następuje wyjście z funkcji
FunctionEnd

Przykład1:

Section
	${GetDrives} "FDD+CDROM" "Przyklad1"
SectionEnd

Function Przyklad1
	MessageBox MB_OK "$9  (Napęd $8)"

	Push $0
FunctionEnd

Przykład2:

Section
	${GetDrives} "ALL" "Przyklad2"
SectionEnd

Function Przyklad2
	MessageBox MB_OK "$9  (Napęd $8)"

	Push $0
FunctionEnd

Przykład3 (pobiera typ napędu):

Section
	StrCpy $R0 "D:\"     ; Litera napędu
	StrCpy $R1 "nieprawidłowy"

	${GetDrives} "ALL" "Przyklad3"

	MessageBox MB_OK "Typ napędu $R0 to $R1"
SectionEnd

Function Przyklad3
	StrCmp $9 $R0 0 +3
	StrCpy $R1 $8
	StrCpy $0 StopGetDrives

	Push $0
FunctionEnd


E.1.6 GetTime


  • Pobiera czas lokalny lub systemowy.
  • Pobiera czas pliku (czas dostępu, czas utworzenia oraz czas ostatniej modyfikacji).

Składnia:

${GetTime} "[Plik]" "[Opcja]" $var1 $var2 $var3 $var4 $var5 $var6 $var7
"[Plik]"        ; Ignorowany, jeśli "L" lub "LS"
                   ;
"[Opcja]"     ; [Opcje]
                   ;   L   Czas lokalny
                   ;   A   Ostatni czas dostępu do pliku
                   ;   C   Czas utworzenia pliku
                   ;   M   Czas modyfikacji pliku
                   ;   LS  Czas systemowy (UTC)
                   ;   AS  Ostatni czas dostępu do pliku (UTC)
                   ;   CS  Czas utworzenia pliku (UTC)
                   ;   MS  Czas modyfikacji pliku (UTC)
                   ;
$var1           ; Wynik1: dzień
$var2           ; Wynik2: miesiąc
$var3           ; Wynik3: rok
$var4           ; Wynik4: nazwa dnia tygodnia
$var5           ; Wynik5: godzina
$var6           ; Wynik6: minuta
$var7           ; Wynik7: sekundy
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik nie istnieje
  • - Ustawiana jest flaga błędu, jeśli składnia jest błędna
  • - Zobacz także Wtyczka czasu

Przykład (pobiera czas lokalny):

Section
	${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
	; $0="01"      dzień
	; $1="04"      miesiąc
	; $2="2005"    rok
	; $3="Piątek"  nazwa dnia tygodnia
	; $4="16"      godzina
	; $5="05"      minuta
	; $6="50"      sekundy

	MessageBox MB_OK 'Data=$0/$1/$2 ($3)$\nCzas=$4:$5:$6'
SectionEnd

Przykład (pobiera czas pliku):

Section
	${GetTime} "$WINDIR\Explorer.exe" "C" $0 $1 $2 $3 $4 $5 $6
	; $0="12"       dzień
	; $1="10"       miesiąc
	; $2="2004"     rok
	; $3="Wtorek"   nazwa dnia tygodnia
	; $4="2"        godzina
	; $5="32"       minuta
	; $6="03"       sekundy

	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2
	MessageBox MB_OK 'Data=$0/$1/$2 ($3)$\nCzas=$4:$5:$6'
SectionEnd

Przykład (pobiera czas systemowy):

Section
	${GetTime} "" "LS" $0 $1 $2 $3 $4 $5 $6
	; $0="01"      dzień
	; $1="04"      miesiąc
	; $2="2005"    rok
	; $3="Piątek"  nazwa dnia tygodnia
	; $4="11"      godzina
	; $5="05"      minuta
	; $6="50"      sekundy

	MessageBox MB_OK 'Data=$0/$1/$2 ($3)$\nCzas=$4:$5:$6'
SectionEnd

Przykład (konwersja czasu na format 12-godzinny AM/PM):

Section
	${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6

	StrCmp $4 0 0 +3
	StrCpy $4 12
	goto +3
	StrCmp $4 12 +5
	IntCmp $4 12 0 0 +3
	StrCpy $7 AM
	goto +3
	IntOp $4 $4 - 12
	StrCpy $7 PM

	MessageBox MB_OK 'Data=$0/$1/$2 ($3)$\nCzas=$4:$5:$6 $7'
SectionEnd


E.1.7 GetFileAttributes


  • Pobiera atrybuty pliku lub katalogu.

Składnia:

${GetFileAttributes} "[Plik]" "[Atrybuty]" $var
"[Plik]"            ; Plik lub katalog
                       ;
"[Atrybuty]"     ; "ALL"  (domyślnie)
                       ;  -wszystkie atrybuty pliku połączone znakiem "|" na wyjściu
                       ;
                       ; "READONLY|HIDDEN|SYSTEM|DIRECTORY|ARCHIVE|
                       ;  DEVICE|NORMAL|TEMPORARY|SPARSE_FILE|REPARSE_POINT|
                       ;  COMPRESSED|OFFLINE|NOT_CONTENT_INDEXED|ENCRYPTED"
                       ;  -plik musi mieć określone atrybuty
                       ;
$var                ; Wynik:
                       ;    $var=atr1|atr2|... (jeśli użyto "ALL")
                       ;    $var=1   plik posiada określone atrybuty
                       ;    $var=0   plik nie posiada określonych atrybutów
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik nie istnieje

Przykład1:

Section
	${GetFileAttributes} "C:\MSDOS.SYS" "ALL" $R0
	; $R0=READONLY|HIDDEN|SYSTEM|ARCHIVE
SectionEnd

Przykład2:

Section
	${GetFileAttributes} "C:\MSDOS.SYS" "SYSTEM|HIDDEN" $R0
	; $R0=1
SectionEnd

Przykład3:

Section
	${GetFileAttributes} "C:\MSDOS.SYS" "NORMAL" $R0
	; $R0=0
SectionEnd


E.1.8 GetFileVersion


  • Pobiera informacje z pliku wykonywalnego.

Składnia:

${GetFileVersion} "[Plik wykonywalny]" $var
"[Plik wykonywalny]"   ; Plik wykonywalny (*.exe *.dll ...)
$var                            ; Wynik: Numer wersji
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik nie istnieje
  • - Ustawiana jest flaga błędu, jeśli plik nie posiada informacji o wersji

Przykład:

Section
	${GetFileVersion} "C:\ftp\program.exe" $R0
	; $R0="1.1.0.12"
SectionEnd


E.1.9 GetExeName


  • Pobiera nazwę instalatora (z poprawną wielkością liter w Windows 98/ME).

Składnia:

${GetExeName} $var

Przykład:

Section
	${GetExeName} $R0
	; $R0="C:\ftp\program.exe"
SectionEnd


E.1.10 GetExePath


  • Pobiera ścieżkę dostępu do instalatora ($EXEDIR z poprawną wielkością liter w Windows 98/ME).

Składnia:

${GetExePath} $var

Przykład:

Section
	${GetExePath} $R0
	; $R0="C:\ftp"
SectionEnd


E.1.11 GetParameters


  • Pobiera parametry linii poleceń.

Składnia:

${GetParameters} $var

Przykład:

Section
	${GetParameters} $R0
	; $R0="[parametry]"
SectionEnd


E.1.12 GetOptions


  • Pobiera opcje z parametrów linii poleceń.

Składnia:

${GetOptions} "[Parametry]" "[Opcja]" $var
"[Parametry]"     ; Parametry linii poleceń
                          ;
"[Opcje]"            ; Nazwa opcji
                          ;
$var                   ; Wynik: łańcuch znaków opcji
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli opcja nie została znaleziona
  • - Pierwszy znak łańcucha znaków opcji jest rozdzielnikiem parametru

Przykład1:

Section
	${GetOptions} "/S /T" "/T"  $R0

	IfErrors 0 +2
	MessageBox MB_OK "Nie znaleziono" IDOK +2
	MessageBox MB_OK "Znaleziono"
SectionEnd

Przykład2:

Section
	${GetOptions} "-INSTDIR=C:\Program Files\Common Files -SILENT=yes" "-INSTDIR="  $R0
	;$R0=C:\Program Files\Common Files
SectionEnd

Przykład3:

Section
	${GetOptions} '/SILENT=yes /INSTDIR="C:/Program Files/Common Files" /ADMIN=password' \
                      "/INSTDIR="  $R0
	;$R0=C:/Program Files/Common Files
SectionEnd

Przykład4:

Section
	${GetOptions} `-SILENT=yes -INSTDIR='"C:/Program Files/Common Files"' \
                       -ADMIN=password` "-INSTDIR="  $R0
	;$R0="C:/Program Files/Common Files"
SectionEnd


E.1.13 GetOptionsS


  • Tak samo jak dla funkcji GetOptions, ale rozróżniane są wielkości liter.


E.1.14 GetRoot


  • Pobiera katalog nadrzędny.

Składnia:

${GetRoot} "[Pełna Ścieżka dostępu]" $var

Przykład1:

Section
	${GetRoot} "C:\Program Files\NSIS" $R0
	; $R0="C:"
SectionEnd

Przykład2:

Section
	${GetRoot} "\\SuperPimp\NSIS\Source\exehead\Ui.c" $R0
	; $R0="\\SuperPimp\NSIS"
SectionEnd


E.1.15 GetParent


  • Pobiera katalog nadrzędny.

Składnia:

${GetParent} "[Ścieżka dostępu]" $var

Przykład:

Section
	${GetParent} "C:\Program Files\Winamp\uninstwa.exe" $R0
	; $R0="C:\Program Files\Winamp"
SectionEnd


E.1.16 GetFileName


  • Pobiera ostatnią część z ścieżki do katalogu.

Składnia:

${GetFileName} "[Ścieżka dostępu]" $var

Przykład:

Section
	${GetFileName} "C:\Program Files\Winamp\uninstwa.exe" $R0
	; $R0="uninstwa.exe"
SectionEnd


E.1.17 GetBaseName


  • Pobiera nazwę pliku bez rozszerzenia.

Składnia:

${GetBaseName} "[Ścieżka dostępu]" $var

Przykład:

Section
	${GetBaseName} "C:\ftp\program.exe" $R0
	; $R0="program"
SectionEnd


E.1.18 GetFileExt


  • Pobiera rozszerzenie pliku.

Składnia:

${GetFileExt} "[Ścieżka dostępu]" $var

Przykład:

Section
	${GetFileExt} "C:\ftp\program.exe" $R0
	; $R0="exe"
SectionEnd


E.1.19 BannerTrimPath


  • Skraca ścieżkę dostępu dla banera.

Składnia:

${BannerTrimPath} "[Ścieżka dostępu]" "[Opcja]" $var
"[Ścieżka dostępu]"    ;
                                 ;
"[Opcja]"                   ; [Długość][A|B|C|D]
                                 ;
                                 ; Długość  -Maksymalna długość łańcucha znaków
                                 ;   A      -Skraca ścieżkę dostępu w środku (domyślnie)
                                 ;           (C:\root\...\trzecia ścieżka dostępu)
                                 ;           Jeśli tryb A nie jest dostępny, to użyty zostanie tryb B
                                 ;   B      -Skraca ścieżkę dostępu z prawej
                                 ;           (C:\root\druga ścieżka dostępu\...)
                                 ;           Jeśli tryb B nie jest dostępny, to użyty zostanie tryb C
                                 ;   C      -Skraca ścieżkę dostępu z prawej
                                 ;           (C:\root\druga ścieżka dostępu\trzecia śc...)
                                 ;   D      -Skraca ścieżkę dostępu z prawej + nazwa pliku
                                 ;           (C:\root\druga śc...\trzecia ścieżka dostępu)
                                 ;           Jeśli tryb D nie jest dostępny, to użyty zostanie tryb C
                                 ;
$var                          ; Wynik:  Skrócona ścieżka dostępu

Przykład:

Section
	${BannerTrimPath} "C:\Server\Documents\Terminal\license.htm" "35A" $R0
	; $R0=C:\Server\...\Terminal\license.htm
SectionEnd

Przykład (wtyczka Banera):

!include "WinMessages.nsh"
!include "FileFunc.nsh"

Section
	Banner::show "Rozpoczynanie..."
	Banner::getWindow
	Pop $R1
	${Locate} "$WINDIR" "/L=F /M=*.* /B=1" "LocateCallback"
	Banner::destroy
SectionEnd

Function LocateCallback
	StrCmp $R0 $R8 code
	StrCpy $R0 $R8
	${BannerTrimPath} "$R8" "38B" $R8
	GetDlgItem $1 $R1 1030
	SendMessage $1 ${WM_SETTEXT} 0 "STR:$R8"

	code:
	StrCmp $R9 '' end
	; ...

	end:
	Push $0
FunctionEnd

Przykład

(Wtyczka NxS):

!include "FileFunc.nsh"

Section
	nxs::Show /NOUNLOAD `Instalacja $(^Name)` \
	  /top `Instalator coś wyszukuje$\nProszę czekać$\nJeśli możesz...` \
	  /h 1 /can 1 /end
	${Locate} "$WINDIR" "/L=F /M=*.* /B=1" "LocateCallback"
	nxs::Destroy
SectionEnd

Function LocateCallback
	StrCmp $R0 $R8 abortcheck
	StrCpy $R0 $R8
	${BannerTrimPath} "$R8" "55A" $R8
	nxs::Update /NOUNLOAD /sub "$R8" /pos 78 /end

	abortcheck:
	nxs::HasUserAborted /NOUNLOAD
	Pop $0
	StrCmp $0 1 0 +2
	StrCmy $0 StopLocate

	StrCmp $R9 '' end
	; ...

	end:
	Push $0
FunctionEnd


E.1.20 DirState


  • Sprawdza czy katalog jest pełny, pusty lub nie istnieje.

Składnia:

${DirState} "[Ścieżka dostępu]" $var
"[Ścieżka dostępu]"   ; Katalog
$var                          ; Wynik:
                                ;    $var=0  (pusty)
                                ;    $var=1  (pełny)
                                ;    $var=-1 (katalog nie został znaleziony)

Przykład:

Section
	${DirState} "$TEMP" $R0
	; $R0="1"  katalog jest pełny
SectionEnd


E.1.21 RefreshShellIcons


  • Po zmianie powiązania pliku, możesz wywołać tę funkcję, aby szybko odświeżyć powłokę Windows.

Składnia:

${RefreshShellIcons}

Przykład:

Section
	WriteRegStr HKCR "Winamp.File\DefaultIcon" "" "$PROGRAMFILES\Winamp\Winamp.exe,2"

	${RefreshShellIcons}
SectionEnd

E.2 Funkcje operujące na tekście



E.2.1 Wprowadzenie


Dołączenie pliku nagłówkowego:

!include "TextFunc.nsh"

Wywoływanie funkcji:

Section Instalacja
	${LineRead} "C:\a.log" "-1" $R0
	; $R0="Ostatnia linia$\r$\n"
SectionEnd
Section un.Instalacja
	${TrimNewLines} "Ostatnia linia$\r$\n" $R0
	; $R0="Ostatnia linia"
SectionEnd


E.2.2 LineFind


  • Znajduje określone linie w pliku tekstowym i pozwala na ich edycję lub podgląd poprzez funkcje zwrotne.

Składnia:

${LineFind} "[Plik1]" "[Plik2|/NUL]" "[Liczba linii]" "Funkcja"
"[Plik1]"             ; Wejściowy plik tekstowy
                         ;
"[Plik2|/NUL]"    ; [Plik2]
                         ;   Wyjściowy plik tekstowy
                         ;   Jeśli pusty, to Plik2=Plik1
                         ; [/NUL]
                         ;   Brak wyjściowego pliku tekstowego (odczytuje tylko Plik1)
                         ;
"[Liczba linii]"    ; [Nr|-Nr|Nr:Nr|{Nr}|{-Nr}|{Nr:Nr}]
                         ;   1:-1	wszystkie linie do zmiany (domyślnie)
                         ;   2		druga linia od początku
                         ;   -3	trzecia linia od końca
                         ;   5:9	zakres linii od 5 do 9
                         ;   {2}	tylko druga linia od początku na wyjściu
                         ;   {-3}	tylko trzecia linia od końca na wyjściu
                         ;   {5:9}	tylko zakres linii od 5 do 9 na wyjściu
                         ;
"Funkcja"           ; Funkcja zwrotna dla określonych linii

Function "Funkcja"
	; $R9       Bieżąca linia
	; $R8       Numer bieżącej linii
	; $R7       Negatywny numer bieżącej linii
	; $R6       Bieżący zakres linii
	; $R5       Uchwyt pliku otwartego do odczytu
	; $R4       Uchwyt pliku otwartego do zapisu ($R4="", jeśli "/NUL")

	; możesz użyć dowolnej funkcji operujących na łańcuchu znaków
	; $R0-$R3  nie są używane (przechowywane są w nich dane).
	; ...

	Push $var  ; jeśli $var="StopLineFind", to następuje wyjście z funkcji
	                  ; jeśli $var="SkipWrite", to pomija bieżącą linie (ignorowany, gdy "/NUL")

FunctionEnd
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik wejściowy nie istnieje
  • - Ustawiana jest flaga błędu, jeśli wyjściowa ścieżka pliku nie istnieje
  • - Zakres musi być określony rosnąco (2 4:5 9:-8 -5:-4 - 2:-1)
  • - Plik wyjściowy nie zostanie uaktualniony, jeśli nie dokonano żadnych zmian

Przykład1 (usuwa dwa pierwsze symbole):

Section
	${LineFind} "C:\a.log" "C:\a-edited.log" "3:-1" "Przyklad1"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Function Przyklad1
	${TrimNewLines} '$R9' $R9
	StrCpy $R9 $R9 '' 2
	StrCpy $R9 '$R9$\r$\n'
	; zaczyna od 3 linii i usuwa dwa pierwsze symbole

	Push $0
FunctionEnd

Przykład2 (pokazuje zmienione linie):

Section
	${LineFind} "C:\a.log" "a.log" "{5:12 15 -6:-5 -1}" "Przyklad2"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Function Przyklad2
	${TrimNewLines} '$R9' $R9
	StrCpy $R9 "$R9   ~zmieniona linia ($R8)~$\r$\n"

	Push $0
FunctionEnd

Przykład3 (usuwa linie):

Section
	${LineFind} "C:\a.log" "\logs\a.log" "2:3 10:-5 -3: - 2" "Przyklad3"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Function Przyklad3
	StrCpy $0 SkipWrite

	Push $0
FunctionEnd

Przykład4 (wstawia linie):

Section
	${LineFind} "C:\a.log" "" "10" "Przyklad4
	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Function Przyklad4
	FileWrite $R4 "---Pierwsza linia---$\r$\n"
	FileWrite $R4 "---Druga linia ...---$\r$\n"

	Push $0
FunctionEnd

Przykład5 (zamienia w pliku określoną ilość razy - wymagany jest "WordFunc.nsh"):

!include "WordFunc.nsh"

Section
	StrCpy $R0 0
	${LineFind} "C:\a.log" "C:\logs\a.log" "1:-1" "Przyklad5"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2
	MessageBox MB_OK "Zmienione linie=$R0"
SectionEnd

Function Przyklad5
	StrCpy $1 $R9

	${WordReplace} '$R9' ' ' '_' '+*' $R9

	StrCmp $1 $R9 +2
	IntOp $R0 $R0 + 1
	; $R0 - liczba zmienionych linii

	Push $0
FunctionEnd

Przykład6 (linia łańcucha znaków do obcięcia lub usunięcia):

Section
	${LineFind} "\a.log" "C:\logs\a.log" "" "Przyklad6"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2
	MessageBox MB_OK "Przetworzone linie=$R1:$R2"
SectionEnd

Function Przyklad6
	; (Obcina linie od linii do innej linii (również tę linię))
	StrCmp $R0 finish stop
	StrCmp $R0 start finish
	StrCmp $R9 'Początkowa linia$\r$\n' 0 skip
	StrCpy $R0 start
	StrCpy $R1 $R8
	goto code
	finish:
	StrCmp $R9 'Końcowa linia$\r$\n' 0 code
	StrCpy $R0 finish
	StrCpy $R2 $R8
	goto code
	skip:
	StrCpy $0 SkipWrite
	goto output
	stop:
	StrCpy $0 StopLineFind
	goto output

	; (Usuwa linie od linii do innej linii (również tę linię))
	; StrCmp $R0 finish code
	; StrCmp $R0 start finish
	; StrCmp $R9 'Początkowa linia$\r$\n' 0 code
	; StrCpy $R0 start
	; StrCpy $R1 $R8
	; goto skip
	; finish:
	; StrCmp $R9 'Końcowa linia$\r$\n' 0 skip
	; StrCpy $R0 finish
	; StrCpy $R2 $R8
	; skip:
	; StrCpy $0 SkipWrite
	; goto output

	code:
	; ...

	output:
	Push $0
FunctionEnd

Przykład7 (odczyt linii):

Section
	${LineFind} "C:\a.log" "/NUL" "1:-1" "Przyklad7"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Function Przyklad7
	MessageBox MB_OKCANCEL '$$R9  "Linia"=[$R9]$\n$$R8     "#" =[$R8]' IDOK +2
	StrCpy $0 StopLineFind

	Push $0
FunctionEnd


E.2.3 LineRead


  • Pobiera linię o określonym numerze z pliku.

Składnia:

${LineRead} "[Plik]" "[Numer linii]" $var
"[Plik]"               ; Wejściowy plik tekstowy
                         ;
"[Numer linii]"    ; [Nr|-Nr]
                         ;   3    liczba linii od początku
                         ;   -5   liczba linii od końca
                         ;
$var                  ; Wynik: Linia
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik wejściowy nie istnieje
  • - Ustawiana jest flaga błędu, jeśli linia błędu nie została znaleziona

Przykład:

Section
	${LineRead} "C:\a.log" "-1" $R0
	; $R0="Ostatnia linia$\r$\n"
SectionEnd


E.2.4 FileReadFromEnd


  • Odczytuje plik tekstowy od ostatniej linii.

Składnia:

${FileReadFromEnd} "[Plik]" "Funkcja"
"[Plik]"        ; Wejściowy plik tekstowy
"Funkcja"    ; Funkcja zwrotna

Function "Funkcja"
	; $9       Bieżąca linia
	; $8       Bieżący numer linii
	; $7       Negatywny numer bieżącej linii

	; $R0-$R9 nie są używane (przechowywane są w nich dane).
	; ...

	Push $var      ; jeśli $var="StopFileReadFromEnd", to następuje wyjście z funkcji
FunctionEnd
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik wejściowy nie istnieje

Przykład1:

Section
	${FileReadFromEnd} "C:\a.log" "Przyklad1"

	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Function Przyklad1
	MessageBox MB_OKCANCEL '"Linia"=[$9]$\n   "#"=[$8]$\n  "-#"=[$7]' IDOK +2
	StrCpy $0 StopFileReadFromEnd

	Push $0
FunctionEnd

Przykład2 (odwraca plik tekstowy):

Section
	GetTempFileName $R0
	FileOpen $R1 $R0 w
	${FileReadFromEnd} "C:\a.log" "Przyklad2"
	FileClose $R1

	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2
	Exec '"notepad.exe" "$R0"'
SectionEnd

Function Przyklad2
	StrCmp $7 -1 0 +5
	StrCpy $1 $9 1 -1
	StrCmp $1 '$\n' +3
	StrCmp $1 '$\r' +2
	StrCpy $9 '$9$\r$\n'

	FileWrite $R1 "$9"

	Push $0
FunctionEnd


E.2.5 LineSum


  • Pobiera sumę linii w pliku tekstowym.

Składnia:

${LineSum} "[Plik]" $var
"[Plik]"      ; Plik wejściowy
$var          ; Wynik: Suma linii
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik wejściowy nie istnieje

Przykład:

Section
	${LineSum} "C:\a.log" $R0
	; $R0="54"
SectionEnd


E.2.6 FileJoin


  • Łączy dwa pliki w jeden (Plik1 + Plik2 = Plik3).

Składnia:

${FileJoin} "[Plik1]" "[Plik2]" "[Plik3]"
"[Plik1]"     ; Wejściowy Plik1
"[Plik2]"     ; Wejściowy Plik2
"[Plik3]"     ; Wyjściowy Plik3
                 ; Jeśli [Plik3]="", to dodaje [Plik2] do [Plik1]
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli wejściowe pliki nie istnieją
  • - Ustawiana jest flaga błędu, jeśli wyjściowa ścieżka pliku nie istnieje

Przykład1 (łączy: a.log + b.log = Z.log):

Section
	${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\Z.log"
SectionEnd

Przykład2 (dodaje: a.log + b.log = a.log):

Section
	${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\a.log"
SectionEnd


E.2.7 TextCompare


  • Porównuje dwa pliki tekstowe.

Składnia:

${TextCompare} "[Plik1]" "[Plik2]" "[Opcja]" "Funkcja"
"[Plik1]"     ; Plik1      Porównuje te linie
"[Plik2]"     ; Plik2      Porównuje z tymi liniami
"[Opcje]"    ; (linia po linii):
                  ; FastDiff   Porównuje linię N (Plik1) z linią N (Plik2)
                  ;            Wywołaj funkcję, jeśli znaleziono różną linie
                  ; FastEqual  Porównuje linię N (Plik1) z linią N (Plik2)
                  ;            Wywołaj funkcję, jeśli znaleziono taką samą linię
                  ; (numer linii niezależny):
                  ; SlowDiff   Porównuje linię N (Plik1) z wszystkimi liniami (Plik2)
                  ;            Wywołaj funkcję, jeśli linia N (Plik1) jest różna
                  ; SlowEqual  Porównuje linię N (Plik1) z wszystkimi liniami (Plik2)
                  ;            Wywołaj funkcję, jeśli linia N (Plik1) jest taka sama
"Funkcja"    ; Funkcja zwrotna

Function "Funkcja"
	; $9    "Linia Pliku1"
	; $8    "Numer linii"
	; $7    "Linia Pliku2" (pusty, jeśli SlowDiff)
	; $6    "Numer linii" (pusty, jeśli SlowDiff)

	; $R0-$R9  nie są używane (przechowywane są w nich dane).
	; ...

	Push $var    ; jeśli $var="StopTextCompare", to następuje wyjście z funkcji
FunctionEnd
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli Plik1 lub Plik2 nie istnieją
  • - Ustawiana jest flaga błędu, jeśli składnia jest błędna

Przykład (różne lub te same):

Section
	StrCpy $R0 ''
	${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Przyklad1"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +4

	StrCmp $R0 NotEqual 0 +2
	MessageBox MB_OK "Pliki różnią się" IDOK +2
	MessageBox MB_OK "Pliki są takie same"
SectionEnd

Function Przyklad1
	StrCpy $R0 NotEqual
	StrCpy $0 StopTextCompare

	Push $0
FunctionEnd

Przykład (porównuje linia po linii - Różne):

Section
	StrCpy $R0 'Text1.txt'
	StrCpy $R1 'Text2.txt'

	GetTempFileName $R2
	FileOpen $R3 $R2 w
	FileWrite $R3 "$R0 | $R1$\r$\n"
	${TextCompare} "$R0" "$R1" "FastDiff" "Przyklad2"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2

	Exec "notepad.exe $R2"
FunctionEnd

Function Przyklad2
	FileWrite $R3 '$8=$9'
	FileWrite $R3 '$6=$7$\r$\n'

	Push $0
FunctionEnd

Przykład (porównuje linia po linii - Te same):

Section
	StrCpy $R0 'Text1.txt'
	StrCpy $R1 'Text2.txt'

	GetTempFileName $R2
	FileOpen $R3 $R2 w
	FileWrite $R3 "$R0 | $R1$\r$\n"
	${TextCompare} "$R0" "$R1" "FastEqual" "Przyklad3"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2

	Exec "notepad.exe $R2"
FunctionEnd

Function Przyklad3
	FileWrite $R3 '$8|$6=$9'

	Push $0
FunctionEnd

Przykład (porównuje wszystkie linie - Różne):

Section
	StrCpy $R0 'Text1.txt'
	StrCpy $R1 'Text2.txt'

	GetTempFileName $R2
	FileOpen $R3 $R2 w
	FileWrite $R3 "$R0 | $R1$\r$\n"
	${TextCompare} "$R0" "$R1" "SlowDiff" "Przyklad4"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK end

	FileWrite $R3 "$\r$\n$R1 | $R0$\r$\n"
	${TextCompare} "$R1" "$R0" "SlowDiff" "Przyklad4"
	FileClose $R3
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK end

	Exec "notepad.exe $R2"

	end:
FunctionEnd

Function Przyklad4
	FileWrite $R3 '$8=$9'

	Push $0
FunctionEnd

Przykład (porównuje wszystkie linie - Te same):

Section
	StrCpy $R0 'Text1.txt'
	StrCpy $R1 'Text2.txt'

	GetTempFileName $R2
	FileOpen $R3 $R2 w
	FileWrite $R3 "$R0 | $R1$\r$\n"
	${TextCompare} "$R0" "$R1" "SlowEqual" "Przyklad5"
	IfErrors 0 +2
	MessageBox MB_OK "Błąd" IDOK +2

	Exec "notepad.exe $R2"
FunctionEnd

Function Przyklad5
	FileWrite $R3 '$8|$6=$9'

	Push $0
FunctionEnd

Przykład (pokazuje zmienne):

Section
	${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Przyklad6"

	IfErrors 0 +2
	MessageBox MB_OK "Błąd"
SectionEnd

Function Przyklad6
	MessageBox MB_OKCANCEL '\
		$$9  "Linia Pliku1" = [$9]$\n\
		$$8  "Linia #" = [$8]$\n\
		$$7  "Linia Pliku2" = [$7]$\n\
		$$6  "Linia #" = [$6]'\
		IDOK +2
	StrCmp $0 StopTextCompare

	Push $0
FunctionEnd


E.2.8 TextCompareS


  • Tak samo jak dla funkcji TextCompare, ale rozróżniane są wielkości liter.


E.2.9 ConfigRead


  • Odczytuje wartość z nazwy wejścia w pliku konfiguracyjnym.

Składnia:

${ConfigRead} "[Plik]" "[Wejście]" $var
"[Plik]"         ; Plik konfiguracyjny
                    ;
"[Wejście]"   ; Nazwa wejścia
                    ;
$var             ; Wynik: Wartość
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli nie znaleziono wejścia
  • - Ustawiana jest flaga błędu, jeśli plik nie istnieje

Przykład1:

Section
	${ConfigRead} "C:\AUTOEXEC.BAT" "SET winbootdir=" $R0
	; $R0=C:\WINDOWS
SectionEnd

Przykład2:

Section
	${ConfigRead} "C:\apache\conf\httpd.conf" "Timeout " $R0
	; $R0=30
SectionEnd


E.2.10 ConfigReadS


  • Tak samo jak dla funkcji ConfigRead, ale rozróżniane są wielkości liter.


E.2.11 ConfigWrite


  • Zapisuje wartość z nazwy wejścia w pliku konfiguracyjnym.

Składnia:

${ConfigWrite} "[Plik]" "[Wejście]" "[Wartość]" $var
"[Plik]"         ; Plik konfiguracyjny
                    ;
"[Wejście]"   ; Nazwa wejścia
                    ;
"[Wartość]"   ; Nazwa wartości
                    ; Jeśli "", to usuwa wejście
                    ;
$var             ; Wynik:
                    ;    $var=CHANGED  Wartość jest zapisywana
                    ;    $var=DELETED  Wejście jest usuwane
                    ;    $var=ADDED    Wejście oraz wartość są dodawane
                    ;    $var=SAME     Wejście oraz wartość już istnieją
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik nie istnieje
  • - Ustawiana jest flaga błędu, jeśli plik nie może być otworzony

Przykład1:

Section
	${ConfigWrite} "C:\AUTOEXEC.BAT" "SET winbootdir=" "D:\WINDOWS" $R0
	; $R0=CHANGED
SectionEnd

Przykład2:

Section
	${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "30" $R0
	; $R0=SAME
SectionEnd

Przykład3:

Section
	${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "" $R0
	; $R0=DELETED
SectionEnd


E.2.12 ConfigWriteS


  • Tak samo jak dla funkcji ConfigWrite, ale rozróżniane są wielkości liter.


E.2.13 FileRecode


  • Zmienia format pliku tekstowego z DOS do Windows i na odwrót.

Składnia:

${FileRecode} "[Plik]" "[Format]"
"[Plik]"           ;
                      ;
"[Format]"      ; OemToChar   - z DOS do Windows
                      ; CharToOem   - z Windows do DOS
Uwaga:
  • - Ustawiana jest flaga błędu, jeśli plik nie istnieje
  • - Ustawiana jest flaga błędu, jeśli składnia jest błędna

Przykład:

Section
	${FileRecode} "C:\SCANDISK.LOG" "CharToOem"
SectionEnd


E.2.14 TrimNewLines


  • Przycinanie łańcucha znaków.

Składnia:

${TrimNewLines} "[łańcuch znaków]" $var
"[łańcuch znaków]"    ; Wejściowy łańcuch znaków
$var                  	 ; Wynik: Łańcuch znaków bez '$\r' oraz '$\n' na końcu

Przykład:

Section
	${TrimNewLines} "Linia tekstu$\r$\n" $R0
	; $R0="Linia tekstu"
SectionEnd

E.3 Funkcje operujące na słowie



E.3.1 Wprowadzenie


Dołączenie pliku nagłówkowego:

!include "WordFunc.nsh"

Wywoływanie funkcji:

Section Instalacja
	${WordFind} "A--H---S" "-" "+2" $R0
	; $R0="H"
SectionEnd
Section un.Instalacja
	${WordReplace} "A--H---S" "-" "x" "+3*" $R0
	; $R0="A--HxS"
SectionEnd


E.3.2 WordFind


  • Wielowłasnościowa funkcja operująca na łańcuchach znaków.

Łańcuchy znaków:
"[wyraz+1][rozdzielnik][wyraz+2][rozdzielnik][wyraz+3]..."
"[rozdzielnik][wyraz+1][rozdzielnik][wyraz+2][rozdzielnik]..."
"[rozdzielnik][rozdzielnik][wyraz+1][rozdzielnik][rozdzielnik][rozdzielnik]..."
"...[wyraz-3][rozdzielnik][wyraz - 2][rozdzielnik][wyraz-1]"
"...[rozdzielnik][wyraz - 2][rozdzielnik][wyraz-1][rozdzielnik]"
"...[rozdzielnik][rozdzielnik][wyraz-1][rozdzielnik][rozdzielnik][rozdzielnik]"

Składnia:

${WordFind} "[łańcuch znaków]" "[rozdzielnik]" "[E][opcje]" $var
"[łańcuch znaków]"   ; [Łańcuch znaków]
                                ; Wejściowy łańcuch znaków
"[rozdzielnik]"           ; [Rozdzielnik]
                                ; Jeden lub kilka symboli
"[E][opcje]"              ; [Opcje]
                                ;  +liczba   : numer wyrazu od początku
                                ;  -liczba   : numer wyrazu od końca
                                ;  +liczba}  : numer rozdzielnika od początku
                                ;              cała przestrzeń po
                                ;              rozdzielnik do wyjścia
                                ;  +liczba{  : numer rozdzielnika od początku
                                ;              cała przestrzeń przed
                                ;              rozdzielnik do wyjścia
                                ;  +liczba}} : numer wyrazu od początku
                                ;              cała przestrzeń po tym wyrazie
                                ;              do wyjścia
                                ;  +liczba{{ : numer wyrazu od początku
                                ;              cała przestrzeń przed tym wyrazem
                                ;              do wyjścia
                                ;  +liczba{} : numer wyrazu od początku
                                ;              cała przestrzeń przed i po
                                ;              ten wyraz (wykluczenie wyrazu)
                                ;  +liczba*} : numer wyrazu od początku
                                ;              cała przestrzeń po
                                ;              wyraz do wyjścia z wyrazem
                                ;  +liczba{* : numer wyrazu od początku
                                ;              cała przestrzeń przed
                                ;              wyraz do wyjścia z wyrazem
                                ;  #         : suma wyrazów do wyjścia
                                ;  *         : suma rozdzielników do wyjścia
                                ;  /word     : liczba wyrazów do wyjścia
                                ;
                                ; [E]
                                ;  Z poziomem błędów na wyjściu
                                ;  IfErrors:
                                ;     $var=1  rozdzielnik nie znaleziony
                                ;     $var=2  nie ma takiego numeru wyrazu
                                ;     $var=3  błąd składni (użyj: +1,-1},#,*,/word,...)
                                ; []
                                ;  Brak poziomu błędów na wyjściu (domyślnie)
                                ;  Jeśli znaleziono jakieś błędy, to (wynik=wejściowy łańcuch znaków)
                                ;
$var                         ; Wyjście (wynik)
Uwaga:
  • - Akceptowane liczby: 1,01,001,...

Przykład (znajduje wyraz poprzez liczbę):

Section
	${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " C:\" "-02" $R0
	; $R0="Program Files"
SectionEnd

Przykład (wykluczanie rozdzielnika):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" " - 2}" $R0
	; $R0=" C:\logo.sys C:\WINDOWS"
SectionEnd

Przykład (suma wyrazów):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0
	; $R0="3"
SectionEnd

Przykład (suma rozdzielników):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "*" $R0
	; $R0="2"
SectionEnd

Przykład (znajduje numer wyrazu):

Section
	${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " " "/Files" $R0
	; $R0="3"
SectionEnd

Przykład ( }} ):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2}}" $R0
	; $R0=" C:\WINDOWS"
SectionEnd

Przykład ( {} ):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2{}" $R0
	; $R0="C:\io.sys C:\WINDOWS"
SectionEnd

Przykład ( *} ):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2*}" $R0
	; $R0="C:\logo.sys C:\WINDOWS"
SectionEnd

Przykład (pobiera katalog nadrzędny):

Section
	StrCpy $R0 "C:\Program Files\NSIS\NSIS.chm"
	;          "C:\Program Files\NSIS\Include\"
	;          "C:\\Program Files\\NSIS\\NSIS.chm"

	${WordFind} "$R0" "\" " - 2{*" $R0
	; $R0="C:\Program Files\NSIS"
	; "C:\\Program Files\\NSIS"
SectionEnd

Przykład (współrzędne):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" ":\lo" "E+1{" $R0
	; $R0="C:\io.sys C"
	IfErrors end

	StrLen $0 $R0             ; $0 = Pozycja startowa wyrazu (11)
	StrLen $1 ':\lo'          ; $1 = Długość wyrazu (4)
	; StrCpy $R0 $R1 $1 $0    ; $R0 = :\lo

	end:
SectionEnd

Przykład (z poziomem błędów na wyjściu):

Section
	${WordFind} "[łańcuch znaków]" "[rozdzielnik]" "E[opcje]" $R0

	IfErrors 0 end
	StrCmp $R0 1 0 +2       ; Poziom błędów 1?
	MessageBox MB_OK 'rozdzielnik nie został znaleziony' IDOK end
	StrCmp $R0 2 0 +2       ; Poziom błędów 2?
	MessageBox MB_OK 'nie ma takiego numeru wyrazu' IDOK end
	StrCmp $R0 3 0 +2       ; Poziom błędów 3?
	MessageBox MB_OK 'błąd składni'

	end:
SectionEnd

Przykład (bez poziomu błędów na wyjściu):

Section
	${WordFind} "C:\io.sys C:\logo.sys" "_" "+1" $R0

	; $R0="C:\io.sys C:\logo.sys" (błąd: rozdzielnik "_" nie został znaleziony)
SectionEnd

Przykład (jeśli znaleziono):

Section
	${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "E+1{" $R0

	IfErrors notfound found
	found:
	MessageBox MB_OK 'Znaleziono' IDOK end
	notfound:
	MessageBox MB_OK 'Nie znaleziono'

	end:
SectionEnd

Przykład (jeśli znaleziono 2):

Section
	${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "+1{" $R0

	StrCmp $R0 "C:\io.sys C:\logo.sys" notfound found        ; błąd?
	found:
	MessageBox MB_OK 'Znaleziono' IDOK end
	notfound:
	MessageBox MB_OK 'Nie znaleziono'

	end:
SectionEnd

Przykład (akceptacja jednego wyrazu łańcucha znaków, jeśli rozdzielnik nie został znaleziony):

Section
	StrCpy $0 'OneWord'
	StrCpy $1 1

	loop:
	${WordFind} "$0" " " "E+$1" $R0
	IfErrors 0 code
	StrCmp $1$R0 11 0 error
	StrCpy $R0 $0
	goto end

	code:
	; ...
	IntOp $1 $1 + 1
	goto loop

	error:
	StrCpy $1 ''
	StrCpy $R0 ''

	end:
	; $R0="OneWord"
SectionEnd


E.3.3 WordFindS


  • Tak samo jak dla funkcji WordFind, ale rozróżniane są wielkości liter.


E.3.4 WordFind2X


  • Znajduje wyraz pomiędzy dwoma rozdzielnikami

Łańcuchy znaków:
"[rozdzielnik1][wyraz+1][rozdzielnik2][rozdzielnik1][wyraz+2][rozdzielnik2]..."
"[tekst][rozdzielnik1][tekst][rozdzielnik1][wyraz+1][rozdzielnik2][tekst]..."
"...[rozdzielnik1][wyraz - 2][rozdzielnik2][rozdzielnik1][wyraz-1][rozdzielnik2]"
"...[tekst][rozdzielnik1][tekst][rozdzielnik1][wyraz-1][rozdzielnik2][tekst]"

Składnia:

${WordFind2X} "[łańcuch znaków]" "[rozdzielnik1]" "[rozdzielnik2]" "[E][opcje]" $var
"[łańcuch znaków]"  ; [łańcuch znaków]
                               ;  Wejściowy łańcuch znaków
"[rozdzielnik1]"        ; [rozdzielnik1]
                               ;  Pierwszy rozdzielnik
"[rozdzielnik2]"        ; [rozdzielnik2]
                               ;  Drugi rozdzielnik
"[E][opcje]"             ; [opcje]
                               ;  +liczba   : numer wyrazu od początku
                               ;  -liczba   : numer wyrazu od końca
                               ;  +liczba}} : numer wyrazu od początku całej przestrzeni
                               ;              po tym wyrazie do wyjścia
                               ;  +liczba{{ : numer wyrazu od końca całej przestrzeni
                               ;              przed tym wyrazem do wyjścia
                               ;  +liczba{} : numer wyrazu od początku
                               ;              cała przestrzeń przed i po
                               ;              ten wyraz (wykluczenie wyrazu)
                               ;  +liczba*} : numer wyrazu od początku
                               ;              cała przestrzeń po
                               ;              wyraz do wyjścia z wyrazem
                               ;  +liczba{* : numer wyrazu od początku
                               ;              cała przestrzeń przed
                               ;              wyraz do wyjścia z wyrazem
                               ;  #         : suma wyrazów do wyjścia
                               ;  /word     : liczba wyrazów do wyjścia
                               ;
                               ; [E]
                               ;  Z poziomem błędów na wyjściu
                               ;  IfErrors:
                               ;     $var=1  nie znaleziono wyrazów
                               ;     $var=2  nie ma takiego numeru wyrazu
                               ;     $var=3  błąd składni (użyj: +1,-1,#)
                               ; []
                               ;  Brak poziomu błędów na wyjściu (domyślnie)
                               ;  Jeśli znaleziono jakieś błędy, to (wynik=wejściowy łańcuch znaków)
                               ;
$var                        ; Wyjście (wynik)

Przykład (1):

Section
	${WordFind2X} "[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]" "[C:\" "];" "+2" $R0
	; $R0="logo.sys"
SectionEnd

Przykład (2):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1" $R0
	; $R0="logo"
SectionEnd

Przykład (3):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{{" $R0
	; $R0="C:\WINDOWS C:\io.sys C:"
SectionEnd

Przykład (4):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{}" $R0
	; $R0="C:\WINDOWS C:\io.sys C:sys"
SectionEnd

Przykład (5):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{*" $R0
	; $R0="C:\WINDOWS C:\io.sys C:\logo."
SectionEnd

Przykład (6):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "/logo" $R0
	; $R0="2"
SectionEnd

Przykład (z poziomem błędów na wyjściu):

Section
	${WordFind2X} "[io.sys];[C:\logo.sys]" "\" "];" "E+1" $R0
	; $R0="1" ("\...];" nie został znaleziony)

	IfErrors 0 noerrors
	MessageBox MB_OK 'Poziom błędów=$R0' IDOK end

	noerrors:
	MessageBox MB_OK 'Brak błędów'

	end:
SectionEnd


E.3.5 WordFind2XS


  • Tak samo jak dla funkcji WordFind2X, ale rozróżniane są wielkości liter.


E.3.6 WordFind3X


  • Znajduje wyraz w łańcuchu znaków, pomiędzy dwoma rozdzielnikami.

Składnia:

${WordFind3X} "[łańcuch znaków]" "[rozdzielnik1]" "[środek]" "[rozdzielnik2]" "[E][opcje]" $var
"[łańcuch znaków]"  ; [łańcuch znaków]
                               ; Wejściowy łańcuch znaków
"[rozdzielnik1]"        ; [rozdzielnik1]
                               ; Pierwszy rozdzielnik
"[środek]"                ; [środek]
                               ; Środkowy łańcuch znaków
"[rozdzielnik2]"        ; [rozdzielnik2]
                               ; Drugi rozdzielnik
"[E][opcje]"             ; [opcje]
                               ;  +liczba   : numer wyrazu od początku
                               ;  -liczba   : numer wyrazu od końca
                               ;  +liczba}} : numer wyrazu od początku całej przestrzeni
                               ;              po tym wyrazie do wyjścia
                               ;  +liczba{{ : numer wyrazu od końca całej przestrzeni
                               ;              przed tym wyrazem do wyjścia
                               ;  +liczba{} : numer wyrazu od początku
                               ;              cała przestrzeń przed i po
                               ;              ten wyraz (wykluczenie wyrazu)
                               ;  +liczba*} : numer wyrazu od początku
                               ;              cała przestrzeń po
                               ;              wyraz do wyjścia z wyrazem
                               ;  +liczba{* : numer wyrazu od początku
                               ;              cała przestrzeń przed
                               ;              wyraz do wyjścia z wyrazem
                               ;  #         : suma wyrazów do wyjścia
                               ;  /word     : liczba wyrazów do wyjścia
                               ;
                               ; [E]
                               ;  z poziomem błędów na wyjściu
                               ;  IfErrors:
                               ;     $var=1  nie znaleziono wyrazów
                               ;     $var=2  nie ma takiego numeru wyrazu
                               ;     $var=3  błąd składni (użyj: +1,-1,#)
                               ; []
                               ;  Brak poziomu błędów na wyjściu (domyślnie)
                               ;  Jeśli znaleziono jakieś błędy, to (wynik=wejściowy łańcuch znaków)
                               ;
$var               	       ; Wyjście (wynik)

Przykład (1):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "+1" $R0
	; $R0="1.AAB"
SectionEnd

Przykład (2):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1" $R0
	; $R0="2.BAA"
SectionEnd

Przykład (3):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{{" $R0
	; $R0="[1.AAB];"
SectionEnd

Przykład (4):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{}" $R0
	; $R0="[1.AAB];[3.BBB];"
SectionEnd

Przykład (5):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{*" $R0
	; $R0="[1.AAB];[2.BAA];"
SectionEnd

Przykład (6):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "/2.BAA" $R0
	; $R0="2"
SectionEnd

Przykład (z poziomem błędów na wyjściu):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "XX" "];" "E+1" $R0
	; $R0="1" ("[...XX...];" nie znaleziono)

	IfErrors 0 noerrors
	MessageBox MB_OK 'Poziom błędów=$R0' IDOK end

	noerrors:
	MessageBox MB_OK 'Brak błędów'

	end:
SectionEnd


E.3.7 WordFind3XS


  • Tak samo jak dla funkcji WordFind3X, ale rozróżniane są wielkości znaków.


E.3.8 WordReplace


  • Zamienia lub usuwa wyraz z łańcucha znaków.

Składnia:

${WordReplace} "[łańcuch znaków]" "[wyraz1]" "[wyraz2]" "[E][opcje]" $var
"[łańcuch znaków]"  ; [łańcuch znaków]
                               ; Wejściowy łańcuch znaków
"[wyraz1]"               ; [wyraz1]
                               ; Wyraz do zamiany lub usunięcia
"[wyraz2]"               ; [wyraz2]
                               ; Zamieniany wyraz (jeśli pusty, kasowany)
"[E][opcje]"             ; [opcje]
                               ;  +liczba  : Ilość znaków wyrazu od początku
                               ;  -liczba  : Ilość znaków wyrazu od końca
                               ;  +liczba* : Ilość znaków wyrazu od początku zamiana wielokrotna
                               ;  -liczba* : Ilość znaków wyrazu od końca zamiana wielokrotna
                               ;  +        : Zamienia wszystkie wyniki
                               ;  +*       : Zamienia wielokrotnie wszystkie wyniki
                               ;  {        : Jeśli istnieją zamienia wszystkie rozdzielniki
                               ;             od lewej strony
                               ;  }        : Jeśli istnieją zamienia wszystkie rozdzielniki
                               ;             od prawej strony
                               ;  {}       : Jeśli istnieją zamienia wszystkie rozdzielniki
                               ;             po obu stronach
                               ;  {*       : Jeśli istnieją wielokrotnie zamienia wszystkie
                               ;             rozdzielniki od lewej strony
                               ;  }*       : Jeśli istnieją wielokrotnie zamienia wszystkie
                               ;             rozdzielniki od prawej strony
                               ;  {}*      : Jeśli istnieją wielokrotnie zamienia wszystkie
                               ;             rozdzielniki po obu stronach
                               ;
                               ; [E]
                               ;  Z poziomem błędów na wyjściu
                               ;  IfErrors:
                               ;     $var=1  wyraz do zastąpienia nie został znaleziony
                               ;     $var=2  brak takiego numeru wyrazu
                               ;     $var=3  błąd składni (użyj: +1,-1,+1*,-1*,+,+*,{},{}*)
                               ; []
                               ;  Brak poziomu błędów na wyjściu (domyślnie)
                               ;  Jeśli znaleziono jakieś błędy to (wynik=wejściowy łańcuch znaków)
                               ;
$var                        ; Wyjście (wynik)

Przykład (zamiana):

Section
	${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "bmp" "+2" $R0
	; $R0="C:\io.sys C:\logo.bmp C:\WINDOWS"
SectionEnd

Przykład (usuwanie):

Section
	${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "" "+" $R0
	; $R0="C:\io. C:\logo. C:\WINDOWS"
SectionEnd

Przykład (wielokrotna zamiana 1):

Section
	${WordReplace} "C:\io.sys      C:\logo.sys   C:\WINDOWS" " " " " "+1*" $R0
	; +1* lub +2* lub +3* lub +4* lub +5* lub +6*
	; $R0="C:\io.sys C:\logo.sys   C:\WINDOWS"
SectionEnd

Przykład (wielokrotna zamiana 2):

Section
	${WordReplace} "C:\io.sys C:\logo.sysSYSsys C:\WINDOWS" "sys" "bmp" "+*" $R0
	; $R0="C:\io.bmp C:\logo.bmp C:\WINDOWS"
SectionEnd

Przykład (wielokrotna zamiana 3):

Section
	${WordReplace} "sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys" "sys" "|" "{}*" $R0
	; $R0="|C:\io.sys C:\logo.sys C:\WINDOWS|"
SectionEnd

Przykład (z poziomem błędów na wyjściu):

Section
	${WordReplace} "C:\io.sys C:\logo.sys" "sys" "bmp" "E+3" $R0
	; $R0="2" (brak takiego numeru wyrazu "+3")

	IfErrors 0 noerrors
	MessageBox MB_OK 'Poziom błędów=$R0' IDOK end

	noerrors:
	MessageBox MB_OK 'Brak błędów'

	end:
SectionEnd


E.3.9 WordReplaceS


  • Tak samo jak dla funkcji WordReplace, ale rozróżniane są wielkości znaków.


E.3.10 WordAdd


  • Dodaje wyrazy do łańcucha znaków1 z łańcucha znaków2, jeśli nie istnieją lub usuwa wyrazy, jeśli te istnieją.

Składnia:

${WordAdd} "[łańcuch znaków1]" "[rozdzielnik]" "[E][opcje]" $var
"[łańcuch znaków1]"  ; [łańcuch znaków1]
                                 ; Łańcuch znaków do dodania lub usunięcia
"[rozdzielnik]"      	 ; [rozdzielnik]
                                 ; Jeden lub kilka symboli rozdzielających
"[E][opcje]"               ; [opcje]
                                 ;  +łańcuch znaków2 : wyrazy do dodania
                                 ;  -łańcuch znaków2 : wyrazy do usunięcia
                                 ;
                                 ; [E]
                                 ;  Z poziomem błędów na wyjściu
                                 ;  IfErrors:
                                 ;     $var=1  rozdzielnik jest pusty
                                 ;     $var=3  błąd składni (użyj: +text,-text)
                                 ; []
                                 ;  Bez poziomu błędów na wyjściu (domyślnie)
                                 ;  Jeśli znaleziono błędy, to (wynik=wejściowy łańcuch znaków)
                                 ;
$var                          ; Wyjście (wynik)

Przykład (dodawanie):

Section
	${WordAdd} "C:\io.sys C:\WINDOWS" " " "+C:\WINDOWS C:\config.sys" $R0
	; $R0="C:\io.sys C:\WINDOWS C:\config.sys"
SectionEnd

Przykład (usuwanie):

Section
	${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " \
                                   "-C:\WINDOWS C:\config.sys C:\IO.SYS" $R0
	; $R0="C:\logo.sys"
SectionEnd

Przykład (dodanie do jednego):

Section
	${WordAdd} "C:\io.sys" " " "+C:\WINDOWS C:\config.sys C:\IO.SYS" $R0
	; $R0="C:\io.sys C:\WINDOWS C:\config.sys"
SectionEnd

Przykład (usunięcie jednego):

Section
	${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "-C:\WINDOWS" $R0
	; $R0="C:\io.sys C:\logo.sys"
SectionEnd

Przykład (nie znaleziono nowych wyrazów):

Section
	${WordAdd} "C:\io.sys C:\logo.sys" " " "+C:\logo.sys" $R0
	StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2
	MessageBox MB_OK "Nie znaleziono żadnych nowych wyrazów do dodania"
SectionEnd

Przykład (nie usunięto wyrazów):

Section
	${WordAdd} "C:\io.sys C:\logo.sys" " " "-C:\config.sys" $R0
	StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2
	MessageBox MB_OK "Nie znaleziono żadnych wyrazów do usunięcia"
SectionEnd

Przykład (z poziomem błędów na wyjściu):

Section
	${WordAdd} "C:\io.sys C:\logo.sys" "" "E-C:\logo.sys" $R0
	; $R0="1" (rozdzielnik jest pusty "")

	IfErrors 0 noerrors
	MessageBox MB_OK 'Poziom błędów=$R0' IDOK end

	noerrors:
	MessageBox MB_OK 'Brak błędów'

	end:
SectionEnd


E.3.11 WordAddS


  • Tak samo jak dla funkcji WordAdd, ale rozróżniane są wielkości liter.


E.3.12 WordInsert


  • Wstawia wyraz do łańcucha znaków.

Składnia:

${WordInsert} "[łańcuch znaków]" "[rozdzielnik]" "[wyraz]" "[E][opcje]" $var
"[łańcuch znaków]"  ; [łańcuch znaków]
                               ; Wejściowy łańcuch znaków
"[rozdzielnik]"          ; [rozdzielnik]
                               ; Jeden lub kilka symboli rozdzielających
"[wyraz]"                 ; [wyraz]
                               ; Wyraz do wstawienia
"[E][opcje]"             ; [opcje]
                               ;  +liczba  : ilość liter od początku
                               ;  -liczba  : ilość liter od końca
                               ;
                               ; [E]
                               ;  Z poziomami błędów na wyjściu
                               ;  IfErrors:
                               ;     $var=1  rozdzielnik jest pusty
                               ;     $var=2  nieprawidłowy numer litery
                               ;     $var=3  błąd składni (użyj: +1,-1)
                               ; []
                               ;  Wyjście bez poziomu błędów (domyślnie)
                               ;  Jeśli znaleziono jakieś błędy to (wynik=wejściowy łańcuch znaków)
                               ;
$var                        ; Wyjście (wynik)

Przykład (1):

Section
	${WordInsert} "C:\io.sys C:\WINDOWS" " " "C:\logo.sys" " - 2" $R0
	; $R0="C:\io.sys C:\logo.sys C:\WINDOWS"
SectionEnd

Przykład (2):

Section
	${WordInsert} "C:\io.sys" " " "C:\WINDOWS" "+2" $R0
	; $R0="C:\io.sys C:\WINDOWS"
SectionEnd

Przykład (3):

Section
	${WordInsert} "" " " "C:\WINDOWS" "+1" $R0
	; $R0="C:\WINDOWS "
SectionEnd

Przykład (z poziomem błędów na wyjściu):

Section
	${WordInsert} "C:\io.sys C:\logo.sys" " " "C:\logo.sys" "E+4" $R0
	; $R0="2" (błędny numer litery "+4")

	IfErrors 0 noerrors
	MessageBox MB_OK 'Poziom błędów=$R0' IDOK end

	noerrors:
	MessageBox MB_OK 'Brak błędów'

	end:
SectionEnd


E.3.13 WordInsertS


  • Tak samo jak dla funkcji WordInsert, ale rozróżniane są wielkości liter.


E.3.14 StrFilter


  • Konwertuje łańcuch znaków na małe lub wielkie litery.
  • Ustawia filtr symbolu.

Składnia:

${StrFilter} "[łańcuch znaków]" "[opcje]" "[symbole1]" "[symbole2]" $var
"[łańcuch znaków]"  ; [łańcuch znaków]
                               ;  Wejściowy łańcuch znaków
                               ;
"[opcje]"                  ;  [+|-][1|2|3|12|23|31][eng|rus]
                               ;  +   : Konwertuje łańcuch znaków na wielkie litery
                               ;  -   : Konwertuje łańcuch znaków na małe litery
                               ;  1   : Tylko cyfry
                               ;  2   : tylko litery
                               ;  3   : Tylko znaki specjalne
                               ;  12  : Tylko cyfry + litery
                               ;  23  : Tylko litery + znaki specjalne
                               ;  31  : Tylko znaki specjalne + cyfry
                               ;  eng : Symbole angielskie (domyślnie)
                               ;  rus : Symbole rosyjskie
                               ;
"[symbole1]"           ; [symbole1]
                               ;  Symbole dołączane (niezmienialne)
                               ;
"[symbole2]"           ; [symbole2]
                               ; Symbole wykluczane
                               ;
$var                        ; Wyjście (wynik)
Uwaga:
  • - Gdy wystąpi błąd ustawiania jest flaga błędu
  • - Te same symbole do dołączenia & do wykluczenia = do wykluczenia

Przykład (wielkie litery (UpperCase)):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "+" "" "" $R0
	; $R0="123ABC 456DEF 7890|%#"
SectionEnd

Przykład (małe litery (LowerCase)):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "-" "ef" "" $R0
	; $R0="123abc 456dEF 7890|%#"
SectionEnd

Przykład (Filtr1):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "2" "|%" "" $R0
	; $R0="abcDEF|%"      ;tylko litery + |%
SectionEnd

Przykład (Filtr2):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0
	; $R0="123a 6F 78|%#" ;tylko cyfry + znaki specjalne + af - 4590
SectionEnd

Przykład (Filtr3):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0
	; $R0="123AbC4567890" ;tylko cyfry + litery + b - def
SectionEnd

Przykład (Filtr4):

Section
	${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "+12rus" "ä" "ãå" $R0
	; $R0="123ÀÁÂ456ä7890" ;tylko cyfry + litery + ä - ãå
SectionEnd

Przykład (Litery angielskie + rosyjskie):

Section
	${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "2rus" "" "" $R0
	; $R0="ÀÁÂãäå"       ;tylko litery rosyjskie
	${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "2" "$R0" "" $R0
	; $R0="abcÀÁÂDEFãäå" ;tylko litery angielskie + rosyjskie
SectionEnd

Przykład (zmiana wielkości liter wyrazów):

Section
	Push "_01-PERPETUOUS_DREAMER__-__THE_SOUND_OF_GOODBYE_(ORIG._MIX).MP3_"
	Call Capitalize
	Pop $R0
	; $R0="_01-Perpetuous_Dreamer__-__The_Sound_Of_Goodbye_(Orig._Mix).mp3_"

	${WordReplace} "$R0" "_" " " "+*" $R0
	; $R0=" 01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3 "

	${WordReplace} "$R0" " " "" "{}" $R0
	; $R0="01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3"
SectionEnd

Function Capitalize
	Exch $R0
	Push $0
	Push $1
	Push $2

	${StrFilter} '$R0' '-eng' '' '' $R0
	${StrFilter} '$R0' '-rus' '' '' $R0

	StrCpy $0 0

	loop:
	IntOp $0 $0 + 1
	StrCpy $1 $R0 1 $0
	StrCmp $1 '' end
	StrCmp $1 ' ' +5
	StrCmp $1 '_' +4
	StrCmp $1 '-' +3
	StrCmp $1 '(' +2
	StrCmp $1 '[' 0 loop
	IntOp $0 $0 + 1
	StrCpy $1 $R0 1 $0
	StrCmp $1 '' end

	${StrFilter} '$1' '+eng' '' '' $1
	${StrFilter} '$1' '+rus' '' '' $1

	StrCpy $2 $R0 $0
	IntOp $0 $0 + 1
	StrCpy $R0 $R0 '' $0
	IntOp $0 $0 - 2
	StrCpy $R0 '$2$1$R0'
	goto loop

	end:
	Pop $2
	Pop $1
	Pop $0
	Exch $R0
FunctionEnd


E.3.15 StrFilterS


  • Tak samo jak dla funkcji StrFilter, ale rozróżniane są wielkości liter.


E.3.16 VersionCompare


  • Porównuje numery wersji.

Składnia:

${VersionCompare} "[Wersja1]" "[Wersja2]" $var
"[Wersja1]"        ; Pierwsza wersja
"[Wersja2]"        ; Druga wersja
$var                   ; Wynik:
                          ;    $var=0  Wersje są takie same
                          ;    $var=1  Wersja1 jest nowsza
                          ;    $var=2  Wersja2 jest nowsza

Przykład:

Section
	${VersionCompare} "1.1.1.9" "1.1.1.01" $R0
	; $R0="1"
SectionEnd


E.3.17 VersionConvert


  • Konwertuje wersje w formacie numerycznym, które mogą być porównywane.

Składnia:

${VersionConvert} "[Wersja]" "[Lista znaków]" $var
"[Wersja]"            ; Wersja
			    ;
"[Lista znaków]"   ; Lista znaków, które zostaną zamienione przez liczby
                            ; "abcdefghijklmnopqrstuvwxyz" (domyślne)
                            ;
$var                      ; Wynik: skonwertowana wersja
Uwaga:
  • - Skonwertowane litery są rozdzielone kropką
  • - Jeśli znak nie jest cyfrą i nie znajduje się na liście zostanie zamieniony na kropkę

Przykład1:

Section
	${VersionConvert} "9.0a" "" $R0
	; $R0="9.0.01"

	${VersionConvert} "9.0c" "" $R1
	; $R1="9.0.03"

	${VersionCompare} "$R0" "$R1" $R2
	; $R2="2"   wersja2 jest nowsza
SectionEnd

Przykład2:

Section
	${VersionConvert} "0.15c-9m" "" $R0
	; $R0="0.15.03.9.13"

	${VersionConvert} "0.15c-1n" "" $R1
	; $R1="0.15.03.1.14"

	${VersionCompare} "$R0" "$R1" $R2
	; $R2="1"   wersja1 jest nowsza
SectionEnd

Przykład3:

Section
	${VersionConvert} "0.15c+" "abcdefghijklmnopqrstuvwxyz+" $R0
	; $R0="0.15.0327"

	${VersionConvert} "0.15c" "abcdefghijklmnopqrstuvwxyz+" $R1
	; $R1="0.15.03"

	${VersionCompare} "$R0" "$R1" $R2
	; $R2="1"   wersja1 jest nowsza
SectionEnd