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

C# Windows应用调用PowerShell时如何正确传递布尔参数?

问题:从C#向PowerShell脚本传递布尔参数失败

原本用于调用PowerShell脚本的C# Windows启动应用运行正常,但添加一个非必填布尔参数后,无论传递布尔值、$True/$true字符串还是整数1,调用都无法正常工作。

原有正常代码

var ps1File = @"DBScripter.ps1";
var ticketname = this.txtTicketName.Text;
var startInfo = new ProcessStartInfo()
{
    FileName = "powershell.exe",
    Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{ps1File}\" -TicketName \"{ticketname}\"",
    UseShellExecute = false
};
Process.Start(startInfo);

添加布尔参数后的异常代码

var ps1File = @"DBScripter.ps1";
var ticketname = this.txtTicketName.Text;
bool release = true;
var startInfo = new ProcessStartInfo()
{
    FileName = "powershell.exe",
    Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{ps1File}\" -TicketName \"{ticketname}\" -IsProdRelease \"{release}\"",
    UseShellExecute = false
};
Process.Start(startInfo);

PowerShell脚本参数声明

param (
    [Parameter(Mandatory = $false)]
    [string]$TicketName,
    [Parameter(Mandatory = $false)]
    [string]$TicketPath,
    [Parameter(Mandatory = $false)]
    [boolean]$IsProdRelease
)

解决方案

方法1:使用-File时传递PowerShell原生布尔字面量

核心是不给布尔参数加引号,直接传入PowerShell识别的$true或$false字面量:

var ps1File = @"DBScripter.ps1";
var ticketname = this.txtTicketName.Text;
bool release = true;
var startInfo = new ProcessStartInfo()
{
    FileName = "powershell.exe",
    Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{ps1File}\" -TicketName \"{ticketname}\" -IsProdRelease {(release ? "$true" : "$false")}",
    UseShellExecute = false
};
Process.Start(startInfo);

原理:-File模式下参数按字面量解析,未加引号的$true/$false会被PowerShell直接识别为布尔类型,匹配脚本中[boolean]类型的参数声明。

方法2:改用-Command参数调用(更灵活)

如果参数存在特殊字符或类型转换需求,用-Command模式可以更可靠地传递参数:

var ps1File = @"DBScripter.ps1";
var ticketname = this.txtTicketName.Text;
bool release = true;
var startInfo = new ProcessStartInfo()
{
    FileName = "powershell.exe",
    Arguments = $"-NoProfile -ExecutionPolicy unrestricted -Command & \"{ps1File}\" -TicketName \"{ticketname}\" -IsProdRelease {release.ToString().ToLower()}",
    UseShellExecute = false
};
Process.Start(startInfo);

原理:-Command模式下,传递小写的true/false字符串,PowerShell会自动将其转换为布尔类型;&用于正确调用脚本文件,确保参数绑定逻辑正常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:05:24