Globale Variable in Batch?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren