using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test_EnvSetzen
{
class ReplaceVariable
{
///
/// Replaces variables in a string with values.
/// If a variable is not found, an exception is thrown
///
public ReplaceVariable()
{
}
///
/// Replaces all variables in the transferred string with values.
/// Variable names are not case sensitive.
/// Locally defined variables take precedence over environment variables.
///
/// Text with variables. Variables must have DOS or Unix format. E.g.: %dos% or ${unix}
///
public string ExtractVariable(string text)
{
string startSign = "";
string endSign = "";
string newText = "";
//Wenn im Text eine bekannte Variable enthalten ist, dann gegen den aktuellen Wert tauschen
if (!string.IsNullOrEmpty(text))
{
while (text.Contains("%") || text.Contains("{"))
{
if (text.Contains("%"))
{
startSign = "%";
endSign = "%";
}
else
{
startSign = "${";
endSign = "}";
}
newText = ReplaceVariableThroughText(text, startSign, endSign); //ENV-Variablen extrahieren
//Abbrechen wenn die Umgebungsvariable nicht gefunden wurde
if (String.IsNullOrEmpty(newText))
{
text = "";
break;
}
else
{
text = newText;
}
}
}
return text;
}
private string ReplaceVariableThroughText(string text, string startSign, string endSign)
{
string textTemp = "";
string textAnfang = "";
string textEnde = "";
string variableName = "";
string variableValue = "";
//'Textanfang' extrahieren
textAnfang = text.Remove(text.IndexOf(startSign));
textTemp = text.Remove(0, text.IndexOf(startSign));
//Variable extrahieren
variableName = textTemp.Remove(0, textTemp.IndexOf(startSign) + startSign.Length); //'startSign' entfernen
variableName = variableName.Remove(variableName.IndexOf(endSign)); //'endSign' und nachfolgenden Text entfernen
//Textende extrahieren
textEnde = textTemp.Remove(0, startSign.Length); //'startSign' entfernen
textEnde = textEnde.Remove(0, textEnde.IndexOf(endSign) + 1); //Alle Zeichen bis zum 'endSign' entfernen
//Variable umwandeln und Text wieder zusammenbauen
variableValue = ConvertVariableToString(variableName);
if (String.IsNullOrEmpty(variableValue))
{
text = ""; //Wenn die Variable nicht konvertiert werden konnte, dann einen leeren Text zurückgeben
// throw new VariableValueNotFoundException(variableName); //Wird diese Zeile auskommentiert, dann wird ein leerer Text zurückgegeben
}
else
{
text = String.Concat(textAnfang, variableValue, textEnde); //Text zusammensetzen
}
return text;
}
private string ConvertVariableToString(string variableName)
{
string variableValue = "";
bool localVariableExist = false;
//Sind lokale Variablen definiert, dann zuerst diese durchsuchen
if (variables != null)
{
foreach (var varName in variables)
{
if (varName.VariableName.ToUpper() == variableName.ToUpper())
{
variableValue = varName.VariableValue;
localVariableExist = true;
break; //Wurde eine Entsprechung gefunden, dann nicht mehr weitersuchen
}
}
}
//Wurde in den lokalen Variablen nichts gefunden, dann die Umgebungsvariablen durchsuchen
if (!localVariableExist)
{
if (!localVariableExist & Environment.GetEnvironmentVariable(variableName) != null)
{
variableValue = Environment.GetEnvironmentVariable(variableName); //Wert aus Umgebungsvariable holen
}
else
{
variableValue = ""; //Wenn es keine passende Variable gibt, dann einen leeren Wert übergeben
}
}
return variableValue;
}
Variable variable = new Variable();
static List variables = new List();
///
/// Adds a local defined variable to the variable list.
///
/// A valid variable Name.
/// A valid variable value.
public void Add(string variableName, string variableValue)
{
Variable tempVariable = new Variable();
tempVariable.VariableName = variableName;
tempVariable.VariableValue = variableValue;
variables.Add(tempVariable);
}
///
/// Removes the first variable found with the specified name from the list.
/// The variable name is not case sensitive.
///
/// A valid variable Name.
public void Remove(string variableName)
{
foreach (var varName in variables)
{
if (varName.VariableName.ToUpper() == variableName.ToUpper())
{
variables.Remove(varName);
break;
}
}
}
///
/// Empty the complete variable list.
///
public void Clear()
{
variables.Clear();
}
}
#region Exception
public class VariableValueNotFoundException : ApplicationException
{
public VariableValueNotFoundException()
{ }
public VariableValueNotFoundException(string message) : base(message)
{ }
public VariableValueNotFoundException(string message, Exception inner) : base(message, inner)
{ }
}
#endregion
}