[Batch] Polskie litery 16100 5

O temacie

Autor Luk

Zaczęty 9.08.2013 roku

Wyświetleń 16100

Odpowiedzi 5

Luk

Luk

DreamVader 2
Sursum Corda! Wiwat Car!
posty1168
Propsy319
ProfesjaTłumacz
  • DreamVader 2
  • Sursum Corda! Wiwat Car!
Hej ostatnio z nudów zaciekawiły mnie proste skrypty batch. Zrobiłem prosty skrypt zadający pytania Vatrasa z G2NK i podsumowujący moje odpowiedzi (kim jesteś, jaka wieść, od kogo ją masz). Skrypt działa jak należy, ale mam jedno pytanie
Jak zrobić, aby zamiast Krzaków miał Polskie litery? strona kodowania jest chyba dobra bo bezpośrednio podczas wpisywania odp. i podsumowania działają normalnie (odpowiedzi), ale same pytania które zapisałem w notepadzie++ wykrzaczają się. Jest na to jakiś sposób
 
Spoiler
https://www.youtube.com/watch?v=DsSwvh4npMQ

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
W czym odpalasz skrypt? Na Windowsie w wierszu poleceń? Jeśli tak, to wiersz poleceń ma ustawione kodowanie latin2.

Luk

Luk

DreamVader 2
Sursum Corda! Wiwat Car!
posty1168
Propsy319
ProfesjaTłumacz
  • DreamVader 2
  • Sursum Corda! Wiwat Car!

Luk
DreamVader 2

[Batch] Polskie litery
#2 2013-08-09, 14:00(Ostatnia zmiana: 2013-08-09, 14:26)
Tak w wierszu poleceń jednak dziwi mnie to, że mogę normalnie bezpośrednio w nim pisać np. ć, ale jakbym napisał to "ć" w edytorze to już wykrzacza. Próbowałem dodać komendę zmiany strony kodowania na początku ale nadal krzaczyło. Czy możesz powiedzieć ew. jak zmienić?
 
Spoiler
https://www.youtube.com/watch?v=DsSwvh4npMQ

Voviz

Voviz

Użytkownicy
posty36
ProfesjaProgramista
  • Użytkownicy
Jest pare sposobów:

1. W N++ ustaw kodowanie  OEM 852 i powinno być po problemie :)

2. W swoim skrypcie dodaj ja pierwszą linijkę: @chcp 1250 i zmień czcionkę ekranową na najlepiej - Lucida Console.

 
"(...) Dziś wyjdziesz z domu... prosto przez okno, bez spadochronu"
PeIHa

Luk

Luk

DreamVader 2
Sursum Corda! Wiwat Car!
posty1168
Propsy319
ProfesjaTłumacz
  • DreamVader 2
  • Sursum Corda! Wiwat Car!
Wielkie dzięki działa
BTW linijka 1250 to właśnie ta domyślna chyba. chcp 852 zadziałało
Niby nic wielkiego, ale to ten plik o który mi chodziło :P

http://www.mediafire.com/download/5kdmatj4tt3h8h6/Vatras.rar
 
Spoiler
https://www.youtube.com/watch?v=DsSwvh4npMQ

Artur Zgadzaj

Artur Zgadzaj

Użytkownicy
posty1
Propsy3
ProfesjaProgramista
  • Użytkownicy
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)
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry