CS-Script ohne Installation nutzen

Alle meine Deploy- und Setup-Erstell-Prozesse skripte ich. D.h. mein Ziel ist immer, ohne das Hirn einzuschalten eine einzelne Batch-Datei doppel zu klicken und dann am Ende ein fertiges Setup oder eine fertig publizierte Website zu haben.

Da ich PowerShell als viel zu kompliziert empfinde, nutze ich dafür CS-Script. Damit kann ich (ohne zu kompilieren) in C# Code schreiben und auf den vollen Funktionsumfang des .NET-Frameworks zugreifen. Auch eigene Assemblies kann ich nutzen und sogar SOAP-Webdienste kann ich automatisiert einbinden.

Um CS-Script rein XCOPY-deployable nutzen zu können, also ohne das Setup von CS-Skript auszuführen habe ich meine Skripte so angepasst:

PUSHD 
CD /d %~dp0 
CLS

SET CSSCRIPT_DIR=\\path\to\cs-script

"\\path\to\cs-script\cscs.exe" /dbg "%~dp0\my-script.cs"

POPD 

Der Trick war, damit es sauber lief, die Umgebungsvariable CSSCRIPT_DIR zu setzen. Ohne diese Variable hat es immer Fehlermeldungen gegeben.

Wenn ich das Skript ohne installiertes CS-Script aufgerufen habe, also rein über die CSSCRIPT_DIR-Umgebungsvariable, hatte ich ein seltsames Verhalten:

Der erste Aufruf von

var path = csscript.CSSEnvironment.ScriptFile;

hat immer den korrekten Pfad zur aktuellen Skriptdatei geliefert.

Weitere Aufrufe von csscript.CSSEnvironment.ScriptFile haben hingegen null bzw. eine leere Zeichenfolge zurückgegeben, mit dem Effekt, dass weiterführende Verarbeitungsschritte fehlgeschlagen sind, z.B. mit:

System.ArgumentException: Der Pfad hat ein ungültiges Format.

Die Ursache ist mir hier nicht genau bekannt.

Die triviale Lösung für mich sah dann so aus:

  1. Nur einmal auf die Eigenschaft `` zugreifen, indem sie in eine static-Variable meiner Klasse gespeichert wird.
  2. Weitere Zugriffe erfolgen ausschließlich auf diese static-Variable.

Z.B.:

// Einmalig auslesen:
private static string _scriptFile = csscript.CSSEnvironment.ScriptFile;

// Zugriff dann ausschließlich über r/o-Property:
private static string scriptFilePath { get { return _scriptFile; } }

Dann liefen meine Skripte alle korrekt durch, auch ohne CS-Script installiert zu haben.

Zum Thema „ScriptFile ist NULL“ habe ich hier heute eine interessante Antwort vom Autor erhalten.

Zusammengefasst sagt er:

Die sicherste Methode auf den Dateipfad der aktuellen Skriptdatei zu zugreifen ist

string scriptFile = System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttribute<System.Reflection.AssemblyDescriptionAttribute>().Description;

zu verwenden.

Er empfiehlt also, nicht seine eingebaute Property

csscript.CSSEnvironment.ScriptFile;

zu nehmen, sondern eben über die Assembly zu gehen.