【问题标题】:Passing Parameters to a PowerShell Script in MDT 2013在 MDT 2013 中将参数传递给 PowerShell 脚本
【发布时间】:2018-08-13 08:00:15
【问题描述】:

我有一个将数组作为输入参数的 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 中调用函数的样子:

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

【问题讨论】:

  • 在参数块中,尝试这样调用 --> -Adapters "Teamed_NIC1" "Teamed_NIC2"
  • @VivekKumarSingh 这将使用一个命名参数 (-Adapters "Teamed_NIC1") 和一个未命名参数 ("Teamed_NIC2") 调用脚本。
  • 是的@AnsgarWiechers - 我现在意识到,看着你的答案。感谢您指出这一点并教育我们这些人。 :)
  • @AnsgarWiechers 很好的说明。我需要的关键部分是只能在 PowerShell 中识别

标签: powershell mdt


【解决方案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"

【讨论】:

  • 谢谢!我知道它会像这样简单。
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 2011-08-01
  • 2015-06-07
  • 2017-05-08
  • 2019-07-07
  • 2012-12-10
  • 2020-11-26
相关资源
最近更新 更多