Veröffentlicht 7. November 200321 j Hallo, einfache und kurze Frage: Wie kann ich eine Environemntvariable aus einem C-Programm heraus setzen. Ich brauche einen String mit Datum + Zeit und würde den gerne der Env-Var %datetime% zuweisen? Ich hab es mit system("set datetime=%s", timestr); probiert, funktioniert aber nicht. Habs jetzt auch mit _putenv(char* cmd) probiert. Geht aber auch nicht. Er setzt mir die Variable nicht. Benutze übrigens VC++. Bye
7. November 200321 j Wie soll das auch Funktionieren? system() erwartet einen String und baut diesen nicht selber zusammen. machs so: char szBefehl[50]; sprintf (szBefehl,"set datetime=%s", timestr); system(szBefehl); [/PHP] Gruß Guybrush
7. November 200321 j Autor Ups sorry. Ist natürlich klar. Ich habs schon so gemacht, wie du sagst, funktioniert aber nicht. Ich geh mal richtig in der annahme, dass man mit set test = blabla eine Variable setzt, und diese dann mit echo %test% wieder abfragen kann, oder? Mit set bekomme ich alle gesetzten System-Variablen ausgegeben, oder?
7. November 200321 j Original geschrieben von FinalFantasy Ich geh mal richtig in der annahme, dass man mit set test = blabla eine Variable setzt, und diese dann mit echo %test% wieder abfragen kann, oder? Mit set bekomme ich alle gesetzten System-Variablen ausgegeben, oder? Ja, das stimmt soweit alles
7. November 200321 j Hallo, so einfach ist das nicht. Umgebungsvariablen beziehen sich naemlich nur auf die Shell in der sie gesetzt sind - bzw auf die Kindprozesse. Aus dem Grunde gibt es auch einen autoexec.bat bzw. .cshrc/.bashrc, usw. Setzt Du eine Variable per "system()" wird diese Variable nur in der Shell gesetzt, die durch system() aufgerufen wird. Terminiert diese Shell, ist auch die gesetzte Umgebungsvariable wieder verschwunden (also praktisch sofort, da system() unmittelbar zurückkehrt). D.h. das Konstrukt: char szBefehl[50]; sprintf (szBefehl,"set datetime=%s", timestr); system(szBefehl); [/php] entspricht einem "nop". Du solltest mit putenv/setenv bzw. getenv arbeitet. Allerdings ist auch hier zu beachten, dass die Umgebung nur an die Kindprozesse vererbt wird, nicht jedoch an die Eltern! Nic
7. November 200321 j Autor wie ich im ersten Beitrag nachträglich noch editiert habe, hab ich es mit putenv auch schon probiert. Funktioniert auch nicht. Ist übrigens für Windows, also könnt ihr euch detailierte Linuxlösungen sparen.
7. November 200321 j Hallo, das oben Gesagte gilt für praktisch alle Betriebssysteme (einschliesslich Windows). Die Umgebungsvariablen sind nur in der Umgebung sichtbar (und damit verwendbar), in der sie gesetzt wurden bzw. werden an Kindprozesse vererbt! Nic
7. November 200321 j Original geschrieben von FinalFantasy Ist übrigens für Windows, also könnt ihr euch detailierte Linuxlösungen sparen. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message. This allows applications, such as the shell, to pick up your updates. Quelle: http://msdn.microsoft.com/library/en-us/dllproc/base/environment_variables.asp
7. November 200321 j Autor Geht das nicht etwas einfacher? Wie siehts aus, bereits gesetzte Variablen zu ändern, ist dass dann auch nur für diese spezielle Console? Wenn ich da jetzt mit der Registry auch noch anfangen muss, ist das schon fast wieder ein Overkill für die einfache Sache. Ich will doch nur eine Systemvariable, ind der Datum/Uhrzeit in einem speziellen Format steht, dass ich damit einiges Dateien mittels Batch-Files umbenennen kann!
7. November 200321 j man versucht es entweder wie oben beschrieben oder glaubt dem hier wonach es nicht möglich ist.
7. November 200321 j Hallo, Original geschrieben von FinalFantasy Wie siehts aus, bereits gesetzte Variablen zu ändern, ist dass dann auch nur für diese spezielle Console? Das Verändern einer Variable unterscheidet sich nicht vom Setzen (ist sie nicht vorhanden, wird sie neu angelegt ansonsten überschrieben). Wie bereits oben erwähnt und in dem Link nochmals bestätigt, beziehen sich setenv/putenv _nur_ auf die aktuelle Umgebung des Prozesses und dessen Child-Prozessen! Warum setzt Du die Variable nicht direkt in der Shell? Nic
10. November 200321 j Autor Das ganze soll automatisch ablaufen, und ein paar Dateien mit einem Zeitstempel im Dateinamen versehen. Ich brauche also die aktuelle Zeit in einer Envvar, um die Dateien entsprechend umbenennen zu können. Das Format von %date% und %time% passt mir leider nicht.
10. November 200321 j Schreib es doch in eine temporäre Datei. Im Batch kannst du die Datei dann auslesen. Möglicherweise kannst du auch die Batchdatei die du ausführen willst in deinem Programm neu schreiben.
10. November 200321 j Autor Also leider kenn ich mich mit Batch noch weniger aus als mit C. Wie kann ich denn eine Datei aus einem Batchfile auslesen, und damit dann dateien umbennen? Ich will nicht die ganze Funktion in mein C-Porgramm packen, weil das relativ variabel bleiben soll.
10. November 200321 j Na ich stell's mir so vor: Die temporäre Datei nennst du beispielsweise meinDatum.cmd und schreibst im C-Programm "Set MeinDatum= < Datum nach deinen Formatwünschen >" rein. In deinem Batch rufst du meinDatum.cmd mit CALL meinDatum.cmd auf und setzt damit die Enviromentvariable %MeinDatum% Die ist dann systemweit verfügbar.
10. November 200321 j Autor *kopfandiewandhau* Naja, warum einfach, wenns auch kompliziert geht. *gg* Danke, so müsste es eigentlich gehen.
10. November 200321 j Autor Jetzt hab ich noch eine kleines anderes Problem, dass aber eigentlich schon ein wenig offtopic ist, glaub ich: Wenn ich in Win2k in der Shell mit ren *.log %datetime%-*.log allen Dateien im Namen quasi das Datum voranstellen will, geht das nicht, weil er beim Ziel für den * nicht wieder den Originalnamen einsetzt. Aber es muss doch gehen, mehrere Dateien nach einem bestimmten Muster umzubenennen. Mit copy und move hab ichs auch schon probiert. Bringt aber den gleichen Effekt.
11. November 200321 j Du musst eine Schleife verwenden Mein Tip: Im cmd-Fenster <Help for> eingeben und dich durch den Text kämpfen.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.