脱机调试MDT powershell脚本



我正在尝试创建一种离线调试PowerShell脚本的方法,该脚本用于Microsoft部署工具包(MDT)中的工作站部署任务序列。脚本使用任务序列检索使用ComObject环境变量,tsenv美元。ComObject仅在任务序列运行时可用,因此我想创建一个与从任务序列环境返回的ComObject相同的假对象,并用我从先前运行的任务序列捕获的值填充它。然后,我可以使用部署环境中实际存在的值脱机调试脚本。正在运行的任务序列中的值按如下名称返回,

$script_var1 = $tsenv.Value("OSDISK")
$script_var2 = $tsenv.Value("APPLYGPOPACK")
$script_var3 = $tsenv.Value("ASSETTAG")

有超过150个值。我试图构建一个数组对象,通过输出运行任务序列中的所有值,以完全相同的方式工作,如下所示,

$tsenv.GetVariables() | Where-Object {$_ -NotLike "_SMSTSTaskSequence"} | % {Write-Output "`$tsenv += New-Object -TypeName psobject -Property @{Name=`"$_`"; Value=`"$($tsenv.Value($_))`"}" >> vars.txt}

这给了我所有的值与名称,如果我创建一个空$tsenv数组,然后包括这个vars.txt文件的内容,它几乎工作。我可以看到$tsenv对象中的所有值,但是我不能像使用ComObject那样通过Name访问它们。我已经尝试了所有我能想到的方法,哈希表,数组,字典等等,但没有什么能比这个更接近,但它仍然不完全到位。谁有更好的方法或者达到我的目的的方法?

首先,如果您想导出以后要导入的对象,我强烈推荐使用Export-CliXmlcmdlet。它会保留嵌套数组之类的东西,所以如果"APPLYGPOPACK"返回要应用的gpo的字符串数组,它将在稍后导入时将其保持为字符串数组。我在这里要做的是创建一个空哈希表,将所有变量添加到其中,并将其导出为xml以供以后参考。

$tsenvHT = @{}
$tsenv.GetVariables() | Where-Object {$_ -NotLike "_SMSTSTaskSequence"} | % {$tsenvHT.Add($_,$tsenv.Value($_))}
$tsenvHT | Export-Clixml .vars.xml

然后,当您想要测试时,您只需使用Import-CliXml来恢复该数据。我要把它转换成[PSCustomObject],以便在下一步中工作得很好。

$tsenv = [pscustomobject](Import-Clixml .vars.xml)

接下来,引用的东西,就像你做你的$tsenv.value()方法,你可以创建一个自定义对象,并给它一个.Value()方法来模拟你的ComObject正在做什么。

$tsenv | Add-Member -MemberType ScriptMethod -Value {param($VariableName);$This.$VariableName} -Name 'Value'

然后你可以像调用ComObject一样调用它来获取变量值:

$tsenv.Value("OSDISK")

最新更新