如何使用 C# 执行 PowerShell 脚本

Posted

技术标签:

【中文标题】如何使用 C# 执行 PowerShell 脚本【英文标题】:How to execute a PowerShell script using c# 【发布时间】:2020-08-12 14:55:55 【问题描述】:

我需要使用 c# 执行一个 PowerShell 脚本

ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = @"cmd.exe";
            startInfo.Arguments = @"powershell -File ""C:\Users\user1\Desktop\power.ps1""";
            startInfo.Verb = "runas";
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;
            Process process = new Process();
            process.StartInfo = startInfo;
            process.Start();
            process.WaitForExit();

这不起作用。有人能帮我吗? 我有一个 PowerShell 脚本文件,有时它会有要传递的参数

【问题讨论】:

你遇到了什么错误? @LinkedListT 没有任何回报。进程卡在 waitforexit() 代码中 尝试这样的事情:***.com/q/43855697/9936356 您正在编写无效代码。要使用runas 的动词,必须将UseShellExecute 设置为true。那么你究竟想以管理员身份运行什么? @LexLi 如果我删除它,我可以像这样运行 .ps1 文件吗?我不知道如何执行 .ps1 文件 【参考方案1】:

这里的答案都没有帮助我,但这个答案确实帮助了我,并且取自这篇博文,因此感谢作者。

https://duanenewman.net/blog/post/running-powershell-scripts-from-csharp/

以下是您在 Visual Studio 中创建一个可以绕过任何限制的控制台应用程序时运行 PowerShell 脚本的完整代码。

只需在下面将 ps1File 变量更改为您的需要。

using System;
using System.Diagnostics;

namespace ConsoleApp

    class Program
    
        static void Main(string[] args)
        

            InstallViaPowerShell();
        

       public static void InstallViaPowerShell()
        

            var ps1File = @"C:\Users\stevehero\source\repos\RGB Animated Cursors PowerShell\RGB Animated Cursors\install-scheme.ps1";

            var startInfo = new ProcessStartInfo()
            
                FileName = "powershell.exe",
                Arguments = $"-NoProfile -ExecutionPolicy ByPass -File \"ps1File\"",
                UseShellExecute = false
            ;
            Process.Start(startInfo);

        
    


【讨论】:

【参考方案2】:

从 C# 运行 .ps1 是很常见的事情,with many examples all over the web 和 Youtube 上的视频展示了如何/带有示例。

Call a Powershell script from c# code

public static int RunPowershellScript(string ps)

int errorLevel;
ProcessStartInfo processInfo;
Process process;

processInfo = new ProcessStartInfo("powershell.exe", "-File " + ps);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;

process = Process.Start(processInfo);
process.WaitForExit();

errorLevel = process.ExitCode;
process.Close();

return errorLevel;

以及查看这些 ***threads。

To call a PowerShell script file (example.ps1) from C#

When do we need to set UseShellExecute to True?

【讨论】:

我试过了,但没有得到预期的输出。我的 shell 脚本包含用于创建文件夹的代码。进程执行,退出代码为 1。但未创建文件夹。 @ljas,您需要提升访问权限。尝试 processInfo.Verb = "runas"。此外,还有一个问题,您运行的脚本有环境行 \n\r 在 powershell 中读取方式不正确......关于如何使 powershell 将它们作为新参数读取的任何想法? @postanote,只有当您不需要提升访问权限时,网络上许多示例的链接才有效。我已经看了一遍,到目前为止,以管理员身份有效运行 powershell 的唯一方法是运行上面的代码,并使用动词“runas”。唯一的问题是这样只会采用一个参数。

以上是关于如何使用 C# 执行 PowerShell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中执行 PowerShell 脚本时调用响应为空

如何从 C# 程序运行 PowerShell 脚本?

如何使用 C# 将 powershell 脚本编码为 base64 UTF16-LE 字符串

如何从 C# 中的 powershell 脚本中捕获退出代码

通过 C# 代码执行 Powershell 命令

将外部 C# 脚本作为源添加到 PowerShell 脚本