我正在尝试检索 Powershell 脚本中的 MDT 任务序列变量,然后在 Powershell 函数中使用该变量。我的问题在于,我想要检索的变量包含无法正确解析的 Powershell 变量。设置方式如下:
在 MDT 中,我使用“设置任务序列变量”任务,其名称为“TS-Destination”,值为“$($env:systemdrive)\dep”(不带引号)。
通过“运行 Powershell 脚本”任务添加 PowerShell 脚本,并以“%scriptroot%\Script.ps1”(不带引号)的形式运行,参数为“-Source 'Z:\someprogram'”(不带双引号)。在 Powershell 脚本中,我的问题所在部分如下:
脚本开头
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=0)]
[string]$Source,
[Parameter(Mandatory=$False)]
[string]$Destination
)
$tsenv = New-Object -ComObject Microsoft.SMS.TSEnvironment
If ($Destination -eq "") {
$Destination = $tsenv.Value('TS-Destination')
}
Copy-Item $Source -Destination $Destination -Recurse
脚本结束
首先,我想说的是,如果我在脚本内部手动设置变量,脚本就会起作用,但我希望它能够根据用户的偏好(使用参数或 TS 变量的选择)轻松更改和灵活。
我认为它可以工作的原因是它会从“TS-Destination”变量中获取值并将其用于 $destination 变量(并解析它),但脚本运行时无法解析该变量。它收到一个错误,即名为“$($env”的驱动器不存在(这是 Copy-Item 的错误,因为变量没有解析)。似乎它在冒号后停止读取变量值,但我不知道为什么。
当排除故障并手动设置值时(通过使用 $tsenv.Value('TS-Destination') = "$($env:systemdrive)\dep" 然后使用该值并正确解析变量。我尝试了各种方法来转义字符并设置变量,但似乎没有任何效果。变量被定义为 [string] 参数这一事实是否会阻止这样的操作?
我需要这个值能够接受变量格式,因为该脚本正在任务序列的多个部分中使用,并且系统驱动器在部署过程中会发生变化。我可以在任务序列期间多次设置变量,但这会使任务序列变得比必要的更复杂,我希望复杂的部分在脚本内:)
所以主要问题是:
我怎样才能让它正常工作?