在 MDT 2013 中将参数传递给 PowerShell 脚本

Passing Parameters to a PowerShell Script in MDT 2013

我有一个将数组作为输入参数的 PowerShell 脚本:

Param( 
    Parameter(Mandatory=$true)]
    [System.String[]] $Adapters
)
Write-Output "Disabling network adapter(s)."
foreach ($adapter in $Adapters) {
    Disable-NetAdapterBinding -Name $adapter -ComponentID ms_tcpip6  
    Write-Host $adapter
}

当我从 MDT 2013 任务序列调用该函数时出现以下错误:

+ ..."E:\Deploy\Scripts\Disable-IPV6.ps1" -Adapters @(Teamed_NIC1, Teamed_...
    Missing argument in parameter list.

这是我在 MDT 2013 中调用函数的样子:

我怀疑 MDT 以意外的方式处理引号。

@("Teamed_NIC1","Teamed_NIC2") 是一个 PowerShell 数组。该构造只能在 PowerShell 中识别,但不能被您调用 PowerShell 脚本的环境识别。如果删除 @().

,同样适用

从 PowerShell 外部调用 PowerShell 脚本时,您不能真正将数组值传递给参数。一个常见的解决方法是将参数作为分隔字符串传递并将其拆分:

Param(
    Parameter(Mandatory=$true)]
    [String]$Adapters
)
$AdapterList = $Adapters -split ','
foreach ($adapter in $AdapterList) {
    ...
}

调用如下:

%SCRIPTROOT%\Disable-IPV6.ps1 "Teamed_NIC1,Teamed_NIC2"

或者您可以删除参数定义并使用 automatic variable $args:

if (-not $args) { throw 'Missing argument.' }

foreach ($adapter in $args) {
    ...
}

调用如下:

%SCRIPTROOT%\Disable-IPV6.ps1 "Teamed_NIC1" "Teamed_NIC2"