难以理解"&"呼叫运营商的类型差异以及交换机内部参数"Start-Process"



当使用[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"

相关内容

最新更新