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 脚本的代码进行了一些代码更改就解决了这个问题。
我的代码已经在多个 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 脚本的代码进行了一些代码更改就解决了这个问题。