更改msbuild.exe的工作目录

更改msbuild.exe的工作目录,msbuild,Msbuild,我正在从批处理文件执行MSBuild。MSBug脚本与运行MSDube的目录不同,在运行脚本时要考虑工作目录。调用MSBuild.exe时,如何更改其工作目录 编辑:更多详细信息 假设我在其他服务器上有一个MSBuild脚本。我想运行一个命令: msbuild.exe \\my_server\c$\My\Path\To\Scripts\TestScript.msbuild 我在c:\temp的命令提示符下运行该命令。假设我的TestScript.msbuild有一个创建文件的任务。该文件没有路

我正在从批处理文件执行MSBuild。MSBug脚本与运行MSDube的目录不同,在运行脚本时要考虑工作目录。调用MSBuild.exe时,如何更改其工作目录

编辑:更多详细信息
假设我在其他服务器上有一个MSBuild脚本。我想运行一个命令:

msbuild.exe \\my_server\c$\My\Path\To\Scripts\TestScript.msbuild
我在c:\temp的命令提示符下运行该命令。假设我的TestScript.msbuild有一个创建文件的任务。该文件没有路径,只有一个文件名。我希望该文件是在c:\temp中创建的。但它不是在服务器上的msbuild文件旁边创建的。这是我想要改变的行为

编辑#2
以下是我在测试中使用的脚本:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">   
    <ItemGroup>
        <Files Include="HelloWorld.txt" />
    </ItemGroup>

    <Target Name="TouchFiles">
        <Touch Files="@(Files)" AlwaysCreate="True" />
    </Target>
</Project>


我将进入一个命令shell CDing到c:\temp中,然后执行脚本。无论是否使用@Nick Nieslanik提到的/p:OutDir开关,HelloWorld.txt文件都会显示在*.msbuild文件所在的文件夹中,而不是c:\temp.

@jkohlhepp-我现在明白了。你在某种程度上与我在评论中描述的相反
MSBuild公共目标使用MSBuildProjectDirectory确定输出文件夹,除非您重写该文件夹。因此,在您的情况下,您可以运行

msbuild.exe \\my_server\c$\My\Pat\To\Scripts\TestScript.msbuild /p:OutDir=c:\temp 
强制将输出放到该位置

编辑:
鉴于上面的项目文件,您需要对其进行编辑,以便执行以下操作:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OutDir Condition=" '$(OutDir)' == '' ">bin\debug\</OutDir>
  </PropertyGroup>
  <ItemGroup>  
    <!-- Without prefacing files with paths, they are assumed relative to the proj file -->
    <FilesToCreate Include="$(OutDir)HelloWorld.txt" />  
  </ItemGroup>  
  <Target Name="TouchFiles">  
     <Touch Files="@(FilesToCreate)" AlwaysCreate="True" />  
  </Target>  
</Project>  

bin\debug\

我在寻找问题的解决方案时遇到了这个问题。以下是我的解决方案(构建脚本):


我相信这就是你最初想要的


我的问题是,我的批处理文件调用了另一个批处理文件,但由于我的ms build脚本在其他地方运行,批处理文件未能找到第二个批处理文件

在当前版本的MSBuild中,可以在MSBuild文件中使用众所周知的属性
MSBuildStartupDirectory
来检索调用MSBuild的文件夹的绝对路径


在提出问题时,msbuild中可能不存在此选项。我不想花太多时间调查此事。

我不确定我是否理解你的问题。如果我在目录a中有一个cmd文件,并从目录B调用它,那么回显%cd%,它会将目录B显示为当前目录。因此,除非您正在更改脚本中的目录,否则它应该已经将当前的DIR视为工作目录。你能澄清一下吗?我同意你描述的行为。然而,MSBuild似乎没有做到这一点。它似乎将*.build文件的位置作为工作目录。我将编辑我的问题,以描述我的设置的更多细节。Hrmmm…这似乎不适合我。在我为这个问题构建的示例脚本中,我有一个任务,它只指定一个文件名,没有目录。即使我指定了/p:Outdir=c:\temp,被触碰的文件仍然会出现在msbuild脚本文件的旁边。所以!我现在明白你的意思了。如果不使用某些MSBuild属性作为每个文件的前缀,或者不将它们从源项目目录复制到某个目标位置(如$(OutDir)),那么您就太倒霉了。。。我将尝试编辑我的答案并说明我的意思,所以MSBuild只是说“我的工作目录是构建文件所在的位置”,而您没有选择更改它?唉……谢谢你的回答@Nick Nieslanik。这基本上就是我最后要做的,但我觉得我在使用自己的变量来跟踪“工作目录”,MSBuild应该能够自己正确地管理它。哦,好吧。至少我没有遗漏什么。@binki可以想象,这与MSBuild更像是一种“项目定义格式”,而不是一种脚本语言有关。因此,主要用途是在一个文件夹中有一个项目文件,处理如何“构建”该文件夹中的内容,因此,如果相对路径从该文件夹延伸,则通常很方便,并且与此不同,它使您不必知道或记住在运行某个特定Makefile时是否应该使用-f或-C。当然,每种工具都有自己的优缺点。在当前版本中,如果需要,msbuild文件可以引用$(MSBuildStartupDirectory)。我正在查找
WorkingDirectory
属性。万分感谢!
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Default">
    <Exec Command="build.bat" WorkingDirectory="..\[your dir]\" />
  </Target>
</Project>