从CMD文件运行PowerShell脚本 - 参数类型出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从CMD文件运行PowerShell脚本 - 参数类型出错相关的知识,希望对你有一定的参考价值。
我正在尝试从.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]
数据类型运行它。
在CMD中,基本上一切都是字符串。 CMD特别不能识别像$true
和$false
这样的PowerShell内置常量。由于没有自动将字符串'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
以上是关于从CMD文件运行PowerShell脚本 - 参数类型出错的主要内容,如果未能解决你的问题,请参考以下文章
powershell v2.0 从批处理 cmd 文件传递变量计算机名参数
将 PowerShell 参数传递给 Process.Start
powershell 使PowerShell脚本可以从任何地方运行(即CMD.EXE,Explorer,Run Dialog等)