从CMD文件运行PowerShell脚本 - 参数类型出错

时间:2018-03-06 11:52:02

标签: powershell batch-file cmd parameters boolean

我试图从.cmd文件运行PowerShell脚本。以下是我定义的脚本参数:

Param(
    [string]$Customer,
    [string]$EntryPointINT,
    [string]$EntryPointPRD,
    [string]$EntryPointVDI,
    [string]$LicenseServer,
    [bool]$onlyVDI,
    [bool]$hasVDI,
    [int]$insertHelper
)

如您所见,onlyVDIhasVDI来自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

有人可以解释为什么0onlyVDI是一个字符串吗?我已尝试过所有内容,尝试将其替换为$False ...无法让它发挥作用。现在我已经将它定义为PowerShell脚本中的字符串并将其作为cmd文件中的字符串传递,它可以作为一种解决方法,但它并不干净。我想使用[bool]数据类型运行它。

1 个答案:

答案 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