Odpowiedz

Zamiana polskich liter w skryptach Batch, plikach tekstowych, komendach

 
ArturZgadzaj
Nowy
Liczba postów: 1
Post: #1

Zamiana polskich liter w skryptach Batch, plikach tekstowych, komendach


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

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

12.05.2015 08:22

Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
Odpowiedz

« Starszy wątek | Nowszy wątek »

Temat został oceniony na 0 w skali 1-5 gwiazdek.
Zebrano 1 głosów.