PowerShell 代码在 SCCM 和 MDT TaskSequences 下的行为不同

PowerShell code behaving differently under SCCM and MDT TaskSequences

我的代码已经在多个 PowerShell 会话、多台机器等中进行了广泛测试,所有这些都完全符合我的预期。

switch ($e.Data.Type) `
{
    {$_ -in [Policy.Reg]::SZ, [Policy.Reg]::EXPAND_SZ} `
        {
            $e.Data[$e.Data.Type] = ([string]$e.Data[$e.Data.Type]) -replace "{PC}", "$PC"
        } 
    {$_ -in [Policy.Reg]::MULTI_SZ} `
        {
            $e.Data[$e.Data.Type] = [string[]]($e.Data[$e.Data.Type] | % { $_ -replace "{PC}", "$PC" })
        }
}

[Policy.Reg] 是一个枚举,$e.Data.Type 是那个枚举的变量

运行 来自 ISE 的代码或 Powershell 命令行代码每次都有效。

当我将其添加为 RunPowerShell 任务序列步骤时(MDT 2012/2013 和 SCCM 2012 都已尝试),任务序列失败并显示

    you must provide a value expression on the right-hand side of the '-' operator. [Policy.Reg]::SZ, [Policy.Reg]::EXPAND_SZ

我完全不知道当 TaskSequence 运行 Powershell 脚本时发生了什么,这使得它与我手动执行某些代码时不同。

这么快看来我的问题是 MDT 本身。

控制 PowerShell 执行的标准 wsf 和 vbs 文件检查注册表中是否存在当前安装的版本,然后 运行 设置唯一 PowerShell 环境的两个可执行文件之一。

其中一个 Exes 运行 是最新版本的 powershell。

另一个强制它在 powershell 2.0 中 运行(我猜是为了兼容性)

问题是脚本文件中的LOGIC全错了

而不是像

if (PSVersion  >= 2.0) then
    Run newest PowerShell
else
    Run PowerShell 2.0
end if

看起来像

if (PSVersion = 3.0 then
    Run newest Powershell
else
    Run Powershell 2.0
end if

因此,由于我所有的图像都安装了 PowerShell 4.0,而且逻辑规定 4.0 不等于 3.0,所以我们转向 PowerShell 2.0 并扔掉所有东西我们已经习惯了,因为我们花了很长时间确保我们环境中的每个系统至少在 PowerShell 4.0

所以最后对启动 PowerShell 脚本的代码进行了一些代码更改就解决了这个问题。