我试图从.cmd文件运行PowerShell脚本。以下是我定义的脚本参数:
Param(
[string]$Customer,
[string]$EntryPointINT,
[string]$EntryPointPRD,
[string]$EntryPointVDI,
[string]$LicenseServer,
[bool]$onlyVDI,
[bool]$hasVDI,
[int]$insertHelper
)
如您所见,onlyVDI
和hasVDI
来自bool
类型。到现在为止还挺好。当我从PowerShell控制台启动脚本时,我可以执行以下操作(在此处更改了customername和servername):
.\kpi.ps1 -Customer "CustName" -EntryPointVDI "servername" -onlyVDI 0 -hasVDI 1 -insertHelper 1
这完全符合预期。所以现在我想从.cmd文件启动相同的脚本。它看起来如下:
powershell.exe -File %~dp0%kpi.ps1 -Customer "Custname" -EntryPointVDI "servername" -LicenseServer "sc005019" -onlyVDI 0 -hasVDI 0 -insertHelper 1
这会导致以下错误:
C:\***\***\***\kpi.ps1 : Cannot process argument transformation on parameter 'onlyVDI'. Cannot convert value "System.String" to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0. + CategoryInfo : InvalidData: (:) [kpi.ps1], ParentContainsErrorRecordException + FullyQualifiedErrorId : ParameterArgumentTransformationError,cop_kpi.ps1
有人可以解释为什么0
上onlyVDI
是一个字符串吗?我已尝试过所有内容,尝试将其替换为$False
...无法让它发挥作用。现在我已经将它定义为PowerShell脚本中的字符串并将其作为cmd文件中的字符串传递,它可以作为一种解决方法,但它并不干净。我想使用[bool]
数据类型运行它。
答案 0 :(得分:3)
在CMD中,基本上一切都是字符串。 CMD特别不识别PowerShell内置常量,如$true
和$false
。由于字符串'0'
,'1'
,'$true'
或'$false'
没有自动转换为布尔值,因此当您从CMD /批处理中调用代码时,代码会出错。
处理布尔参数的更好方法是将它们定义为switch parameters:
Param(
[string]$Customer,
[string]$EntryPointINT,
[string]$EntryPointPRD,
[string]$EntryPointVDI,
[string]$LicenseServer,
[switch]$onlyVDI,
[switch]$hasVDI,
[int]$insertHelper
)
通过传递或省略参数,可以将它们设置为true或false:
powershell.exe -File %~dp0%kpi.ps1 -Customer "foo" -EntryPointVDI "bar" -hasVDI