如何在 C# 中向 powershellinstance 添加参数

Posted

技术标签:

【中文标题】如何在 C# 中向 powershellinstance 添加参数【英文标题】:How to add Arguments to powershellinstance in C# 【发布时间】:2020-08-13 06:06:32 【问题描述】:

我有一个 powershell 脚本,我需要使用 c# 来执行它

string psData = System.IO.File.ReadAllText(@"C:\Users\m\Desktop\power.ps1");
        using (PowerShell PowerShellInstance = PowerShell.Create())
        
            PowerShellInstance.AddScript(psData);

            IAsyncResult result = PowerShellInstance.BeginInvoke();
            while (!result.IsCompleted)
            
                Logger.Info("Wait initiated");
                Thread.Sleep(5000);
            
            Logger.Info("Execution completed");
        

使用上面的代码脚本正在执行,但我如何将参数传递给 shell 脚本

我已更改代码

string psData = System.IO.File.ReadAllText(@"C:\Users\m\Desktop\power.ps1");
        Process pr = new Process();
        var processStartInfo = new ProcessStartInfo()
        
            FileName = "powershell.exe",
            Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \""+psData+"\" \"arg1\" \"arg2\"",
            UseShellExecute = false
        ;
        pr.StartInfo = processStartInfo;
        pr.Start();
        pr.WaitForExit();

【问题讨论】:

您是否尝试过使用documentation 中描述的AddArgumentAddParameter 方法? @fedrik 我可以将我的所有参数作为一个字符串传递给一个 .AddArgument() 吗?似乎所有参数我都需要单独添加它们 如果文档中没有,没有。 试过这个吗? ***.com/questions/57646703/… 【参考方案1】:

使用 AddArgument 方法。 更多信息 -> https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.powershell.addargument?view=pscore-6.2.0 -------- 旧答案----- 不确定如何通过 PowerShellInstance 类执行此操作,但您可以使用 Process 类调用带参数的 PowerShell 脚本。

var file = @"C:\<Directory>\GetServices.ps1";
var processStartInfo = new ProcessStartInfo()

    FileName = "powershell.exe",
    Arguments = $"-NoProfile -ExecutionPolicy unrestricted \"ps1File\"",
    UseShellExecute = false
;
Process.Start(startInfo);

更多信息 -> https://duanenewman.net/blog/post/running-powershell-scripts-from-csharp/ 编辑 2

  string psData = @"C:\Users\manis\Desktop\test.ps1";
    Process pr = new Process();
    var processStartInfo = new ProcessStartInfo()
    
        FileName = "powershell.exe",
        Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file psData hello",
        UseShellExecute = false
    ;
    pr.StartInfo = processStartInfo;
    pr.Start();
    pr.WaitForExit();

我的 Powershell 脚本如下所示

param ($param1)
write-host $param1 

【讨论】:

如何使用此方法传递参数 和你在PowerShell中运行的一样,示例命令-param1 value,在这种情况下,它就像参数属性中的-Param1 value1 - Param2 value2,都在字符串@Iceberg Arguments = $"-NoProfile -ExecutionPolicy unrestricted \"ps1File\" arg1 arg2", 这不起作用 在这个例子中,-NoProfile 和 ExecutionPolicy 是参数,你可以删除它们,然后添加你的参数,确保你的脚本在 power shell 中正确运行 powershell.exe -NoProfile -ExecutionPolicy unrestricted -file "C:\Users\m\Desktop\power.ps1" "arg1" "arg2" 此代码在 cmd 中工作。但是当我在 c# 中的参数中传递相同的代码时,它不起作用

以上是关于如何在 C# 中向 powershellinstance 添加参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Selenium 中向 FirefoxDriverService 添加配置文件规范?

如何在 C# 中向 iOS 发送 FCM 通知 [关闭]

在 C# 中向银行账户添加利率

如何使用 Gmail 的 SMTP 客户端在 C# 中向自己发送电子邮件,而无需在 Gmail 设置中启用安全性较低的应用程序的访问权限?

如何在托管 c++ 2010 中向事件添加委托?

在 C# 中向 JObject 添加匿名或对象属性