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

