/// <summary> /// Called when a response file switch is detected on the command line. It loads the specified response file, and parses /// each line in it like a command line. It also prevents multiple (or recursive) inclusions of the same response file. /// </summary> /// <param name="unquotedCommandLineArg"></param> /// <param name="commandLineSwitches"></param> private static void GatherResponseFileSwitch(string unquotedCommandLineArg, CommandLineSwitches commandLineSwitches) { try { string responseFile = unquotedCommandLineArg.Substring(1); if (responseFile.Length == 0) { commandLineSwitches.SetSwitchError("MissingResponseFileError", unquotedCommandLineArg); } else if (!File.Exists(responseFile)) { commandLineSwitches.SetParameterError("ResponseFileNotFoundError", unquotedCommandLineArg); } else { // normalize the response file path to help catch multiple (or recursive) inclusions responseFile = Path.GetFullPath(responseFile); // NOTE: for network paths or mapped paths, normalization is not guaranteed to work bool isRepeatedResponseFile = false; foreach (string includedResponseFile in s_includedResponseFiles) { if (String.Compare(responseFile, includedResponseFile, StringComparison.OrdinalIgnoreCase) == 0) { commandLineSwitches.SetParameterError("RepeatedResponseFileError", unquotedCommandLineArg); isRepeatedResponseFile = true; break; } } if (!isRepeatedResponseFile) { s_includedResponseFiles.Add(responseFile); ArrayList argsFromResponseFile; using (StreamReader responseFileContents = new StreamReader(responseFile, Encoding.Default)) // HIGHCHAR: If response files have no byte-order marks, then assume ANSI rather than ASCII. { argsFromResponseFile = new ArrayList(); while (responseFileContents.Peek() != -1) { // ignore leading whitespace on each line string responseFileLine = responseFileContents.ReadLine().TrimStart(); // skip comment lines beginning with # if (!responseFileLine.StartsWith("#", StringComparison.Ordinal)) { // treat each line of the response file like a command line i.e. args separated by whitespace argsFromResponseFile.AddRange(QuotingUtilities.SplitUnquoted(Environment.ExpandEnvironmentVariables(responseFileLine))); } } } GatherCommandLineSwitches(argsFromResponseFile, commandLineSwitches); } } } catch (NotSupportedException e) { commandLineSwitches.SetParameterError("ReadResponseFileError", unquotedCommandLineArg, e); } catch (SecurityException e) { commandLineSwitches.SetParameterError("ReadResponseFileError", unquotedCommandLineArg, e); } catch (UnauthorizedAccessException e) { commandLineSwitches.SetParameterError("ReadResponseFileError", unquotedCommandLineArg, e); } catch (IOException e) { commandLineSwitches.SetParameterError("ReadResponseFileError", unquotedCommandLineArg, e); } }