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