C# 如何在MSBuild脚本中获取当前目录?

C# 如何在MSBuild脚本中获取当前目录?,c#,.net,msbuild,C#,.net,Msbuild,在我的MSBuild脚本中,我需要将完整目录作为参数传递。我怎样才能得到它 示例:我正在从C:\dev运行脚本,我需要一个相对路径temp,所以我在C:\dev\temp之后 注意:我不知道脚本将从哪个文件夹运行。MSBuild具有名为MSBuildProjectDirectory的保留属性,该属性指向项目或脚本文件所在目录的绝对路径,在您的情况下为C:\Dev。因此,“$(MSBuildProjectDirectory)\temp”正是您要查找的内容。Igor非常接近MSBuildProjec

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

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


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

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

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

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

编辑:MSBuild 4

如果使用的是MSBuild 4,则还可以将这些属性用于此类型的值

  • MSBuildThis文件
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot
  • MSBuildThisFileExtension
  • MSBuildThisFileFullPath
  • MSBuildThisFileName

请参阅。

以下是三个有用的目标

当然,当我试图找出我的当前目录时,我会使用wheremi

其他的信息也很丰富(有些超出了问题的范围)


如果您使用的是“外部MSBuild文件”,并且需要向其传递文件名或路径(因为外部MSBuild文件与调用的.MSBuild文件不在同一目录中,则它们不喜欢相对文件)…下面是一个方便的(我相信是3.5及以上)任务



您的临时文件夹是否始终是要运行此脚本的位置的子文件夹?+1请注意,这些新的MSBuild 4保留属性未列在Visual Studio 2010“编辑”对话框中的宏列表中,即使它们是受支持的MSBuild 4属性非常方便。为什么要使用
dir.
而不是
cd
?dir.'报告目录。cd正在更改目录,将我移出该文件夹。我想你可以做“cd”。但我看不出“dir”会给你带来什么。“…
dir.
打印出比工作目录多得多的内容<代码>目录“”。除了CWD之外还打印一条错误消息,因为不存在这样的文件。不带参数显示当前路径,而不更改它。我假设我们在这里讨论的是cmd,而不是通过
xbuild
;-)运行脚本时会发生什么。目录“.”不会为我报告错误。它列出了目录和文件/文件夹。我不知道xbuild,只是说,:-p。不带引号工作,但显示目录列表,而不仅仅是当前目录(这正是且仅是
CD
(无参数)打印出来的内容)。对不起,我在挑剔。但是,例如,在
AppData\Local\Temp
中,
dir.
的输出对于您仅仅想知道自己在哪里是毫无帮助的,因为那里有太多的文件…
<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>
    <ConvertToAbsolutePath Paths="..\"> <!-- Some relative path here -->
      <Output TaskParameter="AbsolutePaths" PropertyName="MyAbsolutionPathProperty"/>
    </ConvertToAbsolutePath>
    <Message Text="'MyAbsolutionPathProperty' = '$(MyAbsolutionPathProperty)'" />