12.05.2015, 08:22
Przedstawiam uniwersalną funkcję/skrypt Zamien_polskie_litery do zastosowania w dowolnym skrypcie Batch bez potrzeby zmiany kodowania środowiska, zmiany czcionek, czy używania innego edytora tekstów. Funkcja ta zapewnia pracę na standardowym środowisku, ze standardowymi narzędziami i w taki sam sposób w różnych systemach Windows. Narzędzie to napisałem na własne potrzeby.
Funkcja zamienia lub usuwa polskie litery w zawartości zmiennej podanej w parametrze. Działa w zależności od parametru pomocniczego /TXT lub /CMD pomiędzy oboma środowiskami, czyli tekstowym, a wierszem polecenia. zatem raz może zamienić polskie litery z trybu tekstowego TXT na tryb poleceń CMD, a jeśli potrzebujemy, to odwrotnie, czyli z trybu poleceń CMD na tryb plików tekstowych TXT. Ten pomocniczy parametr /TXT lub /CMD ma tylko wskazywać z jakiego źródła pochodzi tekst, czyli jaki tryb będzie źródłem. Wtedy zamienia na odpowiednio przeciwny.
Funkcja może też usuwać polskie litery, czyli zamieniać „ogonki” na odpowiedniki angielskie, np. Ą na A:
/ANGT - usuwa polskie litery, gdy źródłem ma być tekst pochodzący z trybu tekstowego, jak pliki TXT, w tym z Batch (BAT)
/ANGC - usuwa polskie litery, gdy źródłem ma być tekst pochodzący z trybu wiersza poleceń CMD
Funkcję trzeba wkleić do swego skryptu Batch, np. na jego końcu, a wówczas wywołuje się ją podając CALL i etykietę skoku do funkcji, czyli generalnie tak:
CALL:Zamien_polskie_litery /TXT nazwa_zmiennej[
Można też ją zapisać jako osobny plik Batch, jako: Zamien_polskie_litery.bat
Wtedy wywołanie będzie nieco inne, to znaczy bez dwukropka : po słowie CALL. Poza tym nie trzeba wtedy wklejać całości do własnego skryptu.
CALL Zamien_polskie_litery /TXT nazwa_zmiennej
Zatem w parametrze podawana jest nazwa zmiennej, a zawartość tej zmiennej funkcja sama sobie pobierze, zaś wynik umieści w tej samej zmiennej, czyli po wykonaniu tej funkcji zawartość tej zmiennej ulegnie zmianie.
Funkcja operuje na praktycznie dowolnej liczbie zmiennych (łącznie 256 znaków tego polecenia), przykładowo:
CALL:Zamien_polskie_litery /TXT nazwa_zmiennej_1 nazwa_zmiennej_2 nazwa_zmiennej_3
Jeśli użyjemy parametru /CMD do zamiany z trybu komend wiersza poleceń CMD na tryb tekstowy plików tekstowych, np. do eksportu wyników jakiegoś polecenia do plików tekstowych, które potem mają zawierać prawidłowe polskie litery, to najpierw trzeba z takiego polecenia CMD wynik zaimportować do jakiejś zmiennej, gdyż funkcja ta działa tylko na zmiennych. Czyli najpierw przypisujemy wynik z CMD do jakiejś zmiennej, potem wywołujemy funkcję do zamiany polskich liter dla tej zmiennej i po tej zamianie możemy wyeksportować wynik zamiany z tej zmiennej do jakiegoś pliku tekstowego, np. raportu, czy pliku typu LOG. Przykładowo chcemy uzyskać w pliku tekstowym Wykaz_CMD.txt prawidłowy wykaz plików i katalogów z dobrymi polskimi literami, aby nie było krzaczków. Utworzymy ręcznie przykładowy plik lub podfolder z polskimi literami w jakimś folderze. Weźmiemy pierwsze trzy linie wykazu z tego folderu i wczytamy je do numerowanych zmiennych typu wykaz1. Zamienimy znaki i wyeksportujemy prawidłowy wynik do pliku tekstowego Wykaz_TXT.txt
Uwagi techniczne:
1. Funkcja używa zewnętrznej biblioteki CHARLIB.BAT i znajdź ją w Google lub na http://tiny.pl oraz umieść w folderze przeszukiwania Windows %PATH%
2. Funkcja jest odporna, czyli odpowiednio uwzględnia użycie w tekście znaku wykrzyknika ! lub kombinacji znaków ^! oraz ^^!
Wymaga to jednak od niej dodatkowych czynności, co jest zwarte w podfunkcjach „znaczniki_transformuj” do zamiany „przed” i przywróceniu „po”
Wszelkie wykrzykniki na koniec ustawia zależnie od środowiska, jako typ znaku specjalnego, czyli ^! lub odpowiednio ^^!
Poza tym, funkcja usuwa inne wystąpienia znaku daszka ^ (Kod=94) jeśli nie jest on połączony z wykrzyknikiem. Jeśli ktoś zatem użyje w zawartości zmiennej przykładowo ^( lub ^) to będzie musiał sam to przywrócić po wywołaniu funkcji lub zmodyfikować podfunkcje „znaczniki_transformuj”, aby i to uwzględniały.
Wystarczy w tym celu tylko w podfunkcji „znaczniki_transformuj_wynik” przed linią zaczynającą się od „if not defined …” wstawić dwa wiersze:
Poniżej kod tej funkcji do wklejenia i użycia w dowolnym innym własnym skrypcie lub do zapisania jako osobny plik Batch: Zamien_polskie_litery.bat
Opracowanie: Artur Zgadzaj
Funkcja zamienia lub usuwa polskie litery w zawartości zmiennej podanej w parametrze. Działa w zależności od parametru pomocniczego /TXT lub /CMD pomiędzy oboma środowiskami, czyli tekstowym, a wierszem polecenia. zatem raz może zamienić polskie litery z trybu tekstowego TXT na tryb poleceń CMD, a jeśli potrzebujemy, to odwrotnie, czyli z trybu poleceń CMD na tryb plików tekstowych TXT. Ten pomocniczy parametr /TXT lub /CMD ma tylko wskazywać z jakiego źródła pochodzi tekst, czyli jaki tryb będzie źródłem. Wtedy zamienia na odpowiednio przeciwny.
Funkcja może też usuwać polskie litery, czyli zamieniać „ogonki” na odpowiedniki angielskie, np. Ą na A:
/ANGT - usuwa polskie litery, gdy źródłem ma być tekst pochodzący z trybu tekstowego, jak pliki TXT, w tym z Batch (BAT)
/ANGC - usuwa polskie litery, gdy źródłem ma być tekst pochodzący z trybu wiersza poleceń CMD
Funkcję trzeba wkleić do swego skryptu Batch, np. na jego końcu, a wówczas wywołuje się ją podając CALL i etykietę skoku do funkcji, czyli generalnie tak:
CALL:Zamien_polskie_litery /TXT nazwa_zmiennej[
Można też ją zapisać jako osobny plik Batch, jako: Zamien_polskie_litery.bat
Wtedy wywołanie będzie nieco inne, to znaczy bez dwukropka : po słowie CALL. Poza tym nie trzeba wtedy wklejać całości do własnego skryptu.
CALL Zamien_polskie_litery /TXT nazwa_zmiennej
Zatem w parametrze podawana jest nazwa zmiennej, a zawartość tej zmiennej funkcja sama sobie pobierze, zaś wynik umieści w tej samej zmiennej, czyli po wykonaniu tej funkcji zawartość tej zmiennej ulegnie zmianie.
Funkcja operuje na praktycznie dowolnej liczbie zmiennych (łącznie 256 znaków tego polecenia), przykładowo:
CALL:Zamien_polskie_litery /TXT nazwa_zmiennej_1 nazwa_zmiennej_2 nazwa_zmiennej_3
Jeśli użyjemy parametru /CMD do zamiany z trybu komend wiersza poleceń CMD na tryb tekstowy plików tekstowych, np. do eksportu wyników jakiegoś polecenia do plików tekstowych, które potem mają zawierać prawidłowe polskie litery, to najpierw trzeba z takiego polecenia CMD wynik zaimportować do jakiejś zmiennej, gdyż funkcja ta działa tylko na zmiennych. Czyli najpierw przypisujemy wynik z CMD do jakiejś zmiennej, potem wywołujemy funkcję do zamiany polskich liter dla tej zmiennej i po tej zamianie możemy wyeksportować wynik zamiany z tej zmiennej do jakiegoś pliku tekstowego, np. raportu, czy pliku typu LOG. Przykładowo chcemy uzyskać w pliku tekstowym Wykaz_CMD.txt prawidłowy wykaz plików i katalogów z dobrymi polskimi literami, aby nie było krzaczków. Utworzymy ręcznie przykładowy plik lub podfolder z polskimi literami w jakimś folderze. Weźmiemy pierwsze trzy linie wykazu z tego folderu i wczytamy je do numerowanych zmiennych typu wykaz1. Zamienimy znaki i wyeksportujemy prawidłowy wynik do pliku tekstowego Wykaz_TXT.txt
Kod:
DIR /B>Wykaz_CMD.txt
(
set /p wykaz1=
set /p wykaz2=
set /p wykaz3=
)< Wykaz_CMD.txt
CALL: Zamien_polskie_litery /CMD wykaz1 wykaz2 wykaz3
echo %wykaz1%>Wykaz_TXT.txt
echo %wykaz2%>>Wykaz_TXT.txt
echo %wykaz3%>>Wykaz_TXT.txt
Uwagi techniczne:
1. Funkcja używa zewnętrznej biblioteki CHARLIB.BAT i znajdź ją w Google lub na http://tiny.pl oraz umieść w folderze przeszukiwania Windows %PATH%
2. Funkcja jest odporna, czyli odpowiednio uwzględnia użycie w tekście znaku wykrzyknika ! lub kombinacji znaków ^! oraz ^^!
Wymaga to jednak od niej dodatkowych czynności, co jest zwarte w podfunkcjach „znaczniki_transformuj” do zamiany „przed” i przywróceniu „po”
Wszelkie wykrzykniki na koniec ustawia zależnie od środowiska, jako typ znaku specjalnego, czyli ^! lub odpowiednio ^^!
Poza tym, funkcja usuwa inne wystąpienia znaku daszka ^ (Kod=94) jeśli nie jest on połączony z wykrzyknikiem. Jeśli ktoś zatem użyje w zawartości zmiennej przykładowo ^( lub ^) to będzie musiał sam to przywrócić po wywołaniu funkcji lub zmodyfikować podfunkcje „znaczniki_transformuj”, aby i to uwzględniały.
Wystarczy w tym celu tylko w podfunkcji „znaczniki_transformuj_wynik” przed linią zaczynającą się od „if not defined …” wstawić dwa wiersze:
Kod:
SET "str=%str: (=^(%"
SET "str=%str: )=^)%"
Poniżej kod tej funkcji do wklejenia i użycia w dowolnym innym własnym skrypcie lub do zapisania jako osobny plik Batch: Zamien_polskie_litery.bat
Kod:
@echo off
: Zamien_polskie_litery - Parametr pierwszy określa typ zamiany: /TXT lub /CMD lub /ANGT lub /ANGC
REM Parametry kolejne to nazwy zmiennych: nazwa_zmiennej_1 [ nazwa_zmiennej_2 ... nazwa_zmiennej_60 ]
REM /TXT - zamienia z formatu plików tekstowych TXT, w tym Batch (BAT) >>> na tryb poleceń CMD
REM /CMD - zamienia z trybu poleceń CMD >>> na format plików tekstowych TXT, w tym Batch (BAT)
REM Uwaga: trzeba najpierw wczytać wynik polecenia CMD do zmiennej i dopiero wtedy podać nazwę tej zmiennej
REM /ANGT - usuwanie polskich znaków z trybu tekstowego TXT, czyli zamiana na odpowiedniki angielskie (ANG)
REM /ANGC - usuwanie polskich znaków z trybu poleceń CMD, czyli zamiana na odpowiedniki angielskie (ANG)
REM Podawać tylko nazwy zmiennych, a nie ich wartości, zaś rezultat zamiany uzyskujemy do tej samej zmiennej
REM Ver.1.2 Opracowanie: Artur Zgadzaj http: //www.widzenia.com/info (Login: info Hasło: computer)
setlocal
set "Rozwijanie=!"
setlocal EnableDelayedExpansion
SET CMD=165,198,202,163,209,211,140,143,175,185,230,234,179,241,243,156,159,191
SET TXT=164,143,168,157,227,224,151,141,189,165,134,169,136,228,162,152,171,190
SET ANG=65,67,69,76,78,79,83,90,90,97,99,101,108,110,111,115,122,122
SET "Zestaw_1="
if /I "%~1"=="/TXT" SET Zestaw_1=%TXT%&SET Zestaw_2=%CMD%&shift
if /I "%~1"=="/CMD" SET Zestaw_1=%CMD%&SET Zestaw_2=%TXT%&shift
if /I "%~1"=="/ANGT" SET Zestaw_1=%ANG%&SET Zestaw_2=%CMD%&shift
if /I "%~1"=="/ANGC" SET Zestaw_1=%ANG%&SET Zestaw_2=%TXT%&shift
if "%Zestaw_1%"=="" (echo.&echo Funkcja: Zamien_polskie_litery&echo.&echo Bledny pierwszy parametr /CMD lub /TXT lub /ANGT lub /ANGC&TIMEOUT /T 15>nul&exit /b)
if "%~1"=="" (echo.&echo Funkcja: Zamien_polskie_litery&echo.&echo Brak nazwy pierwszej zmiennej zawierajacej tekst&TIMEOUT /T 15>nul&exit /b)
if not exist CHARLIB.BAT (FOR /F %%I IN ("CHARLIB.BAT") DO (if "%%~$PATH: I"=="" echo.&echo Funkcja: Zamien_polskie_litery&echo.&echo Brak CHARLIB.BAT, znajdz w Google lub na http: ^/^/tiny.pl^/mjvrt&echo.&TIMEOUT /T 60>nul&exit /b))
CALL CHARLIB initLib
if exist "%TEMP%\Wyniki_PL.BAT" del "%TEMP%\Wyniki_PL.BAT"
: nastepna_zmienna
if "%~1"=="" goto koniec_PL
if "!%~1!"=="" (shift&if not "%~1"=="" goto nastepna_zmienna)
SET /A L=0&SET Wynik=
CALL: znaczniki_transformuj "%~1"
: kolejny_znak
SET Y=!str: ~%L%,1!&if "!Y!"=="" goto pomin_kolejny_znak
CALL CHARLIB asc str !L! Kod
if "%Kod%"=="94" SET "Y="
FOR /F "tokens=1-18 delims=," %%A IN ("!Zestaw_2!") DO (
FOR /F "tokens=1-18 delims=," %%a IN ("!Zestaw_1!") DO (
if %Kod%==%%A CALL CHARLIB chr %%a Y
if %Kod%==%%B CALL CHARLIB chr %%b Y
if %Kod%==%%C CALL CHARLIB chr %%c Y
if %Kod%==%%D CALL CHARLIB chr %%d Y
if %Kod%==%%E CALL CHARLIB chr %%e Y
if %Kod%==%%F CALL CHARLIB chr %%f Y
if %Kod%==%%G CALL CHARLIB chr %%g Y
if %Kod%==%%H CALL CHARLIB chr %%h Y
if %Kod%==%%I CALL CHARLIB chr %%i Y
if %Kod%==%%J CALL CHARLIB chr %%j Y
if %Kod%==%%K CALL CHARLIB chr %%k Y
if %Kod%==%%L CALL CHARLIB chr %%l Y
if %Kod%==%%M CALL CHARLIB chr %%m Y
if %Kod%==%%N CALL CHARLIB chr %%n Y
if %Kod%==%%O CALL CHARLIB chr %%o Y
if %Kod%==%%P CALL CHARLIB chr %%p Y
if %Kod%==%%Q CALL CHARLIB chr %%q Y
if %Kod%==%%R CALL CHARLIB chr %%r Y
))
SET Wynik=!Wynik!!Y!&SET /A L+=1&if not "!str: ~%L%,1!"=="" goto kolejny_znak
: pomin_kolejny_znak
CALL: znaczniki_transformuj_wynik Wynik "%~1"
shift&if not "%~1"=="" goto nastepna_zmienna
: koniec_PL
endlocal
endlocal
if exist "%TEMP%\Wyniki_PL.BAT" CALL "%TEMP%\Wyniki_PL.BAT"
exit /b
: znaczniki_transformuj
setlocal
setlocal DisableDelayedExpansion
echo SET "str=%%%~1%%">"%TEMP%\Zamien_znaczniki.bat"
CALL "%TEMP%\Zamien_znaczniki.bat"
SET "str=%str: ^^^!=!%"
SET "str=%str: ^^!=!%"
SET "str=%str: ^!=!%"
SET "str=%str: !=^^^^^!%"
echo SET "str=%str%">"%TEMP%\Zamien_znaczniki.bat"
endlocal
endlocal
CALL "%TEMP%\Zamien_znaczniki.bat"
goto: eof
: znaczniki_transformuj_wynik
setlocal
setlocal DisableDelayedExpansion
echo SET "str=%%%~1%%">"%TEMP%\Zamien_znaczniki.bat"
CALL "%TEMP%\Zamien_znaczniki.bat"
SET "str=%str: ^^^!=!%"
SET "str=%str: ^^!=!%"
SET "str=%str: ^!=!%"
if not defined Rozwijanie (SET "str=%str: !=^^^!%") else (SET "str=%str: !=^!%")
echo SET "%~2=%str%">>"%TEMP%\Wyniki_PL.BAT"
exit /b
Opracowanie: Artur Zgadzaj