private static string InsertVariablesAndEscapedCharacters(string line) { string result = ""; bool doubleQuotationMarkZone = false; bool singleQuotationMarkZone = false; bool shielding = false; bool variableNameStarted = false; string currentVariableName = ""; string currentArg = ""; for (int i = 0; i < line.Length; i++) { if (!shielding) { if (variableNameStarted && !ValidСharacters.Contains(line[i])) { var variableValue = Runtime.GetVariable(currentVariableName); if (variableValue != null) { currentArg += variableValue; } variableNameStarted = false; currentVariableName = ""; } if (line[i] == '\'') { if (!doubleQuotationMarkZone) { singleQuotationMarkZone = !singleQuotationMarkZone; } currentArg += line[i]; } else if (line[i] == '\"') { if (!singleQuotationMarkZone) { doubleQuotationMarkZone = !doubleQuotationMarkZone; } currentArg += line[i]; } else if (line[i] == '$') { if (singleQuotationMarkZone) { currentArg += line[i]; } else { variableNameStarted = true; } } else if (line[i] == ' ') { if (!singleQuotationMarkZone && !doubleQuotationMarkZone) { result += currentArg + " "; currentArg = ""; } else { currentArg += " "; } } else if (line[i] == '\u005C') { if (singleQuotationMarkZone) { currentArg += "\u005C"; } else { shielding = true; } } else if (ValidСharacters.Contains(line[i])) { if (variableNameStarted) { currentVariableName += line[i]; } else { currentArg += line[i]; } } else { currentArg += line[i]; } } else { if (line[i] == ' ') { currentArg += "\" \""; } else { currentArg += line[i]; } shielding = false; } } if (variableNameStarted) { var variableValue = Runtime.GetVariable(currentVariableName); if (variableValue != null) { currentArg += variableValue; } } if (currentArg.Length != 0) { result += currentArg; } return(result); }
public static List <string>?ParseArguments(string argumentsLine, bool insertVariablesAndEscapedCharacters = false) { if (insertVariablesAndEscapedCharacters) { argumentsLine = InsertVariablesAndEscapedCharacters(argumentsLine); } var arguments = new List <string>(); bool doubleQuotationMarkZone = false; bool singleQuotationMarkZone = false; string currentArg = ""; for (int i = 0; i < argumentsLine.Length; i++) { if (argumentsLine[i] == '\'') { if (doubleQuotationMarkZone) { currentArg += "\'"; } else { singleQuotationMarkZone = !singleQuotationMarkZone; } } else if (argumentsLine[i] == '\"') { if (singleQuotationMarkZone) { currentArg += "\""; } else { doubleQuotationMarkZone = !doubleQuotationMarkZone; } } else if (argumentsLine[i] == ' ') { if (!singleQuotationMarkZone && !doubleQuotationMarkZone) { arguments.Add(currentArg); currentArg = ""; } else { currentArg += " "; } } else if (ValidСharacters.Contains(argumentsLine[i]) || SpecialСharacters.Contains(argumentsLine[i])) { currentArg += argumentsLine[i]; } else { return(null); } } if (currentArg.Length != 0) { if (!singleQuotationMarkZone && !doubleQuotationMarkZone) { arguments.Add(currentArg); } else { return(null); } } return(arguments); }