我有一个脚本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
答案 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
,$false
,true
,false
(还有{ {1}},但其解释不同:脚本(包括$null
)和函数将其解释为-File
,而cmdlet将其解释为$false
(!))。
请注意,使用$true
-因此在所有PowerShell代码中--Command
和true
都不起作用,但是false
和0
起作用做。
不幸的是,如果传递了不受支持的值,则在所有情况下都会收到相同的错误消息,在1
情况下,该消息会误导了-File
和0
的工作。 < / p>