public static bool ParseArgs(string input, out CommandPart[] args)
		{
			string ignored;
			return Parse(input, out ignored, out args, false);
		}
		private static bool Parse(string input, out string command, out CommandPart[] args, bool parseCommand)
		{
			CommandParserPart currentPart = parseCommand ? CommandParserPart.CommandName : CommandParserPart.None;
			int startPosition = 0;
			int endPosition = 0;
			int inputLength = input.Length;
			bool isEscaped = false;
			List<CommandPart> argList = new List<CommandPart>();

			command = null;
			args = null;

			if (input == "")
				return false;

			while (endPosition < inputLength)
			{
				char currentChar = input[endPosition++];
				if (isEscaped)
					isEscaped = false;
				else if (currentChar == '\\')
					isEscaped = true;

				switch (currentPart)
				{
					case CommandParserPart.CommandName:
						if ((!isEscaped && currentChar == ' ') || endPosition >= inputLength)
						{
							int length = (currentChar == ' ' ? endPosition - 1 : endPosition) - startPosition;
							string temp = input.Substring(startPosition, length);
							if (temp == "")
								startPosition = endPosition;
							else
							{
								currentPart = CommandParserPart.None;
								command = temp;
								startPosition = endPosition;
							}
						}
						break;
					case CommandParserPart.None:
						if ((!isEscaped && currentChar == '\"'))
						{
							currentPart = CommandParserPart.DoubleQuotedParameter;
							startPosition = endPosition;
						}
						else if ((!isEscaped && currentChar == '\''))
						{
							currentPart = CommandParserPart.QuotedParameter;
							startPosition = endPosition;
						}
						else if ((!isEscaped && currentChar == ' ') || endPosition >= inputLength)
						{
							int length = (currentChar == ' ' ? endPosition - 1 : endPosition) - startPosition;
							string temp = input.Substring(startPosition, length);
							if (temp == "")
								startPosition = endPosition;
							else
							{
								currentPart = CommandParserPart.None;
								argList.Add(new CommandPart(temp, startPosition));
								startPosition = endPosition;
							}
						}
						break;
					case CommandParserPart.QuotedParameter:
						if ((!isEscaped && currentChar == '\''))
						{
							string temp = input.Substring(startPosition, endPosition - startPosition - 1);
							currentPart = CommandParserPart.None;
							argList.Add(new CommandPart(temp, startPosition));
							startPosition = endPosition;
						}
						else if (endPosition >= inputLength)
							return false;
						break;
					case CommandParserPart.DoubleQuotedParameter:
						if ((!isEscaped && currentChar == '\"'))
						{
							string temp = input.Substring(startPosition, endPosition - startPosition - 1);
							currentPart = CommandParserPart.None;
							argList.Add(new CommandPart(temp, startPosition));
							startPosition = endPosition;
						}
						else if (endPosition >= inputLength)
							return false;
						break;
				}
			}

			if (parseCommand && (command == null || command == ""))
				return false;

			args = argList.ToArray();
			return true;
		}
		public static bool Parse(string input, out string command, out CommandPart[] args)
		{
			return Parse(input, out command, out args, true);
		}