You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从C#调用PowerShell脚本并传递字符串与列表类型参数

从C#调用PowerShell脚本并传递字符串和列表参数

没问题,我来帮你完善这段C#代码,实现向PowerShell脚本传递字符串和列表参数。咱们一步步来:

第一步:先准备好PowerShell脚本(接收参数)

首先你的PowerShell脚本call-from-c-sharp.ps1需要先定义好接收的参数,比如要接收一个字符串参数和一个列表参数,脚本内容可以这么写:

param(
    [string]$UserName,
    [string[]]$FavoriteFruits
)

# 处理参数示例
Write-Host "Hello, $UserName!"
Write-Host "Your favorite fruits are:"
foreach ($fruit in $FavoriteFruits) {
    Write-Host "- $fruit"
}

第二步:完善C#代码传递参数

接下来修改你提供的C#代码,核心是正确构造Arguments参数,注意PowerShell的参数传递语法,尤其是列表参数需要用逗号分隔,同时要处理好引号转义避免空格或特殊字符的问题:

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = @"powershell.exe";
        
        // 定义要传递的参数:字符串和列表
        string userName = "Vamsi Krishna";
        string[] favoriteFruits = new string[] { "Apple", "Banana", "Mango" };
        
        // 把列表转成PowerShell能识别的逗号分隔格式,注意每个元素加引号(防止有空格)
        string fruitsParam = string.Join(",", Array.ConvertAll(favoriteFruits, f => $"'{f}'"));
        
        // 构造完整的PowerShell命令:调用脚本+传递参数
        startInfo.Arguments = $@"& 'C:\powershell-scripts\call-from-c-sharp.ps1' -UserName '{userName}' -FavoriteFruits @({fruitsParam})";
        
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = true; // 这里设为true,不弹出PowerShell窗口

        using (Process process = Process.Start(startInfo))
        {
            // 读取输出和错误信息
            string output = process.StandardOutput.ReadToEnd();
            string error = process.StandardError.ReadToEnd();
            
            process.WaitForExit();

            // 打印结果
            Console.WriteLine("输出结果:");
            Console.WriteLine(output);
            
            if (!string.IsNullOrEmpty(error))
            {
                Console.WriteLine("错误信息:");
                Console.WriteLine(error);
            }
        }
    }
}

关键细节说明

  • 字符串参数:如果参数值包含空格或特殊字符,一定要用单引号包裹,避免PowerShell解析出错。
  • 列表参数:在PowerShell里要使用@(...)的语法来传递数组/列表,里面的元素用逗号分隔,每个元素同样用单引号包裹(如果有空格的话)。
  • 转义问题:C#里的$@是逐字字符串插值,能避免很多转义麻烦,很适合构造PowerShell命令。
  • 输出读取:记得要读取StandardOutput和StandardError,不然可能会导致进程挂起,因为缓冲区满了。

内容的提问来源于stack exchange,提问作者Vamsi Krishna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:20:43