5

我有以下 psake 脚本

properties {
    $ApplicationName = "test"
    $ApplicationPath = "c:\this\is\$ApplicationName"
}

Task test {
    "ApplicationName = $ApplicationName"
    "ApplicationPath = $ApplicationPath"
}

我只想将 ApplicationName 传递给脚本,以避免输入整个应用程序路径。但是当我使用该-parameters标志时,不会对属性应用任何更改

Invoke-psake .\script.ps1 -parameters @{ApplicationName = "another_test"} test

ApplicationName = test
ApplicationPath = c:\this\is\test

这听起来不对,因为应该在任何属性块之前评估参数。当我使用该-properties标志时,应用程序名称已更改,但路径未更改

Invoke-psake .\script.ps1 -properties @{ApplicationName = "another_test"} test

ApplicationName = another_test
ApplicationPath = c:\this\is\test

所以属性已经被初始化了,但是不应该-parameters覆盖这个行为吗?

4

1 回答 1

8

问题是您希望在属性块之前评估参数,但在psake中,属性会覆盖参数。

https://github.com/psake/psake/wiki/How-can-I-pass-parameters-to-my-psake-script%3F

properties {
  $my_property = $p1 + $p2
}

构建脚本中的“属性”函数可以覆盖传递给 Invoke-psake 函数的参数。在上面的示例中,如果参数哈希表是 @{"p1"="v1";"p2"="v2";"my_property"="hello"},那么 $my_property 最终仍将设置为“v1v2”。

我不确定您是否可以在不修改 psake 的情况下覆盖一个属性并根据该属性更新进行另一个属性更新。您可以做的只是创建一个在需要时评估路径的函数:

Function ApplicationPath {"c:\this\is\$ApplicationName"}
于 2014-03-16T23:45:43.897 回答