vierus
Goto Top

Einfache Dechiffrierung Decryptung von Buchstaben per Batch

Hallo
ich habe ein Problem und weiß nicht wie ich es am besten angehen soll.
Wie das gemeint ist, kann man auf der Seite www.signifikant.de.to sehen.

Hallo
ich bin kein besonderst guter Coder und denke meist zu Kompliziert und würde erst mal alle Variablen mit set setzen um dann mit For jeden Buchstaben einzeln auslesen darum Bitte ich euch um mit Hilfe.
Also ich möchte ein Wort oder ein ganzen Text auf die Numerologie nach Pythagoras und der des Alphasystems Prüfen und wenn möglich die Worte in eine extra Text Datei Kopieren.

:restart
echo ***********************************************************
echo ***********[1] für Numerologie nach Pythagoras  ***********
echo ***********[2] für Numerologie nach Alphasystem ***********
echo ***********************************************************

set /p Auswahl=Wort Prüfen nach:

if Auswahl=1 goto one
else
goto Fehler

if Auswahl=2 goto two
else
goto Fehler

:one
echo Numerologie nach Pythagoras
set /p wort=Gib hier das Wort ein:
echo %wort% > Wort.txt

set A=1, B=2, C=3, D=4, E=5, F=6, G=7, H=8, I=9,
J=1, K=2, L=3, M=4, N=5, O=6, P=7, Q=8, R=9,
S=1, T=2, U=3, V=4, W=5, X=6, Y=7, Z=8

if %wort%=62 echo Nach der Numerologie nach Pythagoras ergibt das Wort: %wort% = 62pt
else
goto Falsch

:two
echo Numerologie nach Alphasystem 
set /p wort=Gib hier das Wort ein:

set A=1, B=2, C=3, D=4, E=5, F=6, G=7, H=8, I=9, J=10, K=11, L=12, M=13, N=14, O=15, P=16, Q=17, R=18,
S=19, T=20, U=21, V=22, W=23, X=24, Y=25, Z=26

if %wort%=43 echo Nach der Numerologie nach dem Alphasystem ergibt das Wort: %wort% = 43
else
goto Falsch
echo ende
Exit

:Fehler
echo Gib eine Zahl 1 oder 2 !!!
goto restart

:Falsch
echo Leider kein Treffer versuchs mit einem anderem Wort!
goto restart

Content-ID: 167468

Url: https://administrator.de/contentid/167468

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

Friemler
Friemler 04.06.2011 um 22:57:00 Uhr
Goto Top
Hallo Vierus,

also Dein Pseudocode da oben hätte außer Fehlermeldungen werfen garnichts gemacht...

Aber naja, dafür verdanken wir Dir bzw. dieser Numerologischen Webseite die Erkenntnis, dass sich Deep Thought verrechnet hat und die Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest nicht 42 sondern 43 ist. face-wink

Die Idee, ein Esoterisches Script zu schreiben, fand ich so skurril, dass ich es glatt gemacht habe. face-smile

Here we go!
@echo off

setlocal


set "Letters=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"  


:Restart
cls

echo ***********************************************************
echo ***********[1] für Numerologie nach Pythagoras  ***********
echo ***********[2] für Numerologie nach Alphasystem ***********
echo ***********[E] für Ende                         ***********
echo ***********************************************************
echo.
set "Choice="  
set /p "Choice=Wort prüfen nach: "  
echo.

if "%Choice%" equ "1" goto :Pythagoras  
if "%Choice%" equ "2" goto :Alphasystem  
if /i "%Choice%" equ "E" exit /b  
goto :ErrInput


:Pythagoras
set "NumericTable=1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8"  
echo Numerologie nach Pythagoras
goto :InputWord


:Alphasystem
set "NumericTable=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26"  
echo Numerologie nach Alphasystem


:InputWord
set "Word="  
set /p "Word=Gib ein Wort ein: "  
echo.

set "TheWord=%Word%"  
if "%TheWord%" equ "" goto :Restart  


set /a Result=0

:CalcLoop
  set "Char=%Word:~0,1%"  
  set "Word=%Word:~1%"  

  if "%Char%" equ " " goto :CalcLoopEnd  

  set /a Cntr=1

  for %%c in (%Letters%) do (
    if /i "%Char%" equ "%%c" goto :FoundChar  
    set /a Cntr+=1
  )

  goto :ErrUnknownChar

  :FoundChar
  for /f "tokens=%Cntr%" %%v in ("%NumericTable%") do set /a Result+=%%v  
:CalcLoopEnd
if "%Word%" neq "" goto :CalcLoop  


:Output
if "%Choice%" equ "1" (  
  if "%Result%" equ "62" (  
    echo Nach der Numerologie nach Pythagoras ergibt das Wort %TheWord% %Result%
  ) else (
    goto :NoMatch
  )
)

if "%Choice%" equ "2" (  
  if "%Result%" equ "43" (  
    echo Nach der Numerologie nach dem Alphasystem ergibt das Wort %TheWord% %Result%
  ) else (
    goto :NoMatch
  )
)

pause
goto :Restart


:ErrInput
echo Gib die Zahl 1 oder 2 ein!!!
pause
goto Restart


:ErrUnknownChar
echo Du hast ein unbekanntes Zeichen eingegeben! Nur Die Buchstaben von A bis Z sind erlaubt.
pause
goto :Restart


:NoMatch
echo Leider kein Treffer, versuche es mit einem anderen Wort!
pause
goto Restart

Viel Spass beim Wörterbuch berechnen face-wink
Friemler


[EDIT]
Komisch, Teufel und Liebe ergeben beide nach Pythagoras den Wert 24... Ich werde mich nie mehr verlieben! face-big-smile
[/EDIT]
Vierus
Vierus 04.06.2011 um 23:57:51 Uhr
Goto Top
Also echt Klasse man, so schnell und fertig WOW extra dickes THX.
Gruß Vierus

"set "Letters=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
Auf das wer ich nie gekomm.

"goto :CalcLoopEnd"
Wohin führt das den oder geht man so einfach nur an das ende von :CalcLoop

"set "Word="
Müsste ich doch nur in set "Word=echo < TEXT.TXT , ändern oder?

Habe noch mehr kleinere Projekte bei denen ich Hilfe gebrauchen könnte. face-smile

Die seite ist doch noch besser http://smart-fox.de.to/
Friemler
Friemler 05.06.2011 um 00:00:43 Uhr
Goto Top
Zitat von @Vierus:
"goto :CalcLoopEnd"
Wohin führt das den oder geht man so einfach nur an das ende von :CalcLoop
Obacht geben, länger leben! face-wink

Zitat von @Vierus:
"set "Word="
Müsste ich doch nur in set "Word=echo < TEXT.TXT , ändern oder?
Nein, nimm echo %Word% >> "Text.txt"

[EDIT] Sorry, jetzt weiß ich was Du meinst, Wörter aus einer Textdatei einlesen. Dann nimm
for /f "usebackq delims=" %%w in ("Text.txt") do (
  set "Word=%%w"
  .
  . hier das Wort dann verarbeiten und an verzögerte Variablenerweiterung denken.
  .
)
Pro Zeile ein Wort. Siehe mein Tutorial zur FOR-Schleife.
[/EDIT]

Friemler
Vierus
Vierus 06.06.2011 um 01:13:02 Uhr
Goto Top
Zitat von @Friemler:
Obacht geben, länger leben! face-wink

Ach ja Zeile 67. face-plain

Dein Tutorial ist Spitze und echt mega groß aber um das zu verstehen Braüchte ich mehr Praxis Beispiele den so gut bin ich noch nicht.

Leider hänge ich an der Ausgabe des wortes mit:
if "%Counter%" neq "0" set Skipon="skip=%Counter%"  

for /f %Skipon% %%w in ("test.txt") do (  
set "Word=%%w" & echo  
)
klappts nicht, den da bekomm ich nur Test.txt raus und nicht das wort warum?
Die Klammern sind doch die Verzögerung oder?
Peace
Vierus
Friemler
Friemler 06.06.2011 um 01:53:01 Uhr
Goto Top
Hallo Vierus,

wenn Du mit FOR /F eine Datei einlesen willst, deren Name/Pfad Leerzeichen enthält, musst Du den Namen in Anführungszeichen setzen können. Deshalb hat sich MS (oder der Praktikant, der das FOR-Parsing programmiert hat) die Option USEBACKQ einfallen lassen. Das fehlt bei Dir, deshalb wird "test.txt" als Zeichenkette aufgefasst, die Du mit FOR /F zerlegen willst.

Du hast zwei Möglichkeiten:
1. Du schreibst
if "%Counter%" neq "0" (  
  set ForOptions="usebackq skip=%Counter%"  
) else (
  set ForOptions="usebackq"  
)

for /f %ForOptions% %%w in ("test.txt") do (  
  set "Word=%%w"  
  set "TheWord=%%w"  
  call :ProcessWord
)

exit /b


:ProcessWord
set /a Result=0

:CalcLoop
.
. Hier kommt dann der Code zur Berechnung aus meinem ursprünglichen Script
.
Wenn die Wörter Leerzeichen enthalten können sollen, muss es set ForOptions="usebackq skip=%Counter% delims=" bzw. set ForOptions="usebackq delims=" heißen. Das Unterprogramm wird aufgerufen, um Probleme mit der zu frühen Erweiterung von Variablen zu umgehen bzw. um auf die verzögerte Variablenerweiterung verzichten zu können. Steht alles im Tutorial.

2. Du lässt die Anführungszeichen um test.txt weg. Das geht aber nur, wenn Pfad und Dateiname keine Leerzeichen enthalten, sonst wird das ganze als Liste von Dateinamen, die durch Leerzeichen getrennt sind, aufgefasst. Ohne usebackq kann man den Dateipfad nicht in Anführungszeichen setzen, da er sonst eben als Zeichenkette aufgefasst wird.

Gruß
Friemler
Vierus
Vierus 06.06.2011 um 03:28:59 Uhr
Goto Top
Oh man eh jetzt gehts. DAnke
Wenn das Wort aber 2 oder gar 3 sind geht es nicht mehr, mit tokens müsste er mir doch auch die ganze zeile ausgeben oder nicht?
Mit EOL=End Of Line gings nicht warum oder Trennt der dann nicht mehr?
Quasi so:
if "%Counter%" neq "0" (  
  set ForOptions="usebackq DELIMS= tokens=1-3 skip=%Counter%"  
) else (
  set ForOptions="usebackq DELIMS= tokens=1-3"  
)

for /f %ForOptions% %%w in ("test.txt") do (  
  set "Word=%%w%%x%%y"  
  set "TheWord=%%w%%x%%y"  
  set /a Counter+=1
  call :ProcessWord
)

wenn der Text z.b. = "das allsehende Auge = 62 pt" oder "buy the book = 43 pt" ist.
Friemler
Friemler 06.06.2011 um 08:37:28 Uhr
Goto Top
Hallo Vierus,

wenn Du delims= schreibst, also festlegst, dass kein Zeichen als Trennzeichen gelten soll, ist die Option tokens= sinnfrei. Wenn es keine Trennzeichen gibt, gibt es auch nur ein Token und das wird sowieso verarbeitet.

Die Option eol= gibt (ein) Zeichen an, bei deren/dessen Auftauchen in den Eingabedaten die Verarbeitung abgebrochen wird. Standardmäßig ist das das Semikolon. Wenn Du keine Semikolons in den Eingabedaten hast, kannst Du eol also vergessen.

Dass mit skip=x x Zeilen vom Anfang der Datei übersprungen werden, weißt Du ja wohl...

if "%Counter%" neq "0" (  
  set ForOptions="usebackq skip=%Counter% delims="  
) else (
  set ForOptions="usebackq delims="  
)

for /f %ForOptions% %%w in ("test.txt") do (  
  set "Word=%%w"  
  set "TheWord=%%w"  
  call :ProcessWord
)
sollte eigentlich funktionieren. Wenn nicht, liegt Dein Fehler an anderer Stelle. Führe als ersten Befehl in ProcessWord doch mal echo %Word% aus.

In Deiner Schleife hast Du noch set /a Counter+=1 stehen. Das macht keinen Sinn, falls Du damit die Anzahl der Zeilen, die übersprungen werden sollen, verändern willst. Die Veränderung von Counter wird in den ForOptions aus zwei Gründen nicht berücksichtigt. Herauszufinden, welche das sind, überlasse ich Dir.

Wenn in der Textdatei wirklich
<code type"plain">
das allsehende Auge = 62 pt

steht, bekommst Du wegen dem Gleichheitszeichen und den Ziffern Probleme, dafür gibt es ja keinen Zahlencode.

Aber eigentlich bin ich kein Wiederkäuer, die stehen bei Bauer Paul im Stall. Alles was ich Dir in diesem und dem letzten Posting gesagt habe, steht in meinem Tutorial. Ich habe das Teil geschrieben, um genau dieses ewige Wiederholen von Antworten auf immer gleiche Fragen zu vermeiden, das nervt mich. Lies das Tutorial!!

Gruß
Friemler
Vierus
Vierus 08.06.2011 um 17:22:58 Uhr
Goto Top
Hallo Friemler

Als erstes möchte ich dir Danken den das Programm das sich jemand gewünscht hat, ist fertig.
Und als Zweites, klaro wirft ein fertiges Script Fragen auf.
Gerade bei mir Anfänger und dein Tutorial lese ich Aufmerksam immer und immer wieder, dennoch bleiben auch da für mich Fragen offen.
(Wie z.b. jetzt erst erkannt delims=kein Zeichen=Leerzeichen Peinlich OMG das ist ja wie "drücken Sie eine Beliebige Taste" und man sucht dann wo die ist. lol)
Die Text Datei enthielt nur die Worte:
"das allsehende Auge"
Also lag der Fehler bei mir den ich habe einen Einsprung falsch gesetzt und noch ein paar andere kleinere Fehler gefunden.
Naja bei so vielen hin und her gespringe kann das wohl mal passieren.

Der counter wurde nicht ausgeführt weil (ich habe keine Ahnung. AAAAHHHH ertappt lol) aber ich Versuchs mal damit:
-weil rechen Operationen nicht ausgeführt werden in einer schleife
-weil die schleife öfter durchläuft und der Counter somit sinnlos wäre

Ich habe es fertig gestellt und als EXE kompiliert diese kannst du oder andere hier Downloaden.
http://www.files.to/get/12176/2qlsgwotnf

Folgende Verbesserungen habe ich noch gemacht:
- Hilfe Datei
- Ergebnis Ausgabe in eine TXT
- einlesen aus TXT in schleife bis zum letzten Wort
- Wörter hinzufügen zur TXT

Folgendes würde mich noch Interessieren zu deinen Befehlen:
Set "Char=%Word:~0,1%"
Set "Word=%Word:~1%"
Splittet %Word:~1% die Worte
und
%Word:~0,1% Splittet dann die Buchstaben auf oder was machst du da?

Sorry für so blöde Fragen aber der Fehler liegt meistens im Detail verborgen und als Anfänger find ich den meistens nicht.
Nochmals Danke Friemler
Gruß Vierus
Friemler
Friemler 08.06.2011 um 19:27:28 Uhr
Goto Top
Hallo Vierus,

OK, dass sind zumindest teilweise Fragen, die erstens nicht im Tutorial beantwortet werden und zweitens auch nicht aufwändig zu beantworten sind und drittens hast Du Dich schon bemüht.

Zunächst mal: Ich beziehe micht hierbei auf diesen Kommentar von Dir.

Der Counter ist sinnlos, weil
  1. der Wert von %Counter% schon in Zeile 2 in die Variable %ForOptions% eingetragen wird, danach steht in %ForOptions% nur noch ein Zahlenwert.
  2. selbst, wenn Du die Variable %ForOptions% garnicht verwenden würdest und "usebackq DELIMS= tokens=1-3 skip=%Counter%" direkt in den Kopf der FOR-Schleife schreiben würdest, würde dieser Schleifen-Kopf nur einmal übersetzt und anstatt von %Counter% der dann aktuelle Wert dieser Variablen dort eingetragen. Spätere Änderungen, die innerhalb der Schleife durch set /a Counter+=1 vorgenommen werden, wären wirkungslos. Und ja, dieser Befehl verändert wirklich den Inhalt von %Counter% innerhalb der Schleife, obwohl keine verzögerte Variablenerweiterung aktiviert ist. Benutzen kann man diesen Wert innerhalb der Schleife aber wiederum nur, wenn die verzögerte Variablenerweiterung eingeschaltet ist. Diese Logik versteht nur der Praktikant, der die Shell programmiert hat.


Ab hier beziehe ich mich auf mein ursprüngliches Script.

Set "Char=%Word:~0,1%" weist das erste Zeichen der Variablen Word an die Variable Char zu. Mit Set "Word=%Word:~1%" wird von Word das erste Zeichen abgeschnitten. Deshalb brauche ich zum Ausgeben des Wortes bei der Auswertung in Zeile 74 (Pythagoras) bzw. 82 (Alphasystem) meines Scripts eine Kopie von Word, die Variable TheWord. Siehe auch SET /?.

Der Algorithmus ist ungefähr so:
  1. Lese den ersten Buchstaben des Wortes in eine Variable (Char) ein. (Zeile 51)
  2. Schneide den ersten Buchstaben vom Wort ab. (Zeile 52)
  3. Wenn das ermittelte Zeichen ein Leerzeichen ist, springe zu Schritt 7, ans Schleifenende. (Zeile 54)
  4. Suche den ermittelten Buchstaben in der Liste der zugelassenen Buchstaben (%Letters%). Gehe Buchstabe für Buchstabe durch diese Liste und zähle für jeden Buchstaben einen Zähler (%Cntr%) hoch. Wenn der ermittelte Buchstabe gleich dem aktuell betrachteten aus der Liste ist, springe nach Schritt 6, Label FoundChar. (Zeilen 56 bis 61)
  5. Wenn das ermittelte Zeichen nicht in der Liste gefunden wurde, wird Zeile 63 ausgeführt, der Sprung zur Ausgabe einer Fehlermeldung und nachfolgendem Neustart des Programms.
  6. Nimm den Zähler, der in der Suchschleife hochgezählt wurde, und benutze ihn als Index in die Liste der numerischen Werte (%NumericTable%) und ermittele so den numerischen Wert des Buchstabens. Addiere diesen Wert auf den Wert von %Result%. (Zeile 66)
  7. Wenn die Variable Word noch Zeichen enthält, springe nach Schritt 1. (Zeile 67)

Die Schleife läuft also so lange, bis alle Buchstaben des Wortes in %Word% betrachtet wurden und dabei kein ungültiges Zeichen gefunden wurde.

Gruß
Friemler