dolsch
Goto Top

Zu viele Variablen in Batch-Script? Speicherproblem?

Ich habe diverse Batch-Scripts, mit denen ich das AFDKO (Adobe Font Development Kit for OpenType) steuere. Diese Scripts callen ein weiteres Batch-Script, in dem derzeit 92 Variablen gesetzt werden, nämlich die Pfade zu Python-Scripts, Programmen (exe) und Ordnern. Nachdem ich vor ein paar Tagen das AFDKO neu aufgebaut habe, habe ich festgestellt, dass es beim Abarbeiten einiger Scripts zum Crash eines Programms kommt, das von einem der Python-Scripts aufgerufen wird.

Ich habe den Fehler auf Github im AFDKO-Bereich gemeldet, habe heute aber nochmal selbst versucht, dem Problem auf die Spur zu kommen und irgendwann festgestellt, dass es offenbar daran liegt, dass ich zu viele Variablen in dem gecallten Batch-Script setze. Wenn ich von den 92 Variablen die letzten 27 lösche, crasht das Programm nicht mehr. Ich könnte das Batch-Script, in dem die Variablen gesetzt werden, zwar abspecken oder jedes der anderen Batch-Scripts nur die Variablen setzten lassen, die es selbst braucht, aber Grund für die Zentralisierung war, dass sich mit der Entwicklung des AFDKO und seiner Module regelmäßig die Pfade zu den Python-Scripts und anderen Dateien ändern und ich meine Batch-Scripts wesentlich bequemer an neue Versionen des AFDKO anpassen kann, wenn ich die Pfade in einem zentralen Batch-Script in Variablen speichere.

Wie löse ich das Problem am Besten? Kann ich den Speicher, der für Variablen zur Verfügung steht, irgendwie erweitern? Und was genau ist überhaupt Ursache des Problems? Meine Tests haben ergeben, dass es nicht an der reinen Anzahl der Variablen, die ich setze, liegt, sondern eher an dem Speicherplatz, den sie einnehmen. Den Pfad zum FDK habe ich z. B. von C:\FDK_Datum auf C:\FDK gekürzt und konnte dadurch mindestens eine Variable mehr setzen.

Das Batch-Script, in dem die Variablen gesetzt werden, sieht etwa so aus. Ich habe es etwas gekürzt.

@echo off

set "FDK=C:\FDK"  
set "perl_exe=C:\Perl\bin\perl.exe"  
set "Tools=%FDK%\Tools"  
set "win=%Tools%\win"  
set "PATH=%win%;%PATH%"  
set "SharedData=%Tools%\SharedData"  
set "FDKScripts=%SharedData%\FDKScripts"  
set "PythonDir=%win%\Python\AFDKOPython27"  
set "python_exe=%PythonDir%\python.exe"  
set "sitepackages=%PythonDir%\Lib\site-packages"  
set "fontTools=%sitepackages%\fonttools-3.15.2.dev0-py2.7.egg\fontTools"  
set "ufonormalizer=%sitepackages%\ufonormalizer-0.1-py2.7.egg"  
set "tab=%fontTools%\ttLib\tables"  

set "autohint_py=%FDKScripts%\autohint.py"  
set "autohint_py_Com=%python_exe% %autohint_py%"  

[Hier werden etwa 40 weitere Variablen gesetzt, u. z.
Paare aus dem Pfad zum jeweiligen Python-Script und der Anweisung
an Python, das jeweilige Python-Script abzuarbeiten.]

For /f "delims=\ tokens=1,2" %%i in ("%~dp0") do (  
      Set "rootDir=%%i"   
      Set "Dir1=%%j"  
)

set "Scripts_and_Exe_Tools=%rootDir%\%Dir1%\Scripts_and_Exe_Tools"  
set "Python_Scripts=%Scripts_and_Exe_Tools%\Python_Scripts"  
set "Perl_Scripts=%Scripts_and_Exe_Tools%\Perl_Scripts\Scripts"  
set "Exe_Tools=%Scripts_and_Exe_Tools%\Exe_Tools"  

set "subst_py=%Python_Scripts%\subst.py"  
set "subst_py_Com=%python_exe% %subst_py%"  

[Hier werden etwa 20 weitere Variablen gesetzt, u. z.
Paare aus dem Pfad zum jeweiligen Python-Script und der Anweisung
an Python, das jeweilige Python-Script abzuarbeiten.]

set "setsnap_pl=%Perl_Scripts%\setsnap.pl"  
set "setsnap_pl_Com=%perl_exe% %setsnap_pl%"  

Content-Key: 350607

Url: https://administrator.de/contentid/350607

Printed on: April 19, 2024 at 08:04 o'clock

Member: Xerebus
Xerebus Oct 02, 2017 at 19:58:02 (UTC)
Goto Top
Boah. Variablenfetischist face-smile
Für jede Erweiterung des Pfades ne neue Variable.....
Kürz das halt ein wenig zusammen.
C:\Perl\bin\ bleibt sich doch bei einer Standard Installation eh immer gleich. Wieso hier mit Variablen arbeiten?
Member: dolsch
dolsch Oct 02, 2017 updated at 21:08:49 (UTC)
Goto Top
Variablenfetischist

Lol. Ja, irgendwie schon. Früher war das Ganze nicht zentralisiert. Und seit der Zentralisierung ist die Pflege meiner Batch-Bibliothek viel einfacher geworden. Wenn sich irgenwo ein Pfad im AFDKO ändert, muss ich ihn nur in ein oder zwei Variablen und nur in einem Script anpassen und nicht in dutzenden. Und vor allem muss ich nicht nach den Batch-Scripts suchen, auf die sich die Pfadänderung im AFDKO auswirkt. Daher mein Variablenfetischismus.

C:\Perl\bin\ bleibt sich doch bei einer Standard Installation eh immer gleich. Wieso hier mit Variablen arbeiten?

Das war prophylaktisch, weil Python auch im AFDKO-Ordner untergebracht ist. In den Python-Befehlen gebe ich auch den Pfad zur Python.exe und den Pfad zum Python-Script an. Auf die Weise will ich sicherstellen, dass bei mehreren installierten Python-Versionen eine ganz bestimmte genutzt wird. Die Python-Version, die ich für das AFDKO nutze, ist quasi portable. Ich habe sie installiert, den Installationsordner kopiert, ins AFDKO eingebaut und dann wieder deinstalliert.

Selbst wenn ich die Variablen zusammenkürze, also darauf verzichte, nicht nur die Pfade zu den Python-Scripts in Variablen zu speichern, sondern zusätzlich die Kombination aus Pfad zur Python.exe und Pfad zum Script -- diese Variablen enden alle auf "_Com": Es kommen ja immer mehr Python-Scripts hinzu, die ich nutzen will. Und irgendwann stoße ich doch wieder an die erlaubte Anzahl von Variablen bzw. auf das Speicherproblem. Es sei denn, ich dezentralisiere das Ganze wieder, was die Pflege aber enorm erschweren würde. Und mir ist im Moment auch gar nicht klar, wo die Grenze in Bezug auf die Variablen eigentlich liegt. Die Pfade sind ja nicht einmal besonders lang. Und okay, ich setze derzeit 92 Variablen, was sicher nicht wenig ist. Aber wo genau liegt da die Grenze? Wodurch wird sie festgelegt? Mir ist unklar, wieviel Speicher mir für die Variablen zur Verfügung steht und wie ich ausrechnen könnte, wieviel Speicher die Variablen belegen.

Edit: "Dutzende Batch-Scripts" war untertrieben. Es sind mittlerweile 221, die das zentrale Batch-Script callen, in dem ich die ganzen Variablen setze.