diff --git a/src/ArgumentBuilder.cs b/src/ArgumentBuilder.cs
index 75bf927..01390b4 100644
--- a/src/ArgumentBuilder.cs
+++ b/src/ArgumentBuilder.cs
@@ -50,6 +50,35 @@ public static string EscapeAndConcatenateCommandAndArgArrayForProcessStart(
         return sb.ToString();
     }
 
+    /// 
+    /// Undo the processing which took place to create string[] args in Main, so that the next process will receive the same string[] args.
+    /// 
+    /// 
+    /// Note that pwsh does not require any special escaping of arguments. We can simply concatenate the list of strings with a space between each.
+    /// 
+    /// The base command.
+    /// List of arguments to escape.
+    /// An escaped string of the  and .
+    public static string ConcatenateCommandAndArgArrayForPwshProcessStart(
+        string? command,
+        string[]? args)
+    {
+        var sb = new ValueStringBuilder(stackalloc char[256]);
+
+        sb.Append(command);
+
+        if (args is not null)
+        {
+            for (var i = 0; i < args.Length; i++)
+            {
+                sb.Append(Space);
+                sb.Append(args[i]);
+            }
+        }
+
+        return sb.ToString();
+    }
+
     /// 
     /// Undo the processing which took place to create string[] args in Main, so that the next process will receive the same string[] args.
     /// 
diff --git a/src/CommandRunner.cs b/src/CommandRunner.cs
index 965c3bd..07e752d 100644
--- a/src/CommandRunner.cs
+++ b/src/CommandRunner.cs
@@ -56,6 +56,11 @@ public async Task RunAsync(string name, string cmd, string[]? args)
                     ArgumentBuilder.EscapeAndConcatenateCommandAndArgArrayForCmdProcessStart(cmd, args),
                     "\"");
             }
+            else if (_processContext.Shell.Equals("pwsh", StringComparison.OrdinalIgnoreCase))
+            {
+                process.StartInfo.ArgumentList.Add("-c");
+                process.StartInfo.ArgumentList.Add(ArgumentBuilder.ConcatenateCommandAndArgArrayForPwshProcessStart(cmd, args));
+            }
             else
             {
                 process.StartInfo.ArgumentList.Add("-c");
diff --git a/test/ArgumentBuilderTests.cs b/test/ArgumentBuilderTests.cs
index b95e3b7..5d9c6ce 100644
--- a/test/ArgumentBuilderTests.cs
+++ b/test/ArgumentBuilderTests.cs
@@ -27,6 +27,29 @@ public void EscapeAndConcatenateCommandAndArgArrayForProcessStart(string command
         result.ShouldBe(expected);
     }
 
+    [Theory]
+    [InlineData("pwsh", null, "pwsh")]
+    [InlineData("pws \"h\"", null, "pws \"h\"")]
+    [InlineData("p w s h", null, "p w s h")]
+    [InlineData("pwsh", new string[0], "pwsh")]
+    [InlineData("pwsh", new[] { "one", "two", "three" }, "pwsh one two three")]
+    [InlineData("pwsh", new[] { "line1\nline2", "word1\tword2" }, "pwsh line1\nline2 word1\tword2")]
+    [InlineData("pwsh", new[] { "with spaces" }, "pwsh with spaces")]
+    [InlineData("pwsh", new[] { @"with\backslash" }, @"pwsh with\backslash")]
+    [InlineData("pwsh", new[] { @"""quotedwith\backslash""" }, @"pwsh ""quotedwith\backslash""" )]
+    [InlineData("pwsh", new[] { @"C:\Users\" }, @"pwsh C:\Users\")]
+    [InlineData("pwsh", new[] { @"C:\Program Files\dotnet\" }, @"pwsh C:\Program Files\dotnet\")]
+    [InlineData("pwsh", new[] { @"backslash\""preceedingquote" }, @"pwsh backslash\""preceedingquote")]
+    [InlineData("pwsh", new[] { @""" hello """ }, @"pwsh "" hello """)]
+    public void ConcatenateCommandAndArgArrayForPwshProcessStart(string command, string[]? args, string expected)
+    {
+        // Given / When
+        var result = ArgumentBuilder.ConcatenateCommandAndArgArrayForPwshProcessStart(command, args);
+
+        // Then
+        result.ShouldBe(expected);
+    }
+
     [Theory]
     [InlineData("cmd", null, "cmd")]
     [InlineData("cm \"d\"", null, "cm \"d\"")]