0

我有一个将数组作为输入参数的 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”-适配器@(Teamed_NIC1,Teamed_...
    参数列表中缺少参数。

这就是我在 MDT 2013 中对函数的调用如下所示:

PowerShell 脚本:<code>%SCRIPTROOT%\Disable-IPV6.ps1</code>; 参数:<code>-适配器@(

我怀疑 MDT 以一种意想不到的方式处理引号。

4

1 回答 1

1

@("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"

或者您可以删除参数定义并使用自动变量 $args

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

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

通过这样的调用:

%SCRIPTROOT%\Disable-IPV6.ps1 "Teamed_NIC1" "Teamed_NIC2"
于 2018-03-05T16:05:44.080 回答