I suupose that this portal is also intended for users from another countries of the world. Therefore let that the rest of this post will no longer entirely in Polish, because it concerns the problem and the specifics of using Windows for Polish language and convert the encoding of letters between the environment TXT text files and command line CMD. If I am wrong or should the post be placed in a different language area, the administrator will take care and instruct me. Greetings
-------------------------------------------------------------------------------

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

 

 

Przykład kompletnego Batch z użyciem zewnętrznego skryptu:  Zamien_polskie_litery.bat

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
0 Comments   [ + ] Show Comments

Comments

Please log in to comment

There are no answers at this time

Answers

Answer this question or Comment on this question for clarity
Admin Script Editor
Admin Script Editor is an integrated scripting environment available free here at ITNinja

Share