From 88a186f20b0c55420b2d14e33fe73f14286cd373 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 28 Mar 2016 16:47:26 -0700 Subject: [PATCH 1/8] Extract common argument logic --- Common/Product/SharedProject/ProcessOutput.cs | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 2d5cd7e7c..797ee5b02 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -189,12 +189,7 @@ public static ProcessOutput Run( } var psi = new ProcessStartInfo(filename); - if (quoteArgs) { - psi.Arguments = string.Join(" ", - arguments.Where(a => a != null).Select(QuoteSingleArgument)); - } else { - psi.Arguments = string.Join(" ", arguments.Where(a => a != null)); - } + psi.Arguments = GetArguments(arguments, quoteArgs); psi.WorkingDirectory = workingDirectory; psi.CreateNoWindow = !visible; psi.UseShellExecute = false; @@ -243,15 +238,9 @@ public static ProcessOutput RunElevated( psi.UseShellExecute = true; psi.Verb = "runas"; - string args; - if (quoteArgs) { - args = string.Join(" ", arguments.Where(a => a != null).Select(QuoteSingleArgument)); - } else { - args = string.Join(" ", arguments.Where(a => a != null)); - } psi.Arguments = string.Format("/S /C \"{0} {1} >>{2} 2>>{3}\"", QuoteSingleArgument(filename), - args, + GetArguments(arguments, quoteArgs), QuoteSingleArgument(outFile), QuoteSingleArgument(errFile) ); @@ -316,6 +305,14 @@ public static ProcessOutput RunElevated( return result; } + private static string GetArguments(IEnumerable arguments, bool quoteArgs) { + if (quoteArgs) { + return string.Join(" ", arguments.Where(a => a != null).Select(QuoteSingleArgument)); + } else { + return string.Join(" ", arguments.Where(a => a != null)); + } + } + internal static IEnumerable SplitLines(string source) { int start = 0; int end = source.IndexOfAny(EolChars); From 361ccb14d44347aefe58d54ce6ddde479a60a6a1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 28 Mar 2016 17:20:48 -0700 Subject: [PATCH 2/8] Fix ProcessOutput not supporting unc paths closes #755 --- Common/Product/SharedProject/ProcessOutput.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 797ee5b02..74629c7d6 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -184,13 +184,14 @@ public static ProcessOutput Run( redirector, quoteArgs, outputEncoding, - errorEncoding - ); + errorEncoding); } - var psi = new ProcessStartInfo(filename); - psi.Arguments = GetArguments(arguments, quoteArgs); - psi.WorkingDirectory = workingDirectory; + var psi = new ProcessStartInfo("cmd.exe"); + psi.Arguments = string.Format(@"/S /C pushd ""{0}"" & ""{1}"" {2}", + workingDirectory, + filename, + GetArguments(arguments, quoteArgs)); psi.CreateNoWindow = !visible; psi.UseShellExecute = false; psi.RedirectStandardError = !visible || (redirector != null); @@ -238,13 +239,12 @@ public static ProcessOutput RunElevated( psi.UseShellExecute = true; psi.Verb = "runas"; - psi.Arguments = string.Format("/S /C \"{0} {1} >>{2} 2>>{3}\"", + psi.Arguments = string.Format(@"/S /C pushd ""{0}"" & """"{1}"" {2} >>{3} 2>>{4}""", + workingDirectory, QuoteSingleArgument(filename), GetArguments(arguments, quoteArgs), QuoteSingleArgument(outFile), - QuoteSingleArgument(errFile) - ); - psi.WorkingDirectory = workingDirectory; + QuoteSingleArgument(errFile)); psi.CreateNoWindow = true; psi.UseShellExecute = true; From a259cdc7337338fff78283b112e791dec0267d49 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 28 Mar 2016 17:24:12 -0700 Subject: [PATCH 3/8] small cleanup --- Common/Product/SharedProject/ProcessOutput.cs | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 74629c7d6..9c5f5eb2a 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -187,16 +187,17 @@ public static ProcessOutput Run( errorEncoding); } - var psi = new ProcessStartInfo("cmd.exe"); - psi.Arguments = string.Format(@"/S /C pushd ""{0}"" & ""{1}"" {2}", - workingDirectory, - filename, - GetArguments(arguments, quoteArgs)); - psi.CreateNoWindow = !visible; - psi.UseShellExecute = false; - psi.RedirectStandardError = !visible || (redirector != null); - psi.RedirectStandardOutput = !visible || (redirector != null); - psi.RedirectStandardInput = !visible; + var psi = new ProcessStartInfo("cmd.exe") { + Arguments = string.Format(@"/S /C pushd ""{0}"" & ""{1}"" {2}", + workingDirectory, + filename, + GetArguments(arguments, quoteArgs)), + CreateNoWindow = !visible, + UseShellExecute = false, + RedirectStandardError = !visible || (redirector != null), + RedirectStandardOutput = !visible || (redirector != null), + RedirectStandardInput = !visible + }; psi.StandardOutputEncoding = outputEncoding ?? psi.StandardOutputEncoding; psi.StandardErrorEncoding = errorEncoding ?? outputEncoding ?? psi.StandardErrorEncoding; if (env != null) { @@ -233,20 +234,18 @@ public static ProcessOutput RunElevated( ) { var outFile = Path.GetTempFileName(); var errFile = Path.GetTempFileName(); - var psi = new ProcessStartInfo("cmd.exe"); - psi.CreateNoWindow = true; - psi.WindowStyle = ProcessWindowStyle.Hidden; - psi.UseShellExecute = true; - psi.Verb = "runas"; - - psi.Arguments = string.Format(@"/S /C pushd ""{0}"" & """"{1}"" {2} >>{3} 2>>{4}""", + var psi = new ProcessStartInfo("cmd.exe") { + WindowStyle = ProcessWindowStyle.Hidden, + Verb = "runas", + CreateNoWindow = true, + UseShellExecute = true, + Arguments = string.Format(@"/S /C pushd ""{0}"" & """"{1}"" {2} >>{3} 2>>{4}""", workingDirectory, QuoteSingleArgument(filename), GetArguments(arguments, quoteArgs), QuoteSingleArgument(outFile), - QuoteSingleArgument(errFile)); - psi.CreateNoWindow = true; - psi.UseShellExecute = true; + QuoteSingleArgument(errFile)) + }; var process = new Process(); process.StartInfo = psi; From 03411a27eea9798b70987787ba843308b53c10c7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 28 Mar 2016 17:25:50 -0700 Subject: [PATCH 4/8] Use QuoteSingleArgument --- Common/Product/SharedProject/ProcessOutput.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 9c5f5eb2a..287394943 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -188,9 +188,9 @@ public static ProcessOutput Run( } var psi = new ProcessStartInfo("cmd.exe") { - Arguments = string.Format(@"/S /C pushd ""{0}"" & ""{1}"" {2}", - workingDirectory, - filename, + Arguments = string.Format(@"/S /C pushd {0} & {1} {2}", + QuoteSingleArgument(workingDirectory), + QuoteSingleArgument(filename), GetArguments(arguments, quoteArgs)), CreateNoWindow = !visible, UseShellExecute = false, @@ -239,7 +239,7 @@ public static ProcessOutput RunElevated( Verb = "runas", CreateNoWindow = true, UseShellExecute = true, - Arguments = string.Format(@"/S /C pushd ""{0}"" & """"{1}"" {2} >>{3} 2>>{4}""", + Arguments = string.Format(@"/S /C pushd ""{0}"" & ""{1} {2} >>{3} 2>>{4}""", workingDirectory, QuoteSingleArgument(filename), GetArguments(arguments, quoteArgs), From c6e0259d6768d951bd2d096cf02dbfd61f889d20 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 28 Mar 2016 17:32:27 -0700 Subject: [PATCH 5/8] Use QuoteSingleArgument for working direcotry --- Common/Product/SharedProject/ProcessOutput.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 287394943..1e9694162 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -239,8 +239,8 @@ public static ProcessOutput RunElevated( Verb = "runas", CreateNoWindow = true, UseShellExecute = true, - Arguments = string.Format(@"/S /C pushd ""{0}"" & ""{1} {2} >>{3} 2>>{4}""", - workingDirectory, + Arguments = string.Format(@"/S /C pushd {0} & ""{1} {2} >>{3} 2>>{4}""", + QuoteSingleArgument(workingDirectory), QuoteSingleArgument(filename), GetArguments(arguments, quoteArgs), QuoteSingleArgument(outFile), From 7d1af57999eecb92bbc9982c089c102830487aab Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 28 Mar 2016 17:33:07 -0700 Subject: [PATCH 6/8] Fix indent --- Common/Product/SharedProject/ProcessOutput.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 1e9694162..884b5c5e9 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -240,11 +240,11 @@ public static ProcessOutput RunElevated( CreateNoWindow = true, UseShellExecute = true, Arguments = string.Format(@"/S /C pushd {0} & ""{1} {2} >>{3} 2>>{4}""", - QuoteSingleArgument(workingDirectory), - QuoteSingleArgument(filename), - GetArguments(arguments, quoteArgs), - QuoteSingleArgument(outFile), - QuoteSingleArgument(errFile)) + QuoteSingleArgument(workingDirectory), + QuoteSingleArgument(filename), + GetArguments(arguments, quoteArgs), + QuoteSingleArgument(outFile), + QuoteSingleArgument(errFile)) }; var process = new Process(); From 36dcb999ed9d4e059ef92be7d1fdf3e7b3a4d074 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 May 2016 14:33:13 -0700 Subject: [PATCH 7/8] SEt UseShellExecute to true for consistency --- Common/Product/SharedProject/ProcessOutput.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 884b5c5e9..760e8ef2f 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -193,7 +193,7 @@ public static ProcessOutput Run( QuoteSingleArgument(filename), GetArguments(arguments, quoteArgs)), CreateNoWindow = !visible, - UseShellExecute = false, + UseShellExecute = true, RedirectStandardError = !visible || (redirector != null), RedirectStandardOutput = !visible || (redirector != null), RedirectStandardInput = !visible From 2d627555b98283bb4189c607792ac52f623a2966 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 May 2016 14:57:33 -0700 Subject: [PATCH 8/8] Revert setting useshell execute to false --- Common/Product/SharedProject/ProcessOutput.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Product/SharedProject/ProcessOutput.cs b/Common/Product/SharedProject/ProcessOutput.cs index 760e8ef2f..884b5c5e9 100644 --- a/Common/Product/SharedProject/ProcessOutput.cs +++ b/Common/Product/SharedProject/ProcessOutput.cs @@ -193,7 +193,7 @@ public static ProcessOutput Run( QuoteSingleArgument(filename), GetArguments(arguments, quoteArgs)), CreateNoWindow = !visible, - UseShellExecute = true, + UseShellExecute = false, RedirectStandardError = !visible || (redirector != null), RedirectStandardOutput = !visible || (redirector != null), RedirectStandardInput = !visible