Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - Artur Zgadzaj

Strony: [1]
1
Programowanie / [Batch] Polskie litery
« dnia: 2015-05-17, 10:03 »
Może pomóc gotowa funkcja Zamien_polskie_litery którą opracowałem na własne potrzeby, 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. Po przypisaniu wyników do zmiennej 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 innym 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     http://www.widzenia.com/info    (Login: info Hasło: computer)

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 użycia jako zewnętrznego skryptu: Zamien_polskie_litery.bat
zapisanego osobno wcześniej (znika tu dwukropek po CALL i zawartość 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


Na koniec 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

Opracowanie:  Artur Zgadzaj   www.widzenia.com/info  (login: info hasło: computer)

Strony: [1]
Do góry