"Bad Escape Sequence" verkürzte Umgebungsvariablen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

BlitzMoritz

Betreff: "Bad Escape Sequence" verkürzte Umgebungsvariablen

BeitragDi, Aug 18, 2009 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Folgende Situation: Ich möchte (unter Windows) zur Laufzeit eine Datei in einem temporären Verzeichnis (zwischen-)speichern und im zweiten Schritt ein anderes Programm mit dieser Datei als Argument starten, etwa so:
BlitzMax: [AUSKLAPPEN]
Local filepath:String = GetEnv_("TMP") + "\file"
Local programpath:String = "C:\Programme\AnderesProgramm.exe"
WriteFile(filepath)
system_(programpath + " " + Chr(34) + filepath + Chr(34))

Die Anführungszeichen (Chr(34)) sind nur nötig, falls der Dateiname ein Leerzeichen enthält.
Die Umgebungsvariable GetEnv_("TMP") liefert (wahrscheinlich aufgrund der Stringlänge) eine Art "abgekürzten" Pfad, wobei an den gekürzten Stellen das Zeichen ~ steht.
Während die BlitzMax-eigenen Befehle wie z.B. WriteFile, FileType usw.. damit keine Probleme zu haben scheinen, verweigert jedoch die Konsole (die mit system_ aktiviert wird), solch einen Pfad bzw. meldet "Bad Escape Sequence" aufgrund des besagten Zeichens ~
Hat jemand eine Idee, wie man die verkürzte Umgebungsvariablen wieder in einen vollständigen korrekten Pfad-String verwandeln kann? Realpath(filepath) schafft das beispielsweise nicht.
  • Zuletzt bearbeitet von BlitzMoritz am Di, Aug 18, 2009 15:12, insgesamt einmal bearbeitet

DaysShadow

BeitragDi, Aug 18, 2009 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit ein wenig googlen bin ich gerade darauf gestoßen das man mit getenv_("USERPROFILE") den Pfad zum Benutzer bekommt, da hängst du einfach "\Anwendungsdaten\Temp" dran.

BlitzMax: [AUSKLAPPEN]
Local filepath:String = GetEnv_("USERPROFILE") + "\Anwendundsdaten\Temp\file"
Local programpath:String = "C:\Programme\AnderesProgramm.exe"
WriteFile(filepath)
system_(programpath + " " + Chr(34) + filepath + Chr(34))


Sofern ich dich richtig verstanden habe sollte das dein Problem lösen Wink

MfG DaysShadow
Blessed is the mind too small for doubt

Goodjee

BeitragDi, Aug 18, 2009 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
aber das funktioniert nur auf deutschen systemen
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Nicdel

BeitragDi, Aug 18, 2009 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Und der Temp-Pfad kann auch von Windows aus geändert werden. In diesem Fall würd's auch nichts mehr nützen...
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

DaysShadow

BeitragDi, Aug 18, 2009 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ja stimmt, das ist nur begrenzt eine Lösung =/

http://msdn.microsoft.com/en-u...S.85).aspx

Diese Funktion wandelt einen ShortPath in einen LongPath um, ich denke das wäre das richtige, allerdings hab ich immer noch keine Ahnung davon wie man die Funktionen für BlitzMax bereitstellt, aber irgendjemand wird das sicher können oder?

MfG DaysShadow
Blessed is the mind too small for doubt

BtbN

BeitragDi, Aug 18, 2009 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
In BMax ist ~ das Escape-Zeichen(So kannst du dein Chr-Zeug einfach durch ~q im String ersetzen, steht übrigens sogar in der Doku, die du ja hoffentlich gelesen hast). Um wirklich das zeichen ~ zu bekommen, schreibe in BMax-Strings einfach ~~

BlitzMoritz

BeitragDi, Aug 18, 2009 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für Eure Ratschläge. Smile

@BtbN: Wo steht das genau in der Doku? In welchem Kapitel, unter welchem Stichwort? Ich find' da nie 'was...
Dein Hinweis ließ mich aber noch genauer recherchieren, wobei ich feststellte, dass das Problem tatsächlich nicht beim Konsolenargument lag, sondern DOCH innerhalb BlitzMax! Und leider kann ich das dort auch nicht mit den ~q bzw. ~~ Tipps beheben. Die Sache ist nämlich noch vertrackter bzw. doppelt gemoppelt: Ich erstelle mit einem eigenen Programm einen Quellcode und möchte ihn vom BlitzMax-Compiler, also bmk.exe kompilieren lassen.

Hab' jetzt folgenden Kompromiss gefunden: Ich nehme ein Array mehrerer temporär-tauglicher Verzeichnis-Möglichkeiten
BlitzMax: [AUSKLAPPEN]
tmpdirlist = [GetEnv_("TMP"), GetEnv_("windir") + "/Temp", GetEnv_("USERPROFILE"), GetEnv_("ALLUSERSPROFILE"), CurrentDir(), "C:/"]

und suche in einer Schleife welcher Eintrag davon frei vom Zeichen ~ (mit dem Asc-Code 126) ist (und natürlich beschreibbar ist):
BlitzMax: [AUSKLAPPEN]
If Instr(tmpdirlist[i], Chr(126)) = 0 Then ...

Als erster tauglicher Kandidat erwies sich übrigens "C:\WINDOWS\Temp"

BtbN

BeitragMi, Aug 19, 2009 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du den String natürlich in ein neu zu kompilierendes BMax programm schreibst, must du beachten, dass auch dort im string, der aus deinem String entsteht, das ~-Zeichen richtig escaped ist.
Also wenn du im finalen programm einen String printen willst:

Print "Print ~q~~~~~q"
Gibt aus: Print "~~"
Gibt aus: ~

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group