从批处理文件调用脚本时如何指定开关参数

时间:2019-06-11 20:25:43

标签: powershell parameter-passing command-line-interface

我有一个脚本foo.ps1和一个批处理文件foo.cmd,用于通过在文件资源管理器中双击cmd文件来启动该脚本。

该脚本接受一个switch参数,但是我不知道如何提供这种参数。简单的参数就可以了。

Foo.ps1:

param(
    [Parameter()]
    [Switch]$MySwitch,
    [Parameter()]
    [string]$Name
)

Write-Host "`$MySwitch : $MySwitch, `$Name : $name"

Foo.cmd:

Powershell -noprofile -NonInteractive -file "%~dp0\foo.ps1" -Name "abc"    

如果仅使用“名称”调用脚本,则该脚本有效。但是,如果指定MySwitch,它将停止工作:

Foo2.cmd:

Powershell -noprofile -NonInteractive -File "%~dp0\foo.ps1" -Name "abc" -MySwitch:$false

错误是:

C:\temp\foo.ps1 : Impossible de traiter la transformation d'argument sur le paramètre «MySwitch». Impossible de convertir la valeur «System.String» en type « System.Management.Automation.SwitchParameter». Les paramètres booléens acceptent seulement des valeurs booléennes et des nombres, tels que $True, $False, 1 ou 0.
    + CategoryInfo          : InvalidData : (:) [foo.ps1], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,foo.ps1

1 个答案:

答案 0 :(得分:1)

在Windows PowerShell中,使用CLI的-File参数时无法传递布尔值-此功能已在PowerShell Core 中得到纠正。 [1]

使用JosefZ建议的解决方法

使用 -Command-c代替-File 使PowerShell将自变量视为 PowerShell源代码而不是文字参数,在这种情况下,$false可以正确识别(为简洁起见,省略了其他CLI参数)。

powershell -c "& \"%~dp0\foo.ps1\" -Name 'abc' -MySwitch:$false"  

请注意需要使用&来调用脚本文件,因为该脚本文件的路径已加引号。另请注意,PowerShell需要嵌入"字符。在命令行上以\"(而不是`"""的形式转义,而不是{em> inside PowerShell)。


使用-File时,PowerShell Core支持以下值作为布尔值:$true$falsetruefalse(还有{ {1}},但其解释不同:脚本(包括$null)和函数将其解释为-File,而cmdlet将其解释为$false(!))。
请注意,使用$true-因此在所有PowerShell代码中--Commandtrue都不起作用,但是false0起作用做。
不幸的是,如果传递了不受支持的值,则在所有情况下都会收到相同的错误消息,在1情况下,该消息会误导了-File0的工作。
< / p>