Globale Variable in Batch?
Hi,
Ich versuche ein system zu erstellen wo ich eine Bat habe wo ich durchgehend User input (commands) in einer variable speicher.
in einer 2. Bat Datei soll dann diese Variable genutzt werden.
=>Wie erstell/mache ich die Variabe Global?
1 Antwort
Du kannst mit:
setx _myVar "Mein Inhalt"
Eine so Speichern, das Diese auf dem im gesamten Nutzerprofil , fest eingebunden ist. (Global sind Adminrechte nötig Schalter /m) https://ss64.com/nt/setx.html
Lesbar ist die Variable jedoch erst von anderen Anwendungen, wenn diese nach dem setzen der Variable gestartet wurden. (jede Anwendungen bekommt beim Start eine eigene Kopie des beim Start verfügbaren Environments) https://ss64.com/nt/syntax-variables.html
Gelöscht werden kann eine persistent gesetzte Variable nur durch löschen aus der Registry!
reg delete HKCU\Environment /v _myVar
Die Löschung zeigt erst nach dem Ausloggen und erneutem Einloggen /Neustart Wirkung !
setx eignet sich nicht für die Kommunikation zwischen laufenden Prozessen.
Die einfachste Variante um Daten zwischen laufenden Prozessen auszutauschen ist eine Datei mit gemeinsamen Zugriff . (in Hochsprachen gibt es auch andere Möglichkeiten, aber die sind selbst in diesen umstritten)
Für Batch ist nur die KommunIkation durch Datei-Polling angebracht:
sender.cmd
@echo off
chcp 65001 >nul
rem Dateiname zum speichern und lesen im Tempordner festlegen
set "DataFile=%temp%\myData.txt"
:loop
rem Variablen mit Markantem Namensanfan
set "__Export.SenderName=Erzesel"
set /p "__Export.Message=Gib eine Nachricht ein:"
rem alleVariablen die mit __Export. beginnen in die Datei schreiben
set "__Export." >"%DataFile%"
echo Daten gesendet...
goto :Loop
pause
reciver.cmd
@echo off
chcp 65001 >nul
rem Dateiname zum speichern und lesen im Tempordner festlegen
set "DataFile=%temp%\myData.txt"
rem Macro zum Einlesen definieren, (spart Tipparbeit)
set "macGetVars=for /f "usebackq tokens=*" %%a in ("%DataFile%") do set "%%a""
echo Lese Variablen aus Datei
echo:
:loop
rem Variablen aus Datei Lesen (Macro aufrufen)
set "last.Message=%__Export.Message%"
%macGetVars%
rem prüfe ob sich seit der letzten Nachricht etwas geändert hat.
if "%__Export.Message%"=="%last.Message%" (
rem warte 1 Sekunde (weniger Systemlast)
timeout 1 >nul
goto :loop
)
rem wenn sich etwas veändert hat...
echo neue Nachricht von: %__Export.SenderName% :
echo Text: "%__Export.Message%"
goto loop
..Zeitverzögerungen sind auf Grund der 1 sekündigen pause zwischen den Lesevorgängen ein notwendiges Übel. (ein kontinuierliches Polling würde System und Datenträger unnötig belasten.
Ich weis nicht was Du vorhast...
Sowas macht eigentlich nicht viel Sinn. weshalb sollte eine Batch in einem parallelem Prozess eingegebene Nachrichten empfangen ?
Ich verwende auch MultithreadingBatches zu Parllverarbeitung, da genügen jedoch automatisch gesetzte Variablen bestenfalls zur Synchronisation.