tray-park
Goto Top

Batch - Problem mit Anführungszeichen

Ich habe ein Problem mit Anführungszeichen / Gänsefüßen

Hi,

in meiner Batch definiere ich einen String in einer Variable
Set var="<service="ko">"  
Leider gibt es ein Problem mit den Sonderzeichen <">"

Weiß jemand wie ich die Zeichen unterbringe, ohne dass ein Fehler auftritt?

Freue mich über jede Antwort.

Liebe Grüße

Tray

Content-ID: 165318

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

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

Snowman25
Snowman25 28.04.2011 um 11:57:57 Uhr
Goto Top
Hallo @tray-park,

Ich kann bei der Zuweisung keine Fehler finden.
U:\>set var="<server="ko">"
U:\>echo %var%
"<server="ko">"
Ist richtig.
Ebenso:
U:\>echo set var="<server="ko">">vartest.bat
U:\>type vartest.bat
set var="<server="ko">"
U:\>set "var="
U:\>vartest.bat
U:\>set var="<server="ko">"
U:\>echo %var%
"<server="ko">"

Dein Problem liegt wahrscheinlich bei der weiteren Verwendung der Variable. Da musst du einfach die Zeichen mit einem Caret (^) maskieren. Aufgrund des etwas eigenartigen Verhaltens der Shell musst du es so machen:
set var="^<server=^"ko^^"^>"  

Gruß
Snow
60730
60730 28.04.2011 um 12:00:09 Uhr
Goto Top
moin,

N:\>set "otto=<hallo>"

N:\>set otto
otto=<hallo>

N:\>echo %otto%
Syntaxfehler.

N:\>echo "%otto%"
"<hallo>"

N:\>set "otto=<hallo=echo">"
Das System kann den angegebenen Pfad nicht finden.

N:\>set "otto=<hallo=echo"">""

N:\>echo "%otto%"
"<hallo=echo"">""

Gruß
tray-park
tray-park 28.04.2011 um 14:25:15 Uhr
Goto Top
Hi,

danke für die schnelle Antwort.

Ja das Stimmt, mit der Variable geschieht noch so einiges.

Unter anderem wird sie zum suchen eines Strings in einer Datei verwendet.

Also kurz
Set "var=<service="ko">""  
findstr /i "%string%" %PfadZurDatei%\*.txt  
So könnte es funktionieren?

Ich teste das morgen mal.

Dankeschön.

Grüße Tray
tray-park
tray-park 29.04.2011 um 13:07:19 Uhr
Goto Top
Hat funktioniert.

Vielen Dank euch allen.

Liebe Grüße

Tray
tray-park
tray-park 05.05.2011 um 10:21:18 Uhr
Goto Top
Jupp Hallo,

war wohl etwas voreilig.

Wenn ich es so mache, wie ihr es mir gezeigt habt, werden immer die Anführungszeichen mit ausgegeben.
"<hallo=echo"">"  
Das soll aber nicht so sein.
Es müsste so aussehen.
<hallo=echo"">  
Das bekomm ich irgendwie nicht hin.

Hab ich vielleicht was falsch verstanden?

Grüße Tray
Snowman25
Snowman25 05.05.2011 um 10:25:39 Uhr
Goto Top
Hallo Tray,

machs so:
"set var=^<server=^"ko^^"^>"  
Gruß
Snow
tray-park
tray-park 05.05.2011 um 10:38:02 Uhr
Goto Top
Hi,

danke für die rasche Antwort.

set var=^<server=^"ko^^"^>"  
echo %var%
Das System kann die angegebene Datei nicht finden.

???
Snowman25
Snowman25 05.05.2011 um 10:39:16 Uhr
Goto Top
Du hast ein Anführungszeichen VOR dem var vergessen.

Gruß
Snow
tray-park
tray-park 05.05.2011 um 14:42:37 Uhr
Goto Top
Irgendwie funktioniert es nicht, was ich vorhabe.

Ich zeig euch jetzt mal wie die Batch weiter geht. Vielleicht hilft das.
set "string=^<server status=^"ok^^"^ /^>"  
echo %string%

IF EXIST "status.xml" (  
	echo Start
	goto Start 
)	ELSE (
		echo Fehler
		goto Fehler)

:Start
findstr /i "%string%" D:\TEST\status.xml  
if errorlevel 1 (
	goto Fehler
	echo Fehler
)	ELSE (
		echo Ende
		goto Ende)

:Fehler
echo Error
goto Mailversand

:Mailversand
echo "Sende Fehlermeldung"  
goto Finish

:Ende
echo Error

:Finish
exit
Es wird eine xml-Datei geliefert.
Ist in dieser der String <server status="ok" /> zu finden ist alles in Ordnung.
Findet die Batch den String nicht, wird eine Mail gesendet.

Wenn man der Variable keine Sonderzeichen mit gibt, funktioniert alles. Bsp. set string=4GetIt

Grüße

Tray
Snowman25
Snowman25 05.05.2011 um 14:48:53 Uhr
Goto Top
set "string=^<server status=^"ok^" /^>"  
findstr /i "%string%" test.xml  
<server status="ok" />  
tray-park
tray-park 05.05.2011 um 15:13:59 Uhr
Goto Top
Lieder steht in der string Variable im findstr Kommando dann "^<server status=^"ok" />"
findstr /i "^<server status=^"ok" />" test.xml  
Snowman25
Snowman25 05.05.2011 um 15:17:18 Uhr
Goto Top
Zitat von @tray-park:
Lieder steht in der string Variable im findstr Kommando dann "^<server status=^"ok" />"
Also so langsam denke ich wirklich, du machst das extra...
Is doch nicht so schwer, oder? Alle Umleitungszeichen und Anführsstriche innerhalb der variable werden mit einem ^ maskiert. Und dann funktioniert es.
Ist es so schwer, die erste Zeile aus dem letzten Stück code zu kopieren??
tray-park
tray-park 05.05.2011 um 15:47:04 Uhr
Goto Top
Ich hab mich wohl mit der ganzen kopiererei etwas verhaspelt. Es ist ja noch kein Meister vom Himmel gefallen.

Dann liegt das Problem im findstr. Wenn nämlich in der xml nur <server status="ok" /> steht klappts.
Da in der Datei aber mehrere Tags sind, muss ich noch etwas forschen.

Danke für die Hilfe.
Snowman25
Snowman25 05.05.2011 um 15:49:57 Uhr
Goto Top
Gib uns doch einfach einen Ausschnitt aus der xml-Datei, aus der du davor alle wichtigen Daten ausge'x't hast.
tray-park
tray-park 05.05.2011 um 16:23:35 Uhr
Goto Top
So ne xml sieht wie folgt aus
<body>
<rueckmeldung>
<server status="ok" />   
<ergebnis>
<xxx>xxx</xxx> 
</rueckmeldung>
</ergebnis>
</body>
Snowman25
Snowman25 05.05.2011 um 16:31:31 Uhr
Goto Top
Funktioniert bei mir wunderbar. Sowohl als .bat-Script oder wenn ichs direkt eingeb.
tray-park
tray-park 05.05.2011 um 16:35:51 Uhr
Goto Top
Bei einem Fehler ändert sich ja ein Teil der XML. Dann steht da
<server status="error" />    
Dann springt er bei dir an die richtige Stelle (:Fehler) im Skript? Seltsam.
60730
60730 05.05.2011 um 19:09:43 Uhr
Goto Top
moin,

ich hab dir das da oben doch hingemalt... (Unterschied zwischen echo und set)

Und warum so kompliziert?

Achtung ungetestet und das einzige\ ist eine Pipe - die kann mein Rechner nicht..
<edit> ich war mal in meiner Sonderzeichensammlung...</edit>

IF not EXIST "status.xml" echo nix zum testen da & goto somewhere_over_the_rainbow  
findstr /i "status" "status.xml" | findstr "ok" && echo alles im Lot aufm Boot  
findstr /i "status" "status.xml" | findstr "error" && echo maschiin gabudd  
goto eof
:somewhere_over_the_rainbow
pause

Gruß
tray-park
tray-park 06.05.2011 um 10:24:55 Uhr
Goto Top
Hi,

perfekt! So funktioniert es!

Vielen Dank in die Runde.

Liebe Grüße

Tray
tray-park
tray-park 06.05.2011 um 12:44:27 Uhr
Goto Top
Määp.

War wohl doch nix. In der xml gibt es einen weiteren Tag, der Probleme macht. Indem kann nämlich auch
<4Till status="ok" >  
Dieser interessiert mich aber nicht. Nur den server status="ok" kann ich gebrauchen.
Steht nun aber im 4Till ein "ok" und im server status ein "error" ist trotzdem alles in Ordnung.

Schade.
tray-park
tray-park 06.05.2011 um 13:47:58 Uhr
Goto Top
Naja, irgendwie logisch.

Man lasse einfach etwas weg und siehe da...
IF not EXIST "status.xml" echo nix zum testen da & goto somewhere_over_the_rainbow   

rem findstr /i "status" "status.xml" | findstr "ok" && echo alles im Lot aufm Boot   

findstr /i "status" "status.xml" | findstr "error" && echo maschiin gabudd && goto Fehler  

:somewhere_over_the_rainbow 
exit
:Fehler
pause
Grüße Tray
60730
60730 06.05.2011 um 21:04:16 Uhr
Goto Top
moin,

Zitat von @tray-park:
Määp.

War wohl doch nix. In der xml gibt es einen weiteren Tag, der Probleme macht. Indem kann nämlich auch
<4Till status="ok" >
Dieser interessiert mich aber nicht. Nur den server status="ok" kann ich gebrauchen.
Steht nun aber im 4Till ein "ok" und im server status ein "error" ist trotzdem alles in Ordnung.

Schade.
Schade?
Schade finde ich
  • wenn man(n) alles selber machen muß
  • Wenn man(n) dann noch alles tröpfchenweise mitkriegt.

DEMO an der Notbüxse - zur einfachen änderung für mich zwischen den einzelnen Dempläufen keine .xml sondern eine ini

C:\script\status>C:\script\status\status.cmd

C:\script\status>IF not EXIST "status.ini" echo nix zum testen da   & goto somewhere_over_the_rainbow

C:\script\status>findstr /i /c:"<server status" "status.ini"   | findstr "ok" && echo alles im Lot aufm Boot

C:\script\status>findstr /i "status" "status.ini"   | findstr "error"   && echo maschiin gabudd

C:\script\status>goto eof

C:\script\status>

So siehts aus, wenn nur <4Till status="ok" > da steht

...und so wenn auch <server status="error" /> da steht:
C:\script\status>C:\script\status\status.cmd

C:\script\status>IF not EXIST "status.ini" echo nix zum testen da   & goto somewhere_over_the_rainbow

C:\script\status>findstr /i /c:"<server status" "status.ini"   | findstr "ok" && echo alles im Lot aufm Boot

C:\script\status>findstr /i "status" "status.ini"   | findstr "error"   && echo maschiin gabudd
<server status="error" />
maschiin gabudd

C:\script\status>goto eof

C:\script\status>
so, wenn die beiden in der ini stehen:

<4Till status="ok" >
<server status="ok" />

C:\script\status>C:\script\status\status.cmd

C:\script\status>IF not EXIST "status.ini" echo nix zum testen da   & goto somewhere_over_the_rainbow

C:\script\status>findstr /i /c:"<server status" "status.ini"   | findstr "ok"&& echo alles im Lot aufm Boot
<server status="ok" />
alles im Lot aufm Boot

C:\script\status>findstr /i "status" "status.ini"   | findstr "error"   && echo maschiin gabudd

C:\script\status>goto eof

C:\script\status>

Das Script, was das macht, - bzw. die Änderung zum ersten ungetesteten Schnippsel - siehst du da oben 3*
Und falls es auch <4Till status="error" > gibt - dann machs so:
Wenn gar kein Status da ist - mußt du doch erst recht die Ohren spitzen und die Augen scharf stellen.

IF not EXIST "status.ini" echo nix zum testen da & goto somewhere_over_the_rainbow  
findstr /i /c:"<server status" "status.ini" | findstr "ok" && echo alles im Lot aufm Boot  
findstr /i /c:"<server status" "status.ini" | findstr "error" && echo maschiin gabudd  
goto eof
:somewhere_over_the_rainbow
pause
:eof

Gruß