Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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?

Geschrieben
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 :)

Geschrieben

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

Geschrieben

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

Geschrieben
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

Geschrieben

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!

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...