Persistierende eine Umgebungsvariable durch Rubin
-
06-07-2019 - |
Frage
Ich versuche, mein DOS-Umgebungsvariable in Ruby zu setzen, und habe sie bestehen bleiben, nachdem das Skript beendet. Zum Beispiel, wenn ich einen Ruby-Skript set_abc_env.rb
auf Umgebungsvariable ‚ABC‘ auf ‚blah‘ will, erwarte ich folgende ausführen:
C:> echo %ABC%
C:> set_abc_env.rb
C:> echo %ABC% blah
Wie kann ich das tun?
Lösung
Sie können Umgebung zugreifen Variablen über Ruby-ENV Objekt:
i = ENV['ABC']; # nil
ENV['ABC'] = '123';
i = ENV['ABC']; # '123'
Schlechte Nachricht ist, als MSDN sagt kann ein Prozess nie direkt die Umgebungsvariablen eines anderen Prozesses ändern, die kein Kind dieses Prozesses ist. Also, wenn Skript beendet, verlieren Sie alle Änderungen, die es getan haben.
Eine gute Nachricht ist, was Microsoft Windows speichert die Umgebungsvariablen in der Registrierung und es ist möglich, Umgebung ausbreiten rel="noreferrer"> Variablen auf das System. Dies ist eine Art und Weise Benutzerumgebungsvariablen zu ändern:
require 'win32/registry.rb'
Win32::Registry::HKEY_CURRENT_USER.open('Environment', Win32::Registry::KEY_WRITE) do |reg|
reg['ABC'] = '123'
end
Die Dokumentation sagt auch, sollten Sie sich abmelden und wieder anmelden oder eine WM_SETTINGCHANGE Nachricht übertragen Änderungen an Anwendungen gesehen. Dies ist, wie Rundfunk kann in Ruby getan werden:
require 'Win32API'
SendMessageTimeout = Win32API.new('user32', 'SendMessageTimeout', 'LLLPLLP', 'L')
HWND_BROADCAST = 0xffff
WM_SETTINGCHANGE = 0x001A
SMTO_ABORTIFHUNG = 2
result = 0
SendMessageTimeout.call(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000, result)
Andere Tipps
Für alle anderen der Suche nach einer Lösung für dieses und suchen nach einem eher ein Hack, der nicht in der Anmeldung nicht erforderlich oder aus kam ich für ein ähnliches Problem bei dieser Lösung:
Abhilfe:
Meine Arbeit ist um abhängig von der Kombination von Rubin und einem Kommandozeilen-Utility namens SETENV.EXE von Vincent Fatica develped. Es ist mehr als ein Jahrzehnt alt an diesem Punkt aber funktioniert in Windows XP in Ordnung (nicht getestet unter Windows 7 noch) nicht. Es funktioniert besser als setx Dienstprogramm von MS IMHO zur Verfügung. Zu damit für Sachen zu löschen. Stellen Sie sicher, setenv von der Kommandozeile zur Verfügung. Legen Sie es in ein c: \ tools und setzen c. \ Tools in der PATH
Hier ist ein kurzes Beispiel für ein Verfahren unter Verwendung von ihm:
def switch_ruby_env
if RUBY_VERSION.match("1.8.7").nil?
`setenv -m CUSTOM_PATH " "`
else
`setenv -m CUSTOM_PATH -delete`
end
end