andimue
Goto Top

Environment-Variable in Datei ausgeben ohne Auflösung

Hallo,
mein erster Beitrag - falls was falsch sein sollte - bitte seid nachsichtig

Hallo,
folgende Ausgangssituation: ich habe ein sehr umfangreiches Dialog-BAT-Skript, mit dem Dateien auf verschieden Server verteilt wird.
Um mit dem Benutzer zu interagieren benutze ich ein paar Schnipsel vbs-Code und u.a. auch ein bisschen HTA-Code. Und um diesen HTA-Code geht es:

Ich erzeuge den HTA-Code direkt aus meinem Batch-Skript heraus mit Kommandos in der Form:

  
>  ~destserver.hta  echo  ^<html^>
  >> ~destserver.hta  echo  ^<head^>
  >> ~destserver.hta  echo  ^<title^>Abfrage Zielsystem(e)^</title^>
  >> ~destserver.hta  echo  ^<HTA:APPLICATION 
  >> ~destserver.hta  echo       ID="HTAUI"   
  >> ~destserver.hta  echo       APPLICATIONNAME="HTA User Interface"  
  >> ~destserver.hta  echo       SCROLL="no"  
  >> ~destserver.hta  echo       SINGLEINSTANCE="yes"  
  >> ~destserver.hta  echo       WINDOWSTATE="maximized"  
  >> ~destserver.hta  echo  ^>
  >> ~destserver.hta  echo  ^</head^>
  >> ~destserver.hta  echo  ^<style^>

Bei folgendem Kommando habe ich ein Problem:
...
  
  >> ~destserver.hta  echo  	cmdToExec = "cmd /V:on /c ^> !temp!\zielserver.txt   echo " + string1   

Das Problem ist, dass ich im HTA-Code wiederum eine Datei im Verzeichnis %temp%\zielserver.txt erzeugen muss.
Zuerst habe ganz normal mit %temp% gearbeitet aber dann wurde natürlich gleich beim Erzeugen der HTA-Datei die Variable %temp% aufgelöst wurde und
mein Code damit nicht funktioniert hat. Dann kam ich auf die Idee, vor Erzeugen des HTA-Codes in meiner Batch-Prozedur das Kommando
"setlocal EnableDeleyedExpansion" zu verwenden und dann mit !temp! zu arbeiten. Damit wiederum funktioniert zwar der HTA-Code aber in meiner Batch-Prozedur kommt es dann zu Problemen.
Ich will also weg von der Lösung mit "setlocal EnableDeleyedExpansion"

Meine Frage:

wie kann ich in einem DOS-Skript einen String %temp% in eine Datei ausgeben, ohne dass dieser String dabei direkt gleich aufgelöst wird ?

Ich bin für jeden Hinweis dankbar.

Content-Key: 185083

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

Printed on: April 25, 2024 at 01:04 o'clock

Member: Skyemugen
Skyemugen May 16, 2012 at 10:29:03 (UTC)
Goto Top
Aloha,

DOS-Skript, hm? Zweifel ...

naja, wie auch immer echo %%temp%%

greetz André

P.S.: Deine Frage und deine Threadüberschrift haben irgendwie nicht wirklich etwas gemeinsam ...
P.P.S.: ##blue|##
Member: andimue
andimue May 16, 2012 at 10:45:20 (UTC)
Goto Top
Servus Skyemugen,

P.P.S hab ich gleich korrigiert
P.S da könntest du recht haben

zu deiner Antwort:

wenn ich das mache:
echo %%temp%% > temp.txt

erhalte ich in temp.txt --> %C:\DOKUME~1\andi\LOCALS~1\Temp%

in der zu erzeugenden Ausgabedatei soll aber %temp% stehen. Deinen Vorschlag hatte ich auch schon ausprobiert (auch mit noch mehr %-Zeichen).
Member: Penny.Cilin
Penny.Cilin May 16, 2012 at 10:45:31 (UTC)
Goto Top
<offtopic> DOS Batch/Fenster gibt es schon seit Windows NT nicht mehr. Das nennt sich jetzt CLI bzw. Shell Scripting face-wink</offtopic>
Member: Goalie
Goalie May 16, 2012 at 10:49:46 (UTC)
Goto Top
Hallo,

sollte folgendermaßen funktionieren:

echo ^%temp^% > temp.txt

Gruß

Goalie
Member: andimue
andimue May 16, 2012 at 11:03:37 (UTC)
Goto Top
Hallo goalie,

das mit dem Entwerten von Sonderzeichen kenn ich und habe es in meinem Code z.B. für < und > angewandt.
Dein Vorschlag funktioniert so wie vorgeschlagen auch prima. Es steht %temp% in der Datei

Wenn ich ihn allerdings in meinen Code einbaue der dann wie folgt aussieht:
>> ~destserver.hta  echo  	cmdToExec = "cmd /V:on /c ^> ^%temp^%\zielserver.txt   echo " + string1   

erhalte ich folgendes:

.javacmdToExec = "cmd /V:on /c ^> ^%temp^%\zielserver.txt echo " + string1

P.S. ich hatte das auch schonmal ausprobiert und mangels Erfolg wieder verworfen
Member: andimue
andimue May 16, 2012 at 11:11:41 (UTC)
Goto Top
Ich habe gerade meinen Befehl mal zerlegt und festgestellt, dass es wohl wegen der im Befehl enthaltenen " nicht richtig ausgegeben wird.
Ohne Anführungszeichen wäre alles ok.

>> ~destserver.hta  echo  	cmdToExec = cmd /V:on /c ^> ^%temp^%\zielserver.txt   echo  + string1 

liefert das erhoffte Ergebnis :

.javacmdToExec = cmd /V:on /c > %temp%\zielserver.txt echo + string1


Allerdings hab ich dann da das Problem, dass ich die Anführungszeichen wirklich brauche face-sad
Member: andimue
andimue May 16, 2012 at 11:17:49 (UTC)
Goto Top
Ich glaube, ich habe die Lösung.
Wenn ich die Anführungszeichen auch noch mit ^ entwerte scheint es zu funktionieren:

>> ~destserver.hta  echo  	cmdToExec = ^"cmd /V:on /c ^> ^%temp^%\zielserver.txt   echo^ " + string1   


( und das soll dann noch ein Mensch verstehen...)

Vielleicht hat ja noch jemand eine "schönere" Lösung. Ansonsten würde ich den Beitrag als Gelöst markieren.
Danke an den creativen Input face-smile
Member: Skyemugen
Skyemugen May 16, 2012 at 11:32:00 (UTC)
Goto Top
Aloha,

hm, eigentlich ... aus einem Skript heraus sollte das funktionieren.

greetz André
Member: Skyemugen
Skyemugen May 16, 2012 at 11:41:28 (UTC)
Goto Top
Aloha,

edit: alles Blödinn hier!!! Mann, diese ganze cmd-echo-Kacke verwirrt mich heute, in einem Skript führt ^% zu rein gar nichts ...

greetz André
Member: andimue
andimue May 16, 2012 at 11:54:44 (UTC)
Goto Top
Servus,

jetzt muss ich mich doch nochmal melden. Ich hab gerade nochmal getestet und wegen des Ergebnisses fall' ich fast vom Glauben ab:

ich rufe im cmd-Fenster ein Skript mit folgendem Inhalt auf:

>  t.txt  echo  Testzeile
>> t.txt  echo  %%temp%%

Das Ergebnis in t.txt ist:

Testzeile
%temp%

Wenn ich nun im selben cmd-Fenster den Befehl >> t.txt echo %%temp%% aus der Datei nochmal absetze sieht die Datei wie folgt aus:

Testzeile
%temp%
%C:\DOKUME~1\andi\LOCALS~1\Temp%


Muss ich das verstehen ? Wieso ergibt derselbe Befehl unterschiedliche Ergebnisse ? Es scheint mir fast, dass beim Aufruf des Skripts die DelayedExpansion eingeschaltet ist. Wie kann ich denn das prüfen ?

Verwirrt
Andi
Member: Skyemugen
Skyemugen May 16, 2012 at 12:08:52 (UTC)
Goto Top
Aloha,

ach du hast das vorhin im cmd getestet? Dachte in einem Skript ... darum war ich schon sehr verwirrt :D

Ja, cmd prompt und batch-Skript werden unterschiedlich interpretiert, dem Prompt sind doppelte Prozente aka wie man Prozentzeichen korrekt escaped vollkommen egal, siehe Laufvariable(n) %i (cmd) %%i (batch).

Hat meines Wissens nach auch nichts mit irgendwelchen expansion-Einstellungen zu tun face-wink

greetz André
Member: Skyemugen
Skyemugen May 16, 2012 at 12:12:03 (UTC)
Goto Top
Aloha Goalie,

sollte ... bei allen möglichen Zeichen, nur nich beim Prozent face-wink

Du darfst es gerne selbst versuchen face-wink

greetz André
Member: andimue
andimue May 16, 2012 at 12:12:42 (UTC)
Goto Top
Hi André,

die Besonderheit von Laufvariablen in for-Loops war mir bewußt aber das auch "normale" Umgebungsvariablen betroffen sind ist mir bisher wohl noch nie aufgefallen.

Wenn dem so ist ( womit ich nicht an deiner Aussage zweifeln möchte face-smile ) werde ich nun einfach in mein Skript die Skript-Schreibweise einbauen und hoffen, dass es funktioniert.

Danke für den Schubs in die richtige Richtung
Member: Skyemugen
Skyemugen May 16, 2012 at 12:21:24 (UTC)
Goto Top
Aloha,

ja, heute ist wieder so ein Tag, da hängt man schon brain-afk im langen Wochenende, da du anfangs von einem ... Skript geschrieben hast, ging ich nicht davon aus, du würdest den Test im cmd machen ... wobei ich vorhin auch reingefallen bin, auf eure ganzen cmd-Testereien, uarg.

So viele Themen handeln von genau diesem Thema hier ... aber wenn man halb brain-afk ist, dann wird der Thread eben manchmal länger ;D

Und wie gesagt: Unter verwendung von " Zollzeichen (wie ich sie gerne bezeichne), sollte das Escapen von > überflüssig werden, denn sonst wird das ^ mit in der Ausgabe erscheinen.

greetz André
Member: Goalie
Goalie May 16, 2012 at 12:29:20 (UTC)
Goto Top
Hallo André,

hab das nur schnell im cmd probiert und da gings face-smile

Hätte es (vielleicht) vorher noch im Skript testen sollen...

Gruß

Goalie
Member: jeb-the-batcher
jeb-the-batcher May 16, 2012 at 14:35:20 (UTC)
Goto Top
Hallo Goalie,

der Witz ist, es klappt selbst vom cmd-prompt nicht ein Prozentzeichen mit ^ zu escapen, es erweckt bloss den Eindruck face-smile

Es funktioniert weil im cmd-prompt unbekannte Variabeln bei der Prozentexpansion nicht verschwinden (aber in einer Batchdatei),
sondern einfach mitsamt der Prozentzeichen unverändert stehen bleiben..

cmd-prompt
echo %path% - expandiert
echo ^%path^% - Ergibt "%path%"  
echo %pa^th% - Ergibt auch "%path%"  

Das liegt daran das eine Variable namens path^ oder pa^th gesucht wird, aber nicht existiert, danach wird dann vom Parser einfach noch das ^ entfernt,
und siehe da es scheint ein Prozent escapen zu können.

jeb
Member: jeb-the-batcher
jeb-the-batcher May 16, 2012 at 14:51:00 (UTC)
Goto Top
Hallo Goalie,

es gibt noch einen kleinen Trick damit man sich nicht um Sonderzeichen kümmern muss.
Einfach %magicEcho% verwenden face-smile

@echo off
cls
setlocal DisableDelayedExpansion
call :LoadMacros

setlocal EnableDelayedExpansion
%MagicEcho% Hier klappt alles !&|<> selbst ein einzelnes ^ wird ausgegeben auch "mit Quotes klappt es ^ & |<>"%MagicEnd%  
%MagicEcho% Das einzige was "escaped" werden muss sind Prozentzeichen zb. %%PATH%% %MagicEnd%  
exit /b

:LoadMacros
set lf=^


set ^"MagicEnd=^%lf%%LF%@echo off)))"  
set ^"\n=^^^%lf%%LF%^%lf%%LF%^^"  
set MagicEcho=for /L %%n in (1 1 2) do (%\n%
if %%n==2 (%\n%
<test.tmp (%\n%
		set /p line=%\n%
		set /p line=%\n%
	)%\n%
	echo(!line:~7,-1!%\n%
	endlocal%\n%
) ELSE (%\n%
> test.tmp (%\n%
    setlocal EnableDelayedExpansion%\n%
	prompt #%\n%
	@echo on%\n%
	for %%a in (1) do rem #
exit /b

Ich denke das Macro MagicEcho ist selbst erklärend

jeb
Member: Goalie
Goalie May 16, 2012 at 15:15:07 (UTC)
Goto Top
Hallo jeb,

danke für die Erklärung.

Hab ich gleich noch mal richtig was dazugelernt! face-smile

Gruß

Goalie