MDT 2013中调用带数组参数的PowerShell函数报错问题咨询
我在处理MDT任务序列调用PowerShell脚本的场景时,经常碰到引号解析和数组参数传递的坑,结合你的情况,给你几个针对性的解决方案:
1. 先搞清楚MDT对PowerShell参数的解析逻辑
MDT的命令行执行器(不管是Run Command Line还是Run PowerShell Script步骤)对引号的处理和原生PowerShell控制台不一样——它会优先把引号包裹的内容当成单个字符串参数,而不是自动解析成数组。这就是你遇到问题的核心原因:你传递的数组被当成了单个逗号分隔的字符串,而不是PowerShell能识别的数组对象。
2. 数组参数的正确传递方式
场景一:直接通过Run Command Line调用脚本并传递数组
如果你的原调用代码类似这样:
powershell.exe -File .\MyScript.ps1 -Fruits "Apple,Banana,Cherry"
那你需要修改成显式声明PowerShell数组的形式,并且用-Command参数来执行,而不是-File(因为-File会把所有参数当成字符串):
powershell.exe -ExecutionPolicy Bypass -Command "& '.\MyScript.ps1' -Fruits @('Apple','Banana','Cherry')"
这里的关键点:
- 用
&来调用脚本文件,确保PowerShell正确解析数组语法 - 数组用
@()显式声明,元素用单引号包裹(MDT对单引号的解析更友好,不需要额外转义)
场景二:在脚本内部调用函数(任务序列先加载脚本再执行函数)
如果你的任务序列是先加载脚本,再调用其中的函数,比如:
powershell.exe -ExecutionPolicy Bypass -Command "& { . '.\MyScript.ps1'; Test-FruitArray -Fruits "Apple,Banana,Cherry" }"
那你需要确保:
- 函数的参数定义明确是数组类型:
function Test-FruitArray { param( [Parameter(Mandatory=$true)] [string[]]$Fruits # 必须声明为[string[]]而不是[string] ) # 函数逻辑 } - 如果是从MDT任务序列变量传递值,先把逗号分隔的字符串转成数组:
$tsenv = New-Object -ComObject Microsoft.SMS.TSEnvironment $fruitString = $tsenv:FruitList # 假设这个变量是"Apple,Banana,Cherry" $fruitArray = $fruitString -split ',' Test-FruitArray -Fruits $fruitArray
3. 特殊场景:带空格的数组元素
如果数组元素包含空格,比如"Red Apple","Yellow Banana",在MDT命令行里需要注意引号转义:
powershell.exe -ExecutionPolicy Bypass -Command "& '.\MyScript.ps1' -Fruits @('Red Apple','Yellow Banana')"
单引号包裹带空格的元素即可,MDT不会解析单引号内部的空格,PowerShell能正确识别每个元素。
4. 验证技巧
你可以在函数开头加一行调试代码,确认接收到的参数类型:
function Test-FruitArray { param([string[]]$Fruits) Write-Host "参数类型: $($Fruits.GetType().Name)" Write-Host "元素数量: $($Fruits.Count)" }
如果输出是String[]和正确的元素数量,说明参数传递成功;如果是String和1,说明还是被当成了单个字符串,需要调整传递方式。
内容的提问来源于stack exchange,提问作者BFerg

