Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Sonderzeichen in Textdatei einlesen

Frage Entwicklung Batch & Shell

Mitglied: ki-einheit

ki-einheit (Level 1) - Jetzt verbinden

08.07.2010 um 17:24 Uhr, 3970 Aufrufe, 16 Kommentare

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:

01.
@echo off 
02.
set "ort=backuppass.txt" 
03.
 
04.
set /p "zeile=Welche Zeilennummer: " 
05.
set /p "abs=Zeichenabstand der gewaehlten Zahl: " 
06.
 
07.
FOR /F "tokens=1 delims=;" %%i IN (%ort%) DO set "var1=%%i" 
08.
 
09.
Set /a cnt=1  
10.
Set /a n=%zeile%  
11.
for /F "tokens=1 delims=;" %%i in (%ort%) do call :setvarFixLine %n% "%%i"   
12.
 
13.
for /f "tokens=3 delims=; " %%i in ("%Var%") do set var2=%%i 
14.
 
15.
echo %var2% | clip 
16.
echo %var2% 
17.
 
18.
pause 
19.
 
20.
:setvarFixLine  
21.
If %cnt%==%1 Set Var=%~2  
22.
Set /a cnt+=1   
23.
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 ?
Mitglied: bastla
08.07.2010 um 18:02 Uhr
Hallo ki-einheit!
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:
|
Grüße
bastla

P.S.: Das Auslesen einer anhand der Nummer vorgegebenen Zeile aus "Backuppass.txt" ließe sich eleganter per "findstr /b" erledigen ...
Bitte warten ..
Mitglied: ki-einheit
08.07.2010 um 18:10 Uhr
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 ?
Bitte warten ..
Mitglied: bastla
08.07.2010 um 18:18 Uhr
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
Bitte warten ..
Mitglied: ki-einheit
08.07.2010 um 18:23 Uhr
leider klappt es nicht mit " "

bin total ratlos.
Bitte warten ..
Mitglied: LotPings
08.07.2010 um 18:24 Uhr
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:

01.
@echo off 
02.
set "ort=backuppass.txt" 
03.
 
04.
set /p "zeile=Welche Zeilennummer: " 
05.
set /p "abs=Zeichenabstand der gewaehlten Zahl: " 
06.
 
07.
FOR /F "tokens=1 delims=;" %%i IN (%ort%) DO set "var1=%%i" 
08.
 
09.
Set /a cnt=1  
10.
Set /a n=%zeile%  
11.
for /F "tokens=1 delims=;" %%i in (%ort%) do call :setvarFixLine %n% "%%i"   
12.
 
13.
for /f "tokens=3 delims=; " %%i in ("%Var%") do set "var2=%%i" 
14.
 
15.
Set "var2=%var2:&=^&%" 
16.
Set "var2=%var2:<=^<%" 
17.
Set "var2=%var2:>=^>%" 
18.
Set "var2=%var2:|=^|%" 
19.
 
20.
echo %var2% | clip 
21.
echo %var2% 
22.
 
23.
pause 
24.
goto :eof 
25.
:setvarFixLine  
26.
If %cnt%==%1 Set "Var=%~2" 
27.
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
Bitte warten ..
Mitglied: ki-einheit
08.07.2010 um 18:32 Uhr
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

naja, hab halt mal das goto vergessen
Bitte warten ..
Mitglied: LotPings
08.07.2010 um 19:01 Uhr
Na dann geb ich dir mal was zum Kauen
01.
@Echo off 
02.
Setlocal EnableDelayedExpansion 
03.
Set Text=012345678901 
04.
for /l %%A in (0,1,9) do Echo !text:~%%A,2!
Falls das Ausrufezeichen im Text vorkommen kann, hier eine Alternative
01.
@Echo off&Setlocal DisableDelayedExpansion 
02.
Set "Text=!123456789!1" 
03.
Echo.%Text% 
04.
for /l %%A in (0,1,9) do Call Echo.%%text:~%%A,2%%
Mehr zum Thema DelayedExpansion findest du unter

Setlocal /?

Gruß
LotPings
Bitte warten ..
Mitglied: bastla
08.07.2010 um 19:07 Uhr
... und ich noch etwas "Abgespecktes" dazu:
01.
@echo off & setlocal 
02.
set "ort=backuppass.txt" 
03.
 
04.
set /p "zeile=Welche Zeilennummer: " 
05.
set /p "abs=Zeichenabstand der gewaehlten Zahl: " 
06.
 
07.
set /a zeile=100+zeile 
08.
set "zeile=%zeile:~-2%" 
09.
set "var2=" 
10.
for /f "tokens=3" %%i in ('findstr /b "%zeile%\." "%ort%"') do set "var2=%%i" 
11.
if not defined var2 (echo Zeile %zeile% nicht gefunden! & goto :eof) 
12.
 
13.
echo "%var2%" | clip 
14.
echo "%var2%"
@LotPings
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
Bitte warten ..
Mitglied: Biber
08.07.2010 um 19:53 Uhr
[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]
Bitte warten ..
Mitglied: bastla
08.07.2010 um 20:01 Uhr
[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]
Bitte warten ..
Mitglied: LotPings
08.07.2010 um 20:03 Uhr
Zitat von bastla:
@LotPings
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
Bitte warten ..
Mitglied: bastla
08.07.2010 um 20:06 Uhr
@LotPings
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
Bitte warten ..
Mitglied: LotPings
08.07.2010 um 22:11 Uhr
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)
01.
^@echo off & setlocal 
02.
set "ort=backuppass.txt" 
03.
 
04.
set /p "zeile=Welche Zeilennummer: " 
05.
set /p "abs=Zeichenabstand der gewaehlten Zahl: " 
06.
 
07.
set /a zeile=100+zeile 
08.
set "zeile=%zeile:~-2%" 
09.
set "var2=" 
10.
for /f "tokens=3" %%i in ('findstr /b "%zeile%\." "%ort%"') do set "var2=%%i" 
11.
if not defined var2 (echo Zeile %zeile% nicht gefunden! & goto :eof) 
12.
 
13.
Set "var2=%var2:&=^^^&%" 
14.
Set "var2=%var2:<=^^^<%" 
15.
Set "var2=%var2:>=^^^>%" 
16.
Set "var2=%var2:|=^^^|%" 
17.
 
18.
echo.%var2% 
19.
echo.%var2%|clip 
20.
 
21.
Goto :Eof
Insgesamt gesehen ist Batch eher ungeeignet für diese Aufgabe, der OP nimmt besser vbscript dafür.

Gruß
LotPings
Bitte warten ..
Mitglied: Biber
08.07.2010 um 22:38 Uhr
Moin LotPings,

Zitat von LotPings:
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
Bitte warten ..
Mitglied: LotPings
08.07.2010 um 23:06 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
09.07.2010 um 05:28 Uhr
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.

01.
PWDatei = "C:\backuppass.txt" 
02.
 
03.
Set FSO = CreateObject("Scripting.FileSystemObject") 
04.
MeineDaten = Split(FSO.OpenTextFile(PWDatei, 1).ReadAll, vbCrLF)  
05.
 
06.
Frage1 = Inputbox("Welche Zeilennummer?") 
07.
Frage2 = Inputbox("Wieviele Zeichen sollen gewählt werden?") 
08.
 
09.
msgbox MeineDaten(Frage1 - 1) 
10.
 
11.
MeineZeichen = Split(MeineDaten(Frage1 - 1),"passwort:") 
12.
PWZeichen = Trim(Left(MeineZeichen(1),Frage2)) 
13.
 
14.
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!
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Sonderzeichen Fehler aus Textdatei vermeiden (16)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

C und C++
String einlesen in Array und wieder ausgeben von hinten (4)

Frage von Protected zum Thema C und C ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...