当使用[switch]参数访问外部。cmd脚本时,我很难完全理解&调用操作符和Start-Process之间的区别。
在我的情况下,我在脚本的一部分中使用可选的开关参数,以允许在使用开关参数时运行外部CMD脚本。然而,我最初想使用&调用操作符来调用CMD脚本,并遇到了一个错误(见下文)。当使用&时,它似乎使用了System的值类型。对象[],并且似乎要将其转换为[switch]参数类型。
如果我用Start-Process而不是&来改变外部脚本的运行方式,一切都会正常。
调用外部脚本的两种不同方法实际上发生了什么?我不完全清楚[switch]值类型是什么,以及它如何与系统交互。对象[]类型&操作符似乎在使用。
如您所见,我的代码正在工作,但是我希望能够澄清&和Start-Process类型之间的关系,以及当使用[switch]参数访问时它们是如何交互的。
我在网上找不到任何关于使用[switch]与&调用有关的具体情况的信息。任何建议的阅读也非常感谢!
事先感谢您的帮助。
例子:
如果使用'&'操作符运行外部脚本
,则脚本运行失败Param(
[Parameter(ParameterSetName="set2", mandatory=$false)]
[switch]$Package,
[Parameter(ParameterSetName="set2", mandatory=$true)]
[string]$PackagePath
)
$Package = If ( $(Try {
Test-Path -LiteralPath $PackagePath.trim() }
Catch { $false } )) { & $PackagePath }
Else {
$wshell = New-Object -ComObject Wscript.Shell;
$wshell.Popup("The path '$PackagePath' does not exist.") }
> > .testing.ps1 -Package -PackagePath C:ThePathToScript.cmd
错误:
Cannot convert the "System.Object[]" value of type "System.Object[]" to type
"System.Management.Automation.SwitchParameter".
At C:testing.ps1:8 char:92
+ ... $false } )) { & $PackagePath }
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : ConvertToFinalInvalidCastException
如果'&'调用操作符被'Start-Process'替换,脚本将运行
Param(
[Parameter(ParameterSetName="set2", mandatory=$false)]
[switch]$Package,
[Parameter(ParameterSetName="set2", mandatory=$true)]
[string]$PackagePath
)
$Package = If ( $(Try {
Test-Path -LiteralPath $PackagePath.trim() }
Catch { $false } )) { Start-Process $PackagePath }
Else {
$wshell = New-Object -ComObject Wscript.Shell;
$wshell.Popup("The path '$PackagePath' does not exist.") }
> > .testing.ps1 -Package -PackagePath C:ThePathToScript.cmd
外部脚本运行:
cmdlet testing.ps1 at command pipeline position 1
Supply values for the following parameters:
PackagePath: d:build_packagesbuild_package.cmd
$Package
变量,首先在Param
中指定,是一个"System.Management.Automation "。SwitchParameter"类型。试试下面的脚本,它尝试给$Package
变量分配不同的类型。
Param(
[Parameter(ParameterSetName="set2", mandatory=$false)]
[switch]$Package
)
Write-Host $Package.GetType()
if ($Package) {
Write-Host $Package
Write-Host "another" + $Package.GetType()
}
$Package = $True
$Package = "now"