Sonderzeichen in Textdatei einlesen
Hi leute. Ich bins mal wieder
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:
In der Textdatei "Backuppass.txt" sind etwa 11 Zeichen enthlaten
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
Wo könnte da denn der fehler sein ?
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
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
konnte nicht gefunden werden.
4qQ0Z70YfZ9bo
Wo könnte da denn der fehler sein ?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 146537
Url: https://administrator.de/contentid/146537
Ausgedruckt am: 16.11.2024 um 01:11 Uhr
16 Kommentare
Neuester Kommentar
Hallo ki-einheit!
Grüße
bastla
P.S.: Das Auslesen einer anhand der Nummer vorgegebenen Zeile aus "Backuppass.txt" ließe sich eleganter per "
Wo könnte da denn der fehler sein ?
Es drängt sich die Vermutung auf: Genau zwischen "4qQ0Z70YfZ9bo" und "kQg2JfR$" , 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:<
>
|
bastla
P.S.: Das Auslesen einer anhand der Nummer vorgegebenen Zeile aus "Backuppass.txt" ließe sich eleganter per "
findstr /b
" erledigen ...
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:
BTW deinem Code kann ich auch nicht allzuviel abgewinnen, obiger Batch funktioniert zwar,
aber bei deiner version:
Gruß
LotPings
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
aber bei deiner version:
- Die Variable abs wird abgefragt, aber nicht benutzt.
- Die Subroutine ist nicht durch ein vorheriges Goto :Eof abgegrenzt.
Gruß
LotPings
Na dann geb ich dir mal was zum Kauen
Falls das Ausrufezeichen im Text vorkommen kann, hier eine Alternative
Mehr zum Thema DelayedExpansion findest du unter
Setlocal /?
Gruß
LotPings
@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
... und ich noch etwas "Abgespecktes" dazu:
@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
@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%"
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
[OT]
Das ist ja so parodox, als würde von mir etwas "Kurzes" kommen.... hihi...
[/OT]
Das ist ja so parodox, als würde von mir etwas "Kurzes" kommen.... hihi...
[/OT]
[OT too]
@Biber
Grüße
bastla
P.S.: Mit der Analogie hast Du allerdings recht - das würde wohl niemand erwarten ...
[/OT too]
@Biber
Das ist ja so parodox
Wieso - was meinst Du, wo der Speck geblieben ist ... Grüße
bastla
P.S.: Mit der Analogie hast Du allerdings recht - das würde wohl niemand erwarten ...
[/OT too]
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 .....@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) ...
Gruß
LotPings
@77559
Ich hätte das so gemeint:
(auch in der Annahme, dass das zweite "
[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
Ich hätte das so gemeint:
echo %var2:&=^&%|clip
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
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)
Insgesamt gesehen ist Batch eher ungeeignet für diese Aufgabe, der OP nimmt besser vbscript dafür.
Gruß
LotPings
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
Moin LotPings,
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 -
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
Zitat von @77559:
Insgesamt gesehen ist Batch eher ungeeignet für diese Aufgabe, der OP nimmt besser vbscript dafür.
Ja - FULL ACK.Insgesamt gesehen ist Batch eher ungeeignet für diese Aufgabe, der OP nimmt besser vbscript dafür.
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
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
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
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.
@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.:
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!