我如何获得当前目录在MSBuild脚本?

在我的MSBuild脚本中,我需要传递完整的目录作为参数。 怎么能得到它?

例如:我从C:\ dev运行脚本,我想要一个相对pathtemp,所以我在C:\ dev \ temp之后

注意:我不知道脚本将从哪个文件夹运行。

伊戈尔非常接近。 MSBuildProjectDirectory是将为您提供在命令行上调用的项目文件的完整path的属性。 所以,如果你有以下脚本:

  • C:\ TEMP \ MyProj.proj
  • C:\共享\ shared.targets

MyProj.proj导入shared.targets ,这是传递给msbuild.exe的那个,那么即使你引用了shared.targets里面的内容,MSBuildProjectDirectory的值也总是C:\ temp 。 如果您的shared.targets需要path知识,那么应该在已知的属性中声明这些。 例如,C#项目文件定义了OutputPath的值,共享文件Microsoft.Common.targets使用该属性。

编辑:MSBuild 4

如果您正在使用MSBuild 4,现在可以使用这种types的值的属性。

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot
  • MSBuildThisFileExtension
  • MSBuildThisFileFullPath
  • MSBuildThisFileName

请参阅http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx

这里有3个有用的目标。

WhereAmI是我试图找出我当前目录当然使用的。 其他人也是信息。 (有些超出了问题的范围)。

 <Target Name="WhereAmI"> <Message Text=" Here I Am " /> <Exec Command="dir ." /> <Message Text=" " /> </Target> <Target Name="ShowReservedProperties" AfterTargets="BeforeBuild"> <Message Text=" MSBuildProjectDirectory = $(MSBuildProjectDirectory)" Importance="high" /> <Message Text=" MSBuildProjectFile = $(MSBuildProjectFile)" Importance="high" /> <Message Text=" MSBuildProjectExtension = $(MSBuildProjectExtension)" Importance="high" /> <Message Text=" MSBuildProjectFullPath = $(MSBuildProjectFullPath)" Importance="high" /> <Message Text=" MSBuildProjectName = $(MSBuildProjectName)" Importance="high" /> <Message Text=" MSBuildBinPath = $(MSBuildBinPath)" Importance="high" /> <Message Text=" MSBuildProjectDefaultTargets = $(MSBuildProjectDefaultTargets)" Importance="high" /> <Message Text=" MSBuildExtensionsPath = $(MSBuildExtensionsPath)" Importance="high" /> <Message Text=" MSBuildStartupDirectory = $(MSBuildStartupDirectory)" Importance="high"/> </Target> <Target Name="ShowOtherProperties"> <Message Text=" " /> <Message Text=" " /> <Message Text=" Environment (SET) Variables* " /> <Message Text=" --------------------------- " /> <Message Text=" COMPUTERNAME = *$(COMPUTERNAME)* " /> <Message Text=" USERDNSDOMAIN = *$(USERDNSDOMAIN)* " /> <Message Text=" USERDOMAIN = *$(USERDOMAIN)* " /> <Message Text=" USERNAME = *$(USERNAME)* " /> </Target> 

如果您使用的是“外部msbuild文件”,并且需要传递一个文件名或path(因为如果外部msbuild文件与调用的.msbuild文件不在相同的目录中,它们不会像相关文件那样)。这里是一个方便(3.5和我相信)任务。

  <ConvertToAbsolutePath Paths="..\"> <!-- Some relative path here --> <Output TaskParameter="AbsolutePaths" PropertyName="MyAbsolutionPathProperty"/> </ConvertToAbsolutePath> <Message Text="'MyAbsolutionPathProperty' = '$(MyAbsolutionPathProperty)'" /> 

MSBuild已经保留了名为MSBuildProjectDirectory属性,这是你项目或脚本文件所在目录的绝对path,C:\ Dev在你的情况下。 因此"$(MSBuildProjectDirectory)\temp"正是你正在寻找。