从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
)

如你所见,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

谁能解释一下为什么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 脚本运行 cmd 命令

powershell v2.0 从批处理 cmd 文件传递​​变量计算机名参数

将 PowerShell 参数传递给 Process.Start

使用参数从 Powershell 脚本运行可执行文件

从批处理文件运行 Powershell 脚本中的参数

powershell 使PowerShell脚本可以从任何地方运行(即CMD.EXE,Explorer,Run Dialog等)