难以理解“&”的类型差异调用操作符和开关参数

时间:2016-08-18 18:43:03

标签: powershell cmd

使用 [switch] 时,我很难完全理解& 调用操作符和 Start-Process 之间的区别用于访问外部.CMD脚本的参数。

在我的情况下,我在脚本的一部分中使用可选的switch参数,以允许在使用switch参数时运行外部CMD脚本。但是,我最初想使用&amp; 调用运算符来调用CMD脚本,并遇到错误(见下文)。当使用&amp; 时,它似乎使用值类型 System.Object [] ,并且似乎想要将其转换为 [switch] < / em>参数类型。

如果我使用 Start-Process 而不是&amp; 更改我运行外部脚本的方式,一切正常。

这里使用两种不同的调用外部脚本的方法实际上发生了什么?我不完全清楚 [switch] 值类型是什么以及它如何与 System.Object [] 交互&amp; 运营商似乎正在使用。

正如您所看到的,我的代码正常运行,但我希望在&amp; Start-Process 类型之间做一些澄清,以及它们在访问时如何进行交互使用 [switch] 参数。

我无法在网上找到与 [switch] &amp; 电话有关的特定情况的任何信息。任何建议的阅读也非常感谢!

提前感谢您的帮助。

示例:

如果“&amp;”脚本无法运行operator用于运行外部脚本

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:\The\Path\ToScript.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

脚本运行,如果'&amp;' call运算符由'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:\The\Path\ToScript.cmd

外部脚本运行:

cmdlet testing.ps1 at command pipeline position 1
Supply values for the following parameters:
PackagePath: d:\build_packages\build_package.cmd

1 个答案:

答案 0 :(得分:0)

首先在dmin = min(Matrix2(:)); dmax = max(Matrix2(:)); idx = find(Matrix1 >= dmin & Matrix1 <= dmax); 中指定的$Package变量是“System.Management.Automation.SwitchParameter”类型。尝试使用以下脚本尝试将不同类型分配给Param变量。

$Package