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

时间:2018-03-05 15:48:46

标签: powershell mdt

我有一个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中的功能的看法:

PowerShell script: <code>%SCRIPTROOT%\Disable-IPV6.ps1</code>; Parameters: <code>-Adapters @("Teamed_NIC1", "Teamed_NIC2")</code>

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

1 个答案:

答案 0 :(得分: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"

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

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

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

这样的调用:

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