-
Notifications
You must be signed in to change notification settings - Fork 7
/
ProcessUtil.cs
123 lines (107 loc) · 3.97 KB
/
ProcessUtil.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/////////////////////////////////////////////////////////////////////////////////
// paint.net //
// Copyright (C) dotPDN LLC, Rick Brewster, and contributors. //
// All Rights Reserved. //
/////////////////////////////////////////////////////////////////////////////////
using PaintDotNet;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
namespace PdnCodeLab
{
public static class ProcessUtil
{
public static int TryExec(string fileName, string commandLine)
{
Console.WriteLine($"Execute: '{fileName}' '{commandLine}'");
ProcessStartInfo startInfo = new ProcessStartInfo(fileName, commandLine);
startInfo.UseShellExecute = !Path.IsPathFullyQualified(fileName) || !Path.GetExtension(fileName).Equals(".exe", StringComparison.OrdinalIgnoreCase);
using Process process = Process.Start(startInfo)!;
process.WaitForExit();
return process.ExitCode;
}
public static void Exec(string fileName, string commandLine)
{
int exitCode = TryExec(fileName, commandLine);
if (exitCode != 0)
{
throw new ApplicationException($"'{fileName}' returned {exitCode}. Command line: {commandLine}");
}
}
public static void Exec(string fileName, IEnumerable<string> args)
{
int exitCode = TryExec(fileName, args);
if (exitCode != 0)
{
string commandLine = ConvertArgsToCommandLine(args);
throw new ApplicationException($"'{fileName}' returned {exitCode}. Command line: {commandLine}");
}
}
public static void Exec(string fileName, params string[] args)
{
Exec(fileName, (IEnumerable<string>)args);
}
public static int TryExec(string fileName, IEnumerable<string> args)
{
string commandLine = ConvertArgsToCommandLine(args);
return TryExec(fileName, commandLine);
}
public static int TryExec(string fileName, params string[] args)
{
return TryExec(fileName, (IEnumerable<string>)args);
}
private static string ConvertArgsToCommandLine(IEnumerable<string> args)
{
string[] escapifiedArgs = EscapifyArgs(args).ToArray();
string commandLine = escapifiedArgs.Join(" ");
return commandLine;
}
private static IEnumerable<string> EscapifyArgs(IEnumerable<string> args)
{
foreach (string arg in args)
{
yield return EscapifyArg(arg);
}
}
private static string EscapifyArg(string arg)
{
StringBuilder resultBuilder = new StringBuilder();
bool quotes = false;
for (int i = 0; i < arg.Length; ++i)
{
if (char.IsWhiteSpace(arg[i]))
{
quotes = true;
break;
}
}
if (quotes)
{
resultBuilder.Append('\"');
}
for (int i = 0; i < arg.Length; ++i)
{
char c = arg[i];
if (c == '\"')
{
// double-quotes
resultBuilder.Append('\"');
}
else if (quotes && c == '\\' && i == arg.Length - 1)
{
// make sure backslash at end doesn't escapify the ending quote
resultBuilder.Append('\\');
}
resultBuilder.Append(c);
}
if (quotes)
{
resultBuilder.Append('\"');
}
return resultBuilder.ToString();
}
}
}