ki-einheit
Goto Top

Sonderzeichen in Textdatei einlesen

Hi leute. Ich bins mal wieder face-smile

Ich sitze mal wieder an ner Batchdatei und hänge wie so oft fest.

Hier erstmal schnell der Quellcode. Danach erklär ich, was ich vorhabe:

@echo off
set "ort=backuppass.txt"  

set /p "zeile=Welche Zeilennummer: "  
set /p "abs=Zeichenabstand der gewaehlten Zahl: "  

FOR /F "tokens=1 delims=;" %%i IN (%ort%) DO set "var1=%%i"  

Set /a cnt=1 
Set /a n=%zeile% 
for /F "tokens=1 delims=;" %%i in (%ort%) do call :setvarFixLine %n% "%%i"    

for /f "tokens=3 delims=; " %%i in ("%Var%") do set var2=%%i  

echo %var2% | clip
echo %var2%

pause

:setvarFixLine 
If %cnt%==%1 Set Var=%~2 
Set /a cnt+=1  
goto :eof

In der Textdatei "Backuppass.txt" sind etwa 11 Zeichen enthlaten

01. passwort: )fXdcw?hWk/hrJtV9AV9gBw
02. passwort: Nh\i=91LM4+cQnt(3BkL5C3wH
03. passwort: 4qQ05880YfZbo&kQg2JfR$(B51
04. passwort: sK8#Jb-=TJ(NXlXnMdaQyLp-
05. passwort: FddeA54oCDFdatfX7@IO9=pv
06. passwort: @3?adM-gZb9cC@w#TaJb)&8
07. passwort: Aq4&+kl)BeJ6q6l##TbYf7a?g
08. passwort: -X$Pd8$DDy5hQ?s5zua+bfw8n
09. passwort: -$RhTXYlRN+JhuiBm&\h$Inc
10. passwort: #2O=MM?4XtwPU+x52\kqncqO
11. passwort: hiddencodeopen00blade123

Wie man sehen kann, enthalten sie Sonderzeichen, Zahlen, Groß- und Kleinbuchstaben.
Durch die Zeilenauswahl wird eine davon ausgewählt (bsp. Zeile 3).
Dann soll man angeben, wie viele Zeichen in die Zwischenablage kopiert werden soll. (bsp. 25 Zeichen)

Nun, das Problem daran ist, dass in der Zeile 3 Sonderzeichen sind, die er falsch interpretiert. Er nimmt nicht den kompletten Abschnitt ( 4qQ05880YfZbo&kQg2JfR$(B51 )

Das Programm verweigert mir den kompletten Abschnitt und antwortet mir folgendes

Der Befehl "kQg2JfR$" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
4qQ0Z70YfZ9bo

Wo könnte da denn der fehler sein ?

Content-ID: 146537

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

Ausgedruckt am: 16.11.2024 um 01:11 Uhr

bastla
bastla 08.07.2010 um 18:02:41 Uhr
Goto Top
Hallo ki-einheit!
Wo könnte da denn der fehler sein ?
Es drängt sich die Vermutung auf: Genau zwischen "4qQ0Z70YfZ9bo" und "kQg2JfR$" face-wink, wobei der eigentliche Fehler darin besteht, die eigelesene Zeile nicht unter Anführungszeichen zu verwenden bzw das entsprechende Zeichen nicht durch ein vorangestelltes "^" zu "maskieren" - das wäre übrigens analog auch für die folgenden Zeichen mir besonderer Bedeutung in einem Bach erforderlich:
<
>
|
Grüße
bastla

P.S.: Das Auslesen einer anhand der Nummer vorgegebenen Zeile aus "Backuppass.txt" ließe sich eleganter per "findstr /b" erledigen ...
ki-einheit
ki-einheit 08.07.2010 um 18:10:16 Uhr
Goto Top
Aber ich hab doch die gesamte Zeile in
set "ort=backuppass.txt"
in Anführungszeichen gesetzt.

Ist es denn dan möglich, dass es trotz Anführungszeichen nicht als Text eingelesen wird ?
bastla
bastla 08.07.2010 um 18:18:16 Uhr
Goto Top
Hallo ki-einheit!
set "ort=backuppass.txt"
bezieht sich ja nur auf den Dateinamen; eingelesen wird die Zeile in die Variable "%%i", dann an das Unterprogramm weitergereicht und dort wegen %~2 ohne Anführungszeichen in %Var% übernommen ...

Grüße
bastla
ki-einheit
ki-einheit 08.07.2010 um 18:23:21 Uhr
Goto Top
leider klappt es nicht mit " "

bin total ratlos.
77559
77559 08.07.2010 um 18:24:36 Uhr
Goto Top
Hallo ki-einheit,

bei jedem einzelnen Verarbeitungsschritt bei dem ein mögliches Sonderzeichen nicht durch Anführungszeichen oder ein Maskieren vor Fehlinterpretation durch CMD geschützt ist, wird es zu dem Fehler kommen. Die von dir zitierte Zeile hat damit überhaupt nichts zu tun.

Die Echo Befehle in deinen Zeilen 15 und 16 sind zwangsweise ungeschützt, da du ja die Anführungszeichen weder anzeigen noch in die Zwischenablage als Teil des Passwortes übergeben willst.
Ergo musst du die ggfs möglichen Sonderzeichen vorher im durch Anführungszeichen geschützten Zustand maskieren:

@echo off
set "ort=backuppass.txt"  

set /p "zeile=Welche Zeilennummer: "  
set /p "abs=Zeichenabstand der gewaehlten Zahl: "  

FOR /F "tokens=1 delims=;" %%i IN (%ort%) DO set "var1=%%i"  

Set /a cnt=1 
Set /a n=%zeile% 
for /F "tokens=1 delims=;" %%i in (%ort%) do call :setvarFixLine %n% "%%i"    

for /f "tokens=3 delims=; " %%i in ("%Var%") do set "var2=%%i"  

Set "var2=%var2:&=^&%"  
Set "var2=%var2:<=^<%"  
Set "var2=%var2:>=^>%"  
Set "var2=%var2:|=^|%"  

echo %var2% | clip
echo %var2%

pause
goto :eof
:setvarFixLine 
If %cnt%==%1 Set "Var=%~2"  
Set /a cnt+=1  
BTW deinem Code kann ich auch nicht allzuviel abgewinnen, obiger Batch funktioniert zwar,
aber bei deiner version:
  • Die Variable abs wird abgefragt, aber nicht benutzt.
  • Die Subroutine ist nicht durch ein vorheriges Goto :Eof abgegrenzt.

Gruß
LotPings
ki-einheit
ki-einheit 08.07.2010 um 18:32:40 Uhr
Goto Top
Erstmal danke für die Hilfe

zu deinen Fragen:
die abs Variable wurde noch nicht benutzt, da ich sie für einen Test deaktiviert habe. Sie soll später sagen können, wie weit er die Buchstaben denn nehmen soll (also nicht die gesamte Zeile sondern nur einen bestimmten Teil)
Da ist ja auch gleich das nächste Problem face-sad

naja, hab halt mal das goto vergessen face-wink
77559
77559 08.07.2010 um 19:01:14 Uhr
Goto Top
Na dann geb ich dir mal was zum Kauen face-wink
@Echo off
Setlocal EnableDelayedExpansion
Set Text=012345678901
for /l %%A in (0,1,9) do Echo !text:~%%A,2!

Falls das Ausrufezeichen im Text vorkommen kann, hier eine Alternative
@Echo off&Setlocal DisableDelayedExpansion
Set "Text=!123456789!1"  
Echo.%Text%
for /l %%A in (0,1,9) do Call Echo.%%text:~%%A,2%%

Mehr zum Thema DelayedExpansion findest du unter

Setlocal /?

Gruß
LotPings
bastla
bastla 08.07.2010 um 19:07:39 Uhr
Goto Top
... und ich noch etwas "Abgespecktes" dazu:
@echo off & setlocal
set "ort=backuppass.txt"  

set /p "zeile=Welche Zeilennummer: "  
set /p "abs=Zeichenabstand der gewaehlten Zahl: "  

set /a zeile=100+zeile
set "zeile=%zeile:~-2%"  
set "var2="  
for /f "tokens=3" %%i in ('findstr /b "%zeile%\." "%ort%"') do set "var2=%%i"  
if not defined var2 (echo Zeile %zeile% nicht gefunden! & goto :eof)

echo "%var2%" | clip  
echo "%var2%"  
@77559
Die Ersetzung (falls nötig) von "&" durch "^&" würde ich erst unmittelbar bei der Ausgabe vornehmen (soferne es nur "&" als Sonderzeichen zu berücksichtigen gilt) - dann zählt sich's genauer innerhalb des Strings (was aber in diesem Fall vielleicht ohnehin nicht so große Bedeutung haben wird) ...

Grüße
bastla
Biber
Biber 08.07.2010 um 19:53:05 Uhr
Goto Top
[OT]
Zitat von @bastla:
... und ich noch etwas "Abgespecktes" dazu:
Das ist ja so parodox, als würde von mir etwas "Kurzes" kommen.... hihi...
[/OT]
bastla
bastla 08.07.2010 um 20:01:30 Uhr
Goto Top
[OT too]
@Biber
Das ist ja so parodox
Wieso - was meinst Du, wo der Speck geblieben ist ... face-wink

Grüße
bastla

P.S.: Mit der Analogie hast Du allerdings recht - das würde wohl niemand erwarten ... face-wink
[/OT too]
77559
77559 08.07.2010 um 20:03:02 Uhr
Goto Top
Zitat von @bastla:
@77559
Die Ersetzung (falls nötig) von "&" durch "^&" würde ich erst unmittelbar bei der Ausgabe
vornehmen (soferne es nur "&" als Sonderzeichen zu berücksichtigen gilt) - dann zählt sich's genauer
innerhalb des Strings (was aber in diesem Fall vielleicht ohnehin nicht so große Bedeutung haben wird) ...
Und ich dachte das hätte ich schon so gemacht .....

Gruß
LotPings
bastla
bastla 08.07.2010 um 20:06:45 Uhr
Goto Top
@77559
Ich hätte das so gemeint:
echo %var2:&=^&%|clip
(auch in der Annahme, dass das zweite "echo" - da ja noch "work in progress" - nur Debugging-Zwecken dient) - ist aber vermutlich ziemlich egal ...

[Edit]
... wobei die Variable nach "Entnahme" des Teilstrings ja dann vermutlich %var3% oä heißen würde (die Idee war, so lange wie möglich beim "Original"-String zu bleiben) ...
[/Edit]

Grüße
bastla
77559
77559 08.07.2010 um 22:11:38 Uhr
Goto Top
Achso,
ja aber da man ja nicht vier mögliche Sonderzeichen in einem Befehl maskieren kann,
muss man eben vorher doppelt maskieren, dann klappt es auch mit der pipe zum clip.
(wobei ein normaler echo die zusätzlichen ^anzeigt)
^@echo off & setlocal
set "ort=backuppass.txt"  

set /p "zeile=Welche Zeilennummer: "  
set /p "abs=Zeichenabstand der gewaehlten Zahl: "  

set /a zeile=100+zeile
set "zeile=%zeile:~-2%"  
set "var2="  
for /f "tokens=3" %%i in ('findstr /b "%zeile%\." "%ort%"') do set "var2=%%i"  
if not defined var2 (echo Zeile %zeile% nicht gefunden! & goto :eof)

Set "var2=%var2:&=^^^&%"  
Set "var2=%var2:<=^^^<%"  
Set "var2=%var2:>=^^^>%"  
Set "var2=%var2:|=^^^|%"  

echo.%var2%
echo.%var2%|clip

Goto :Eof

Insgesamt gesehen ist Batch eher ungeeignet für diese Aufgabe, der OP nimmt besser vbscript dafür.

Gruß
LotPings
Biber
Biber 08.07.2010 um 22:38:29 Uhr
Goto Top
Moin LotPings,

Zitat von @77559:
Insgesamt gesehen ist Batch eher ungeeignet für diese Aufgabe, der OP nimmt besser vbscript dafür.
Ja - FULL ACK.

Dennoch -ergänzender Hinweis wäre "... und/oder er lässt die [batchspezifischen] Sonderzeichen ">&<|" mal raus aus der Genenierung."

Ein bisschen muss man sich auf das Werkzeug einstellen, das man sich ausgewählt hat.
Ist ja nicht nur ein Batch-Problem - VBSkript hat vielleicht andere Zeichen, die ggf. maskiert werden müssen?

Dann doch lieber sagen - dafür sind wir ja da -
"Hey, ein paar Zeichen machen immer Probleme... verwende also keine Umlaute umd Eurozeichen und griechischen Buchstaben und Pipesymbole und bla.."

Denn wozu ein Passwort generieren, dass vielleicht dem Programm, das nun die Passwortabfrage machen soll, wieder Probleme macht?
Ein nicht wieder reprozierbares Passwort ist nun auch nicht per se ein sicheres Passwort....

Grüße
Biber
77559
77559 08.07.2010 um 23:06:18 Uhr
Goto Top
Hallo Biber,

Ok ok: ohne Veränderung der Bedingungen ist dieses Problem (mit den noch zu realisierenden Offsets) mit Batch alleine nur sehr sehr schwer lösbar - wenn nicht unmöglich.

Gutes Nächtle
LotPings
TsukiSan
TsukiSan 09.07.2010 um 05:28:19 Uhr
Goto Top
hi @all,

wie von LotPings schon richtig angedeutet, läßt sich dein Vorhaben, ki-einheit, wohl besser in anderen Scriptsprachen umsetzen. Es gibt - wie von Biber richtig bemerkt - bei VBS zwar auch ein paar Zeichen, auf die man achten muss, aber ich wollte es mir nicht nehmen lassen, anhand deiner PW-Datei ein kurzes Beispiel in VBS aufzuziegen, was - ohne noch die nötigen Überwachungen und etc. - deine reine Aufgabenstellung mit Sonderzeichen in der Zeile erfüllen kann.

PWDatei = "C:\backuppass.txt"  

Set FSO = CreateObject("Scripting.FileSystemObject")  
MeineDaten = Split(FSO.OpenTextFile(PWDatei, 1).ReadAll, vbCrLF) 

Frage1 = Inputbox("Welche Zeilennummer?")  
Frage2 = Inputbox("Wieviele Zeichen sollen gewählt werden?")  

msgbox MeineDaten(Frage1 - 1)

MeineZeichen = Split(MeineDaten(Frage1 - 1),"passwort:")  
PWZeichen = Trim(Left(MeineZeichen(1),Frage2))

msgbox PWZeichen

@ki-einheit
Aber du möchtest sicher bei Batch bleiben. Wie gesagt, ist nur mal ein Beispiel von meiner Seite in VBS. Dem ist es in deinem Falle völlig egal, was da für Zeichen pro Zeile enthalten sind.

Gruss
Tsuki

Ps.:
Dann soll man angeben, wie viele Zeichen in die Zwischenablage kopiert werden soll. (bsp. 25 Zeichen)
Das Arbeiten mit der Zwischenablage und VBS ist nicht besonders elegant!