Ошибка при добавлении аргументов в ProcessStartInfo.Arguments - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть функция, которая выдает мне аргументы в виде строки.

private string GetArguments()
        {
            var fullPath = Path.Combine(
                SharedState.GetValue<string>(ProScanService.INSTALLDIR),
                ProScanService.EXECUTABLENAME);

            var port = SharedState.GetValue<ushort>(ProScanService.PORT);

            var arguments = new StringBuilder();
            arguments.Append($" binPath= \"{fullPath}");
            arguments.Append($" --port={port}\" start= auto");

            return arguments.ToString();
        }

Это работает. Но если я добавлю аргумент "служба" в середине. Я получил сообщение об ошибке: ошибка == [SC] StartService: ошибка OpenService 1060

arguments.Append($" --port={port}\" service start= auto");

Аргументы используются для этой службы -> pro c .StartInfo.Arguments = $ "{request } \ "{name} \" {arguments} ";

public static QueryResult Query(string name, string request, string arguments)
        {
            var serviceControlPath = Path.GetFullPath(
                Environment.GetEnvironmentVariable("windir") + @"\system32\sc.exe");
            QueryResult result;
            var timeout = false;

            using (var proc = new Process())
            {
                try
                {
                    proc.StartInfo.FileName = serviceControlPath;
                    proc.StartInfo.Arguments = $"{request} \"{name}\" {arguments}";
                    proc.StartInfo.UseShellExecute = false;
                    proc.StartInfo.RedirectStandardError = true;
                    proc.StartInfo.RedirectStandardOutput = true;
                    proc.StartInfo.CreateNoWindow = true;
                    proc.Start();

                    timeout = !proc.WaitForExit(45000);
                }
                catch (Exception)
                {
                    // ignored
                }
                finally
                {
                    result = new QueryResult(
                        timeout,
                        proc.ExitCode,
                        proc.StandardError.ReadToEnd(),
                        proc.StandardOutput.ReadToEnd()
                        );
                }
            }

            if (timeout || result.ExitCode != 0)
            {
                if (result.ExitCode == 1060 && string.Compare(request, "query", 
                   StringComparison.OrdinalIgnoreCase) != 0)
                {
                    var msg = new StringBuilder();
                    msg.AppendLine($"error == {result.Error}");
                    msg.AppendLine($"output == {result.Output}");
                    throw new Exception(msg.ToString());
                }
            }

            return result;
        }

Как должны быть приведены эти аргументы?

...