For polish users - Zamiana polskich liter lub usuwanie ogonków za pomocą skryptu Batch
-------------------------------------------------------------------------------
Przedstawiam własną uniwersalną funkcję 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.
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:
/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 z dwukropkiem 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 funkcji wklejać 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
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 https://sites.google.com/site/dbenhamfiles/ 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 ! i nawiasy okrągłe () 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 ! lub nawiasami (). Jeśli ktoś zatem użyje w zawartości zmiennej znak ^ w innym specjalnym celu, to będzie musiał sam to przywrócić po wywołaniu funkcji lub zmodyfikować podfunkcję „znaczniki_transformuj_wynik”, aby i to uwzględniały.
Poniżej kod tej funkcji Zamien_polskie_litery do wklejenia i użycia w dowolnym innym własnym skrypcie lub zapisania jako osobny plik Batch.
Potem będą podane pełne przykłady użycia w zewnętrznym kompletnym skrypcie
==============================================================================
@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.4 Opracowanie: Artur Zgadzaj Status: free for use and distribute
SET /A LICZ_PL=%RANDOM% * 1000 / 32768 + 1
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:&echo https://sites.google.com/site/dbenhamfiles&echo.&TIMEOUT /T 60>nul&exit /b))
CALL CHARLIB initLib
if exist "%TEMP%\%LICZ_PL%_Wyniki_PL.BAT" del "%TEMP%\%LICZ_PL%_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>nul
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%\%LICZ_PL%_Wyniki_PL.BAT" (CALL "%TEMP%\%LICZ_PL%_Wyniki_PL.BAT") else (echo.&echo Funkcja: Zamien_polskie_litery&echo.&echo Blad wykonania, nie mozna uzyskac wynikow&TIMEOUT /T 60>nul&exit /b)
if exist "%TEMP%\%LICZ_PL%_*.BAT" DEL "%TEMP%\%LICZ_PL%_*.BAT"
SET "LICZ_PL="
exit /b
:znaczniki_transformuj
setlocal
setlocal DisableDelayedExpansion
echo SET "str=%%%~1%%">"%TEMP%\%LICZ_PL%_Zamien_znaczniki.bat"
CALL "%TEMP%\%LICZ_PL%_Zamien_znaczniki.bat"
SET "str=%str:^^^!=!%"
SET "str=%str:^^!=!%"
SET "str=%str:^!=!%"
SET "str=%str:!=^^^^^!%"
echo SET "str=%str%">"%TEMP%\%LICZ_PL%_Zamien_znaczniki.bat"
endlocal
endlocal
CALL "%TEMP%\%LICZ_PL%_Zamien_znaczniki.bat"
goto:eof
:znaczniki_transformuj_wynik
setlocal
setlocal DisableDelayedExpansion
echo SET "str=%%%~1%%">"%TEMP%\%LICZ_PL%_Zamien_znaczniki.bat"
CALL "%TEMP%\%LICZ_PL%_Zamien_znaczniki.bat"
SET "str=%str:^^!=!%"
SET "str=%str:^!=!%"
if not defined Rozwijanie (
SET "str=%str:(=^^^(%"
SET "str=%str:)=^^^)%"
SET "str=%str:!=^^^!%"
) else (
SET "str=%str:(=^(%"
SET "str=%str:)=^)%"
SET "str=%str:!=^!%")
echo SET "%~2=%str%">>"%TEMP%\%LICZ_PL%_Wyniki_PL.BAT"
exit /b
zapisanego osobno wcześniej (znika tu dwukropek po
CALL i nie ma zawartości funkcji)
===================================================================================
@echo off
REM Przypisanie zmiennych z polskimi literami, pochodzące z trybu TXT (gdyż nadane Notatnikiem wewnątrz Batch)
SET Test=ĄĆĘŁŃÓŚŹŻ ąćęłńóśźż i coś tam jeszcze
SET Inna_zmienna=Cokolwiek - np. żdżbło trawy
REM Pokazanie w poleceniu CMD błędnej zawartości zmiennych przed zmianami, czyli nadal jest z TXT
echo Test = %Test%
echo Inna_zmienna = %Inna_zmienna%
REM Wywołanie zewnętrznego skryptu BAT do zamiany polskich liter (pochodzące z trybu tekstowego, zatem parametr /TXT )
CALL Zamien_polskie_litery /TXT Test Inna_zmienna
REM Pokazanie w poleceniu CMD prawidłowej zawartości zmiennych po zmianach z TXT na CMD
echo.
echo Test = %Test%
echo Inna_zmienna = %Inna_zmienna%
REM Zakończenie skryptu
goto:eof
Przykład użycia zamiany polskich liter, gdy chcemy uzyskać pełną nazwę użytkownika systemu Windows na podstawie jego loginu. Skrypt pokazuje mechanizm zamiany polskich liter pomiędzy trybem TXT, a CMD i odwrotnie.
Dla jego przetestowania trzeba ręcznie wcześniej utworzyć użytkownika w systemie Windows:
Login: Adaś
Pełna nazwa: Adaś ĄĆĘŁŃÓŚŹŻ ąćęłńóśźż
===================================================================================
echo off
REM UWAGA: wcześniej trzeba utworzyć ręcznie użytkownika, jako Login: Adaś Pełna nazwa: Adaś ĄĆĘŁŃÓŚŹŻ ąćęłńóśźż
SET Login=Adaś
SET Login_opis=Login użytkownika
SET Pelna_Nazwa_opis=Pełna nazwa
REM Uzyskanie prawidłowych kodów polskich liter dla poleceń CMD
CALL Zamien_polskie_litery /TXT Login Login_opis Pelna_Nazwa_opis
REM Pobranie pełnej nazwy dla użytkownika o loginie Adaś
REM Uwaga: jeśli angielska wersja systemu Windows to zamiast nazwa dać name
FOR /F "tokens=3,4,5" %%f IN ('net user ^"%Login%^"^|find ^"nazwa^"') DO (SET "Pelna_Nazwa=%%f %%g %%h")
REM Wyświetlenie wyników na ekranie, ale nadal w CMD
echo %Login_opis% = %Login%
echo %Pelna_Nazwa_opis% = %Pelna_Nazwa%
REM Uzyskanie prawidłowych kodów polskich liter, aby wyeksportować je do pliku tekstowego TXT
CALL Zamien_polskie_litery /CMD Login Pelna_Nazwa
REM Wykesportowanie wyników do pliku tekstowego TXT
echo Login użytkownika = %Login%>%TEMP%\Wynik.TXT
echo Pełna nazwa = %Pelna_Nazwa%>>%TEMP%\Wynik.TXT
REM Pokazanie wyników z pliku tekstowego w Notatniku
START NOTEPAD %TEMP%\Wynik.TXT
Pause
Na koniec przykład zamiany polskich liter w całym pliku tekstowym lub usuwanie ogonków, czyli zamiana polskich liter na odpowiedniki angielskie. Określ nazwę i lokalizację pliku w zmiennej "Plik".
@echo off
REM Przykład zamiany polskich liter w całym pliku tekstowym. Określ nazwę i lokalizację pliku w zmiennej "Plik" poniżej.
REM --------------------------------------------------------------------------------------------------------------------
REM UWAGA: Skrypt pracuje bardzo wolno. W końcu to jest skrypt realizowany i interpretowany krok po kroku, a nie skompilowany program w C++
REM Poza tym język w Batch ma wiele ograniczeń i utrudnień, co wymaga mnóstwo sztuczek i obejść, a to bardzo spowalnia działanie.
REM Powolność ta wynika głównie z działania skryptu pomocniczego CHARLIB.BAT z przyczyn opisanych powyżej. Zatem nadaje się to do
REM zamiany liter w małych plikach.
setlocal
SET Plik=Plik_z_polskimi_literami.txt
setlocal EnableDelayedExpansion
REM Zamiana polskich liter z pliku tekstowego z trybu TXT na tryb CMD
if exist "%TEMP%\Wynik_zamiany_pliku_PL.txt" del "%TEMP%\Wynik_zamiany_pliku_PL.txt"
SET /A N=1
for /f "tokens=* delims=" %%a in (%Plik%) do (
SET "Linia=%%a"
CALL Zamien_polskie_litery /TXT Linia
echo [!N!] !Linia!
echo !Linia!>>"%TEMP%\Wynik_zamiany_pliku_PL_w_CMD.txt"
SET /A N+=1
)
REM Zamiana polskich liter na odpowiedniki angielskie, czyli usuwanie ogonków z pliku tekstowego
echo ===============================================================================
if exist "%TEMP%\Wynik_zamiany_pliku_ANG.txt" del "%TEMP%\Wynik_zamiany_pliku_ANG.txt"
SET /A N=1
for /f "tokens=* delims=" %%a in (%Plik%) do (
SET "Linia=%%a"
CALL Zamien_polskie_litery /ANGT Linia
echo [!N!] !Linia!
echo !Linia!>>"%TEMP%\Wynik_zamiany_pliku_ANG.txt"
SET /A N+=1
)
START Notepad "%Plik%"
START Notepad "%TEMP%\Wynik_zamiany_pliku_PL_w_CMD.txt"
START Notepad "%TEMP%\Wynik_zamiany_pliku_ANG.txt"
Exit /b
Opracowanie: Artur Zgadzaj
Answers (0)
Be the first to answer this question