FinalFantasy Geschrieben 7. November 2003 Geschrieben 7. November 2003 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 Zitieren
Guybrush Threepwood Geschrieben 7. November 2003 Geschrieben 7. November 2003 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 Zitieren
FinalFantasy Geschrieben 7. November 2003 Autor Geschrieben 7. November 2003 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? Zitieren
Gast roaxius Geschrieben 7. November 2003 Geschrieben 7. November 2003 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 Zitieren
nic_power Geschrieben 7. November 2003 Geschrieben 7. November 2003 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 Zitieren
FinalFantasy Geschrieben 7. November 2003 Autor Geschrieben 7. November 2003 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. Zitieren
nic_power Geschrieben 7. November 2003 Geschrieben 7. November 2003 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 Zitieren
Klotzkopp Geschrieben 7. November 2003 Geschrieben 7. November 2003 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 Zitieren
FinalFantasy Geschrieben 7. November 2003 Autor Geschrieben 7. November 2003 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! Zitieren
goepp Geschrieben 7. November 2003 Geschrieben 7. November 2003 man versucht es entweder wie oben beschrieben oder glaubt dem hier wonach es nicht möglich ist. Zitieren
nic_power Geschrieben 7. November 2003 Geschrieben 7. November 2003 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 Zitieren
FinalFantasy Geschrieben 10. November 2003 Autor Geschrieben 10. November 2003 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. Zitieren
maxim_42 Geschrieben 10. November 2003 Geschrieben 10. November 2003 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. Zitieren
FinalFantasy Geschrieben 10. November 2003 Autor Geschrieben 10. November 2003 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. Zitieren
maxim_42 Geschrieben 10. November 2003 Geschrieben 10. November 2003 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. Zitieren
FinalFantasy Geschrieben 10. November 2003 Autor Geschrieben 10. November 2003 *kopfandiewandhau* Naja, warum einfach, wenns auch kompliziert geht. *gg* Danke, so müsste es eigentlich gehen. Zitieren
FinalFantasy Geschrieben 10. November 2003 Autor Geschrieben 10. November 2003 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. Zitieren
maxim_42 Geschrieben 11. November 2003 Geschrieben 11. November 2003 Du musst eine Schleife verwenden Mein Tip: Im cmd-Fenster <Help for> eingeben und dich durch den Text kämpfen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.