如何在msbuild脚本中获取当前目录?

时间:2010-01-21 17:16:18

标签: c# .net msbuild

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

示例:我正在从C:\ dev运行脚本,我想要一个相对路径temp,所以我在C:\ dev \ temp

之后

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

3 个答案:

答案 0 :(得分:92)

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

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

并且MyProj.proj导入shared.targets这是传递给msbuild.exe的那个,那么MSBuildProjectDirectory的值将始终为 C:\ temp ,即使您正在引用shared.targets内部。如果您的shared.targets需要路径知识,那么应该在已知属性中声明它们。例如,C#项目文件定义OutputPath的值,共享文件Microsoft.Common.targets使用该属性。

编辑:MSBuild 4

如果您使用的是MSBuild 4,则现在可以使用此类值的属性。

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

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

答案 1 :(得分:50)

以下是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文件”并需要传递文件名或路径(因为外部msbuild文件不喜欢相关文件,如果它们与调用.msbuild文件不在同一目录中)。 ......这是一个方便的(我相信3.5及以上)任务。

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

答案 2 :(得分:11)

MSBuild保留了名为MSBuildProjectDirectory的属性,该属性是项目或脚本文件所在目录的绝对路径,在您的情况下为C:\ Dev。因此,"$(MSBuildProjectDirectory)\temp"正是您所需要的。