Hallo Zusammen,
ich bin nun nach 4 oder 5 Stunden Suche mit meinem Latein am Ende und hoffe, dass Ihr mir weiterhelfen könnt. Von der Theorie her ist es nichts dramatisches.
Ich bekomme aus einem Tool A eine Zeichenkette an ein DOS Skript übergeben. Diese Zeichenkette kann Zeilenumbrüche im Unixformat \r\n enthalten. Ebenso können hier Umlaute oder andere Sonderzeichen vorkommen. Innherhalb des DOS Skriptes rufe ich dann einen Browser inkl. URL auf die u.a. diese Zeichenkette an ein Tool B übergibt.
Die Zeichenkette ist z.B.
dies\r\nist\r\neine\r\nzeichenkette\r\nöäüß
Ich möchte nun, um das ganze URL konform zu bekommen, zum einen den Zeilenumbruch \r\n durch %0D%0A ersetzen und zum Anderen die Umlaute öäü sowie das ß durch die HTML gängigen Zeichen ä ü.... ersetzen.
Das Skript sieht wie folgt aus
@echo OFF
SET DESC=%~3
SET DESC=%DESC:\r\n=%%%0D%%0A%
"programfiles(x86)%\internet explorer\iexplore.exe" "https://meineurl.de?param1=1¶m2=2&description=%DESC%"
Ich bekomme es nicht hin das z.B. aus der oben genannten Zeichenkette jedes vorkommende \r\n durch %0D%0A ersetzt wird. Das Ergebnis im oben genannten Fall wäre
diesisteinezeichenketteöäüß%0D%0A
Er trägt also lediglich am Ende einmalig das %0D%0A ein und schmeißt die \r\n Vorkommen weg. Nehme ich etwas Anderes wie z.B.
SET DESC=%DESC:\r\n=0D0A%
dann wird aus der Beispielkette
dies0D0Aist0D0Aeine0D0Azeichenkette0D0Aöäüß
Sobal ich jedoch ein %-Zeichen mit einbauen möchte, siehrt es wie oben aus.
-----------------------------------------------------------------
Problem 2 - Die Umlaute
Bei den Umlauten ist es nun so, dass hier ä offenbar als Befehl interpretiert wird. Zumindest bekomme ich hier die Ausgabe am Prompt "Der Befehl "auml" ist entweder falsch geschrieben oder konnte nicht gefunden werden"
Auch ein Maskieren mit ^ä funktioniert an der Stelle nicht.
Ich hoffe Ihr könnt mir helfen.
Vielen Dank & schöne Grüße
Daniel
Zeichenmanipulation Zeilenumbruch
Re: Zeichenmanipulation Zeilenumbruch
Hallo Zusammen,
nach längerem probieren habe ich Teil 1, den Zeilenumbruch, nun doch hinbekommen. Dazu habe ich das Script um die Folgenden Zeilen erweitert.
setlocal enabledelayedexpansion
SET crlf=\r\n
SET subs=%%0D%%0A
SET DESC=!DESC:%crlf%=%subs%!
Dadurch werden nun alle vorgommenden \r\n durch %0D%0A ersetzt. Weiterhin hänge ich jedoch bei den html Ersatzzeichen für die Umlaute.
Schöne Grüße
Daniel
nach längerem probieren habe ich Teil 1, den Zeilenumbruch, nun doch hinbekommen. Dazu habe ich das Script um die Folgenden Zeilen erweitert.
setlocal enabledelayedexpansion
SET crlf=\r\n
SET subs=%%0D%%0A
SET DESC=!DESC:%crlf%=%subs%!
Dadurch werden nun alle vorgommenden \r\n durch %0D%0A ersetzt. Weiterhin hänge ich jedoch bei den html Ersatzzeichen für die Umlaute.
Schöne Grüße
Daniel
Re: Zeichenmanipulation Zeilenumbruch
Sooooo.....
nun habe ich auch das letzte Puzzlestück gefunden. Die HTML Ersatzzeichen bekommt man durch
SET "DESC=!DESC:ä=^ä!"
eingebaut. wobei DESC durch die eigene Variable ersetzt wird.
Anbei nun das komplette Script:
@echo OFF
setlocal disabledelayedexpansion
SET DESC=%~3
SET crlf=\r\n
SET subs=%%0D%%0A
setlocal enabledelayedexpansion
SET "DESC=!DESC:^!=^!!"
SET "DESC=!DESC:%crlf%=%subs%!"
SET "DESC=!DESC:ä=^ä!"
SET "DESC=!DESC:ö=^ö!"
SET "DESC=!DESC:ü=^ü!"
SET "DESC=!DESC:Ä=^Ä!"
SET "DESC=!DESC:Ö=^Ö!"
SET "DESC=!DESC:Ü=^Ü!"
setlocal disabledelayedexpansion
"%programfiles(x86)%\internet explorer\iexplore.exe" "https://meineurl/irgendeeine!init.jsp?p ... ram3=%DESC%
Ich habe während meinen Test herausgefunden, dass durch "enabledelayedexpansion" das Ausrufezeichen aus der URL gelöscht wird, was im Ukehrschluss wieder zu einer fehlerhaften URL führt. Da ich jedoch enabledelayedexpansion brauche um alle vorkommenden Zeichen zu ersetzten, muss dieser "modus" abgeschaltet werden, bevor die URL auftaucht.
Dadurch klappt nun alles !!!!
Vielen Dank an alle, die sich einen Kopf gemacht haben!
Schöne Grüße
Daniel
nun habe ich auch das letzte Puzzlestück gefunden. Die HTML Ersatzzeichen bekommt man durch
SET "DESC=!DESC:ä=^ä!"
eingebaut. wobei DESC durch die eigene Variable ersetzt wird.
Anbei nun das komplette Script:
@echo OFF
setlocal disabledelayedexpansion
SET DESC=%~3
SET crlf=\r\n
SET subs=%%0D%%0A
setlocal enabledelayedexpansion
SET "DESC=!DESC:^!=^!!"
SET "DESC=!DESC:%crlf%=%subs%!"
SET "DESC=!DESC:ä=^ä!"
SET "DESC=!DESC:ö=^ö!"
SET "DESC=!DESC:ü=^ü!"
SET "DESC=!DESC:Ä=^Ä!"
SET "DESC=!DESC:Ö=^Ö!"
SET "DESC=!DESC:Ü=^Ü!"
setlocal disabledelayedexpansion
"%programfiles(x86)%\internet explorer\iexplore.exe" "https://meineurl/irgendeeine!init.jsp?p ... ram3=%DESC%
Ich habe während meinen Test herausgefunden, dass durch "enabledelayedexpansion" das Ausrufezeichen aus der URL gelöscht wird, was im Ukehrschluss wieder zu einer fehlerhaften URL führt. Da ich jedoch enabledelayedexpansion brauche um alle vorkommenden Zeichen zu ersetzten, muss dieser "modus" abgeschaltet werden, bevor die URL auftaucht.
Dadurch klappt nun alles !!!!
Vielen Dank an alle, die sich einen Kopf gemacht haben!
Schöne Grüße
Daniel
Re: Zeichenmanipulation Zeilenumbruch
Moin.
Solche Windows-Fragen gehören eigentlich gar nicht in dieses DOS-Forum.
Allerdings hatte ich ein ähnliches Problem mit den unterschiedlichhen Zeilenumbrüchen in Textdateien, wo einmal 0Dh+0Ah und ein anderes Mal nur ein 0Ah benötigt wird. Dafür habe ich zwei kleine DOS-Programme geschrieben, wo das eine Programm alle 0Dh aus einer Textdatei entfernt und das andere Programm jeweils ein 0Dh bei allen dort vorhandenen 0Ahs mit einfügt.
Auf ähnliche Weise könnte man auch bestimmte Zeichen durch andere Zeichen ersetzen lassen, wenn man das Programm dafür entsprechend modifiziert.
Dirk
Solche Windows-Fragen gehören eigentlich gar nicht in dieses DOS-Forum.
Allerdings hatte ich ein ähnliches Problem mit den unterschiedlichhen Zeilenumbrüchen in Textdateien, wo einmal 0Dh+0Ah und ein anderes Mal nur ein 0Ah benötigt wird. Dafür habe ich zwei kleine DOS-Programme geschrieben, wo das eine Programm alle 0Dh aus einer Textdatei entfernt und das andere Programm jeweils ein 0Dh bei allen dort vorhandenen 0Ahs mit einfügt.
Auf ähnliche Weise könnte man auch bestimmte Zeichen durch andere Zeichen ersetzen lassen, wenn man das Programm dafür entsprechend modifiziert.
Code: Alles auswählen
;╔════════════════════════════════════════════════════════════════════════════╗
;║ ║
;║ Dieses Programm entfernt alle Carrige Return(0Dh) aus einer Datei, ║
;║ dessen Name als Parameter, mit übergeben wird. ║
;║ Die Datei muß kleiner als 64KB groß sein. ║
;║ ║
;║ #!/bin/sh ║
;║ for i in `find -type f`; do tr -d '\r' <$i >/tmp/trtmp && mv /tmp/trtmp ║
;║ ║
;║ (C) Copyright: Freie Cracker Crew Hamburg Horn ║
;║ von: Dirk Wolfgang Glomp ║
;║ ║
;╚════════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL ; Programm möglichst klein halten
.386
;────────────────────────────────────────────────────────────────────────────
CODE SEGMENT use16 'CODE'
assume cs:CODE,ds:DATEN,ss:STAPEL
org 100h
;────────────────────────────────────────────────────────────────────────────
START: mov ax, DATEN
mov ds, ax
mov bx, ss ; zunächst die beiden Segmentadressen
mov ax, es ; voneinander abziehen. Das ergibt die
sub bx, ax ; Anzahl der Paragraphen vom PSP bis
; zum Anfang des Stack
mov ax, sp ; da sich der Stackpointer am Ende des
add ax, 0Fh ; Stacksegments befindet, gibt sein
shr ax, 4 ; Inhalt die Länge des Stacks an
add bx, ax ; zur bisherigen Länge hinzuaddieren
mov ah, 4Ah ; neue Größe an das DOS übergeben
int 21h
mov bx, 1000h ; 64 KB anfordern/reservieren
mov ah, 48h ; anfordern/reservieren: BX = Anzahl/16
int 21h
jc NOSPACE ; keine 64 KB = Fehler !
mov FILSEG, ax ; Segment des File's
mov fs, ax
;----------------------------------------------------------------------------
mov ah, 62h ; Segment des PSP's ermitteln
int 21h
mov ds, bx ; PSP-Segment nach DS
mov es, bx
mov di, 80h ; Länge Kommandozeile
mov cl, [di] ; nach CL
cmp cl, 2
jna NOPARA
cld ; aufwärts zählen
inc di
mov al, 20h
repe scasb ; erste Leerzeichen überspringen
dec di ; ein zurück
mov bp, di
SUCHCR: cmp BYTE PTR[di], 0Dh
jz short FOUND
inc di
jmp SUCHCR
;------------------------------------
FOUND: mov WORD PTR[di], 2400h ; hinter filenamen: 0,"$"
mov ax, fs
mov cx, es
mov fs, cx
mov es, ax
;----------------------------------------------------------------------------
mov dx, bp ; Zeiger auf 1.ASCII
mov ax, 3D02h ; Datei öffnen: lesen/schreiben (OPEN)
int 21h
jc NOFILE ; File nicht gefunden = Fehler !
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx ; low auf Anfang stellen
xor cx, cx ; high auf Anfang stellen
mov ax, 4202h ; Länge holen: vom Ende (LSEEK)
int 21h
and dx, dx ; High-word = null ?
jnz TOBIG ; nein zurück
mov FILEN, ax ; Anzahl retten
mov dx, 1 ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h ; nochmal wegen DOS-Fehler
xor dx, dx ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h
mov cx, FILEN ; Anzahl zu ladender Byte's
mov ds, FILSEG
mov ah, 3Fh ; Datei lesen u. Zeiger bewegen (READ)
int 21h
mov cx, ax ; Anzahl tatsächlich geladener Bytes retten
mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
;----------------------------------------------------------------------------
mov ax, DATEN
mov ds, ax
xor si, si
mov FILEN, cx
SUCHE: cmp si, cx ; Ende des File erreicht ?
ja short ZMA
cmp WORD PTR es:[si], 0A0Dh
jz short TEHR
cmp BYTE PTR es:[si], 0Ah
jz short FSGE
inc si
jmp short SUCHE
;------------------------------------
FSGE: inc WORD PTR[FILEN]
mov di, si
mov si, cx
sub cx, di
DGDA: mov al, es:[si]
mov es:[si+1], al
dec si
dec cx
jnz DGDA
mov cx, FILEN
mov si, di
mov WORD PTR es:[di], 0A0Dh
;------------------------------------
TEHR: add si, 2
jmp short SUCHE
;----------------------------------------------------------------------------
ZMA: mov ax, fs
mov dx, 82h
xor cx, cx
mov ds, ax
mov ah, 3Ch ; Datei erstellen
int 21h
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx
mov cx, FILEN
mov ds, FILSEG
mov ah, 40h ; Datei beschreiben (WRITE)
int 21h
;----------------------------------------------------------------------------
NBACK: mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
BACKE: mov ax, 4C00h ; Beendigungs-Code laden
int 21h ; Programm beenden, ... DOS !!!
;────────────────────────────────────────────────────────────────────────────
NOSPACE: mov dx, OFFSET ERRTEXT
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOPARA: mov ax, DATEN
mov ds, ax
mov dx, OFFSET PARERR
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOFILE: mov ax, DATEN
mov ds, ax
mov dx, OFFSET FILERR
mov ah, 9
int 21h
mov ax, fs
mov ds, ax
mov dx, bp
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
TOBIG: mov dx, OFFSET BIGERR
mov ah, 9
int 21h
jmp short NBACK
;----------------------------------------------------------------------------
CODE ends
;────────────────────────────────────────────────────────────────────────────
DATEN SEGMENT use32 'DATA'
;---------------------------------------------------------------------------
FILSEG DW 0FFFFh ; Segment des File`s
FILEN DW 0FFFFh ; Anzahl der geladenen Byte`s
FILERR DB 0Dh, 0Ah
DB "FEHLER ! File auf (angegebenen) Laufwerk/Pfad nicht gefunden = $"
PARERR DB 0Dh, 0Ah
DB "FEHLER ! Kein Filename als Parameter angehängt/übergeben !$"
ERRTEXT DB 0Dh, 0Ah
DB "FEHLER ! Zu wenig Arbeits-Speicher vorhanden !"
DB 0Dh, 0Ah, 0Dh, 0Ah
DB "Das Programm benötigt zur Ausführung, ca. 64 KB freien Arbeits-Speicher !"
DB "$"
BIGERR DB 0Dh, 0Ah
DB "FEHLER ! File ist größer als 64KB !$"
;---------------------------------------------------------------------------
DATEN ends
;────────────────────────────────────────────────────────────────────────────
STAPEL SEGMENT use16 STACK 'STACK'
DB 20h dup (0FFh)
STAPEL ends
;────────────────────────────────────────────────────────────────────────────
end
Code: Alles auswählen
;╔════════════════════════════════════════════════════════════════════════════╗
;║ ║
;║ Dieses Programm fügt Carrige Returns(0Dh) in eine Datei mit ein, ║
;║ dessen Name als Parameter, mit übergeben wird. ║
;║ Die Datei muß kleiner als 64KB groß sein. ║
;║ ║
;║ (C) Copyright: Freie Cracker Crew Hamburg Horn ║
;║ von: Dirk Wolfgang Glomp ║
;║ ║
;╚════════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL ; Programm möglichst klein halten
.386
;────────────────────────────────────────────────────────────────────────────
CODE SEGMENT use16 'CODE'
assume cs:CODE,ds:DATEN,ss:STAPEL
org 100h
;────────────────────────────────────────────────────────────────────────────
START: mov ax, DATEN
mov ds, ax
mov bx, ss ; zunächst die beiden Segmentadressen
mov ax, es ; voneinander abziehen. Das ergibt die
sub bx, ax ; Anzahl der Paragraphen vom PSP bis
; zum Anfang des Stack
mov ax, sp ; da sich der Stackpointer am Ende des
add ax, 0Fh ; Stacksegments befindet, gibt sein
shr ax, 4 ; Inhalt die Länge des Stacks an
add bx, ax ; zur bisherigen Länge hinzuaddieren
mov ah, 4Ah ; neue Größe an das DOS übergeben
int 21h
mov bx, 1000h ; 64 KB anfordern/reservieren
mov ah, 48h ; anfordern/reservieren: BX = Anzahl/16
int 21h
jc NOSPACE ; keine 64 KB = Fehler !
mov FILSEG, ax ; Segment des File's
mov fs, ax
;----------------------------------------------------------------------------
mov ah, 62h ; Segment des PSP's ermitteln
int 21h
mov ds, bx ; PSP-Segment nach DS
mov es, bx
mov di, 80h ; Länge Kommandozeile
mov cl, [di] ; nach CL
cmp cl, 2
jna NOPARA
cld ; aufwärts zählen
inc di
mov al, 20h
repe scasb ; erste Leerzeichen überspringen
dec di ; ein zurück
mov bp, di
SUCHCR: cmp BYTE PTR[di], 0Dh
jz short FOUND
inc di
jmp SUCHCR
;------------------------------------
FOUND: mov WORD PTR[di], 2400h ; hinter filenamen: 0,"$"
mov ax, fs
mov cx, es
mov fs, cx
mov es, ax
;----------------------------------------------------------------------------
mov dx, bp ; Zeiger auf 1.ASCII
mov ax, 3D02h ; Datei öffnen: lesen/schreiben (OPEN)
int 21h
jc NOFILE ; File nicht gefunden = Fehler !
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx ; low auf Anfang stellen
xor cx, cx ; high auf Anfang stellen
mov ax, 4202h ; Länge holen: vom Ende (LSEEK)
int 21h
and dx, dx ; High-word = null ?
jnz TOBIG ; nein zurück
mov FILEN, ax ; Anzahl retten
mov dx, 1 ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h ; nochmal wegen DOS-Fehler
xor dx, dx ; low holen
xor cx, cx ; high holen
mov ax, 4200h ; Zeiger positionieren: vom Anfang(LSEEK)
int 21h
mov cx, FILEN ; Anzahl zu ladender Byte's
mov ds, FILSEG
mov ah, 3Fh ; Datei lesen u. Zeiger bewegen (READ)
int 21h
mov cx, ax ; Anzahl tatsächlich geladener Bytes retten
mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
;----------------------------------------------------------------------------
mov ax, DATEN
mov ds, ax
xor si, si
mov FILEN, cx
SUCHE: cmp si, cx ; Ende des File erreicht ?
ja short ZMA
cmp WORD PTR es:[si], 0A0Dh
jz short TEHR
cmp BYTE PTR es:[si], 0Ah
jz short FSGE
inc si
jmp short SUCHE
;------------------------------------
FSGE: inc WORD PTR[FILEN]
mov di, si
mov si, cx
sub cx, di
DGDA: mov al, es:[si]
mov es:[si+1], al
dec si
dec cx
jnz DGDA
mov cx, FILEN
mov si, di
mov WORD PTR es:[di], 0A0Dh
;------------------------------------
TEHR: add si, 2
jmp short SUCHE
;----------------------------------------------------------------------------
ZMA: mov ax, fs
mov dx, 82h
xor cx, cx
mov ds, ax
mov ah, 3Ch ; Datei erstellen
int 21h
mov bx, ax
mov ax, DATEN
mov ds, ax
xor dx, dx
mov cx, FILEN
mov ds, FILSEG
mov ah, 40h ; Datei beschreiben (WRITE)
int 21h
;----------------------------------------------------------------------------
NBACK: mov ah, 3Eh ; Datei schließen (CLOSE)
int 21h
BACKE: mov ax, 4C00h ; Beendigungs-Code laden
int 21h ; Programm beenden, ... DOS !!!
;────────────────────────────────────────────────────────────────────────────
NOSPACE: mov dx, OFFSET ERRTEXT
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOPARA: mov ax, DATEN
mov ds, ax
mov dx, OFFSET PARERR
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
NOFILE: mov ax, DATEN
mov ds, ax
mov dx, OFFSET FILERR
mov ah, 9
int 21h
mov ax, fs
mov ds, ax
mov dx, bp
mov ah, 9
int 21h
jmp short BACKE
;------------------------------------
TOBIG: mov dx, OFFSET BIGERR
mov ah, 9
int 21h
jmp short NBACK
;----------------------------------------------------------------------------
CODE ends
;────────────────────────────────────────────────────────────────────────────
DATEN SEGMENT use32 'DATA'
;---------------------------------------------------------------------------
FILSEG DW 0FFFFh ; Segment des File`s
FILEN DW 0FFFFh ; Anzahl der geladenen Byte`s
FILERR DB 0Dh, 0Ah
DB "FEHLER ! File auf (angegebenen) Laufwerk/Pfad nicht gefunden = $"
PARERR DB 0Dh, 0Ah
DB "FEHLER ! Kein Filename als Parameter angehängt/übergeben !$"
ERRTEXT DB 0Dh, 0Ah
DB "FEHLER ! Zu wenig Arbeits-Speicher vorhanden !"
DB 0Dh, 0Ah, 0Dh, 0Ah
DB "Das Programm benötigt zur Ausführung, ca. 64 KB freien Arbeits-Speicher !"
DB "$"
BIGERR DB 0Dh, 0Ah
DB "FEHLER ! File ist größer als 64KB !$"
;---------------------------------------------------------------------------
DATEN ends
;────────────────────────────────────────────────────────────────────────────
STAPEL SEGMENT use16 STACK 'STACK'
DB 20h dup (0FFh)
STAPEL ends
;────────────────────────────────────────────────────────────────────────────
end
Re: Zeichenmanipulation Zeilenumbruch
Auf meiner Website (www.imperial-games.de) habe ich ein Tool, das ich mal geschrieben habe, namens WANDLER, das quasi für Zwecke wie diesen gemacht wurde. Es gibt auch eine deutsche Beschreibung.
Falls Fragen aufkommen, einfach fragen.
Falls Fragen aufkommen, einfach fragen.