在我的Build.proj文件中,我有以下属性:
<DbName Condition="$(DbName) == ''">MyDB</DbName>
<ConnectionString Condition="$(ConnectionString) == ''">"Data Source=localhost;Initial Catalog=$(DbName);Integrated Security=SSPI;MultipleActiveResultSets=True"</ConnectionString>
我有一个PowerShell功能如下:
function Update-Database
{
param(
$DbName=""
)
msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate /p:DbName=$DbName
}
在PowerShell中运行该函数我得到以下结果:
Update-Database MyDB
:效果很好Update-Database
:失败。在这种情况下,MSBuild不使用默认的“MyDB”。相反,它使用''如果我修改此行:
msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate /p:DbName=$DbName
对此:
msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate
运行“UpdateDatabase”使用默认的“MyDB”,一切都很顺利。
如果我想选择使用默认值或传入新值,我是否必须将整个msbuild...
命令包装在if
else
中?还是有办法有条件地传递参数?
更新
我试图避免在ps函数中设置默认值。基本上我想在没有if:
的情况下模仿这种行为function Update-Database
{
param(
$DbName=""
)
if($DbName -eq "")
{
msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate
}
else
{
msbuild $MSBuildFile /maxcpucount /verbosity:Minimal /target:DatabaseUpdate /p:DbName=$DbName
}
}
答案 0 :(得分:2)
您在命令行中指定的属性将变为global property,该属性将优先于文件中指定的属性。您可以定义新属性以避免此行为,如下所示:
<_DbName>$(DbName)</DbName>
<_DbName Condition="$(_DbName) == ''">MyDB</_DbName>
<ConnectionString Condition="$(ConnectionString) == ''">"Data Source=localhost;Initial Catalog=$(_DbName);Integrated Security=SSPI;MultipleActiveResultSets=True"</ConnectionString>
答案 1 :(得分:1)
虽然已经确定了一个很好的答案,但另一种方法是在powershell中使用Invoke-Expression并动态构建要运行的msbuild cmd。我在GitHub上有一个例子(你可以轻松改变它以适应可选的数据库名称:
https://gist.github.com/nnieslan/c631add56c5f7f3e7d6e#file-build-functions-ps1