从C#代码执行带参数的PowerShell脚本时参数传递异常
问题
尝试从C#程序中执行PowerShell脚本,但IPAddress参数无法正常传递。移除该参数后脚本可正常运行,请问哪里操作有误?
相关代码
private async void RunningGst() { byte[] scriptBytes = Manip2Cards.Properties.Resources.run_gst; string script = System.Text.Encoding.UTF8.GetString(scriptBytes); await Task.Run(() => { ProcessStartInfo psi = new ProcessStartInfo { FileName = "powershell.exe", Arguments = $"-ExecutionPolicy Bypass -Command \"{script}\" -IPAddress {IPAddress}", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; Process process = new Process { StartInfo = psi }; process.Start(); string output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); Console.WriteLine(output); }); }
问题原因与解决方法
核心问题
你当前的参数传递逻辑错误:-Command 后用双引号包裹了脚本内容,导致后续的 -IPAddress {IPAddress} 被识别为powershell.exe自身的参数,而非传递给目标脚本的参数,脚本自然接收不到该值。
修正方案
方案1:将参数纳入脚本执行块
把脚本和参数放在同一个执行块中,用 & { ... } 包裹脚本内容,确保参数被传递给脚本:
Arguments = $"-ExecutionPolicy Bypass -Command \"& {{ {script} }} -IPAddress '{IPAddress}'\""
& { ... }会将内部内容作为一个整体执行,后续的-IPAddress参数会被正确关联到脚本。- 用单引号包裹
{IPAddress},避免IP中的点号或特殊字符引发解析异常。
方案2:规范参数绑定(推荐)
如果你的PowerShell脚本开头定义了参数(比如 param([string]$IPAddress)),可以用参数绑定语法传递,避免字符串拼接风险:
// 需确保脚本开头有 param([string]$IPAddress) 定义 Arguments = $"-ExecutionPolicy Bypass -Command \"& {{ {script} }} -IPAddress `"{IPAddress}`"\""
这里用反引号转义双引号,保证参数值被PowerShell正确解析。
额外注意
- 先确认
IPAddress变量的有效值,避免为空或包含空格/特殊字符。 - 若脚本是外部文件而非嵌入资源,更推荐用
-File参数直接调用,语法更简洁不易出错:// 外部脚本文件的调用示例 Arguments = $"-ExecutionPolicy Bypass -File \"path/to/run_gst.ps1\" -IPAddress {IPAddress}"
内容的提问来源于stack exchange,提问作者Dean Haklai
相关产品推荐
相关产品推荐

