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:
- Nur einmal auf die Eigenschaft `` zugreifen, indem sie in eine
static
-Variable meiner Klasse gespeichert wird.
- 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.