【问题标题】:How can I get the current directory in an MSBuild script?如何在 MSBuild 脚本中获取当前目录?
【发布时间】:2011-01-07 20:23:33
【问题描述】:

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

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

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

【问题讨论】:

  • 您的临时文件夹是否始终是运行此脚本的位置的子文件夹?

标签: c# .net msbuild


【解决方案1】:

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

  • C:\temp\MyProj.proj
  • C:\shared\shared.targets

MyProj.proj 导入shared.targets,这是传递给msbuild.exe 的那个,那么MSBuildProjectDirectory 的值将始终为C:\temp,即使您在其中引用它也是如此共享目标。如果您的 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 请注意,这些新的 MSBuild 4 保留属性未列在 Visual Studio 2010 编辑对话框中的宏列表中,即使它们受支持
  • MSBuild 4 的那些属性非常好用。
【解决方案2】:

这里有三个有用的目标。

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)'" />

【讨论】:

  • 为什么使用dir . 而不是cd
  • 目录'.'报告目录。 cd 是 change_directory 并将我移出文件夹。我猜你可以做“cd”。但我看不出“dir '.'”会给你带来什么......
  • dir . 打印出来的内容远不止工作目录。 dir '.' 除了 CWD 之外还打印出一条错误消息,因为不存在这样的文件。 CD 不带参数显示当前路径而不改变它。我假设我们在这里谈论的是 cmd,而不是如果您通过 xbuild 运行脚本会发生什么;-)。
  • 目录'.'不会为我报告错误。它列出了目录和文件/文件夹。我不知道 xbuild。
  • imgur.com/fTudXkB,只是说:-p。不带引号工作,但显示目录列表,而不仅仅是您当前的目录(这正是并且仅是 CD(不带参数)打印出来的内容)。对不起,我在吹毛求疵。但是,例如,在AppData\Local\Temp 中,如果您只想知道自己在哪里,dir . 的输出就非常无用,因为那里有很多文件……
【解决方案3】:

MSBuild 具有名为MSBuildProjectDirectory 的保留属性,它指向您的项目或脚本文件所在目录的绝对路径,在您的情况下为 C:\Dev。因此,"$(MSBuildProjectDirectory)\temp" 正是您要找的。​​p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2010-11-18
    相关资源
    最近更新 更多