如何从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
相关产品推荐
相关产品推荐

