2011-10-04 30 views
10

Estoy ejecutando MSBuild desde un archivo por lotes. El script de MSBuild está en un directorio diferente al directorio que quiero que MSBuild considere el directorio de trabajo cuando se ejecuta el script. Al invocar MSBuild.exe, ¿cómo cambio su directorio de trabajo?Cambiar el directorio de trabajo de msbuild.exe

Edición: Más detalles
Digamos que tengo un script de MSBuild situado en algún otro servidor. Quiero ejecutar un comando así:

msbuild.exe \\my_server\c$\My\Path\To\Scripts\TestScript.msbuild 

Ejecuto ese comando con el símbolo del sistema en c: \ temp. Digamos que mi TestScript.msbuild tiene una tarea para crear un archivo. El archivo no tiene una ruta, solo un nombre de archivo. Esperaría que el archivo se cree dentro de c: \ temp. Pero no se crea al lado del archivo msbuild que está sentado en el servidor. Este es el comportamiento que quiero cambiar.

Edición # 2
Aquí es el guión que estoy usando en mi prueba:

<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> 

voy en un CDing shell de comandos en C: \ temp y después de ejecutar la secuencia de comandos. Con o sin el modificador/p: OutDir que menciona @Nick Nieslanik, el archivo HelloWorld.txt aparece en la carpeta donde está el archivo * .msbuild y no c: \ temp.

+0

no estoy seguro de entender su pregunta. Si tengo un archivo cmd en el directorio A y lo llamo desde el directorio B, entonces echo out% cd% mostrará el directorio B como el directorio actual. Entonces, a menos que esté cambiando el directorio en el script, ya debería considerar el directorio actual como el directorio de trabajo. ¿Puedes aclarar? –

+0

Estoy de acuerdo con el comportamiento que describes. Sin embargo, MSBuild no parece hacer eso. Parece tomar la ubicación del archivo * .build como el directorio de trabajo. Editaré mi pregunta para describir más detalles sobre mi configuración. – RationalGeek

Respuesta

3

@jkohlhepp - Ya veo. Estás haciendo lo contrario de lo que describí en mi comentario hasta cierto punto.
Los destinos comunes de MSBuild utilizan MSBuildProjectDirectory para determinar la carpeta de salida a menos que la anule. Así, en su caso, podría ejecutar

msbuild.exe \\my_server\c$\My\Pat\To\Scripts\TestScript.msbuild /p:OutDir=c:\temp 

para forzar la salida a dejarse caer en ese lugar.

EDIT:
Dado el archivo de proyecto anterior, que había necesidad de editarlo para hacer algo como lo siguiente para que esto funcione:

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

Hrmmm .... eso no pareció funcionar para mí. En mi script de ejemplo que construí para esta pregunta, tengo una tarea que especifica solo un nombre de archivo, sin directorio. Incluso cuando especifico/p: Outdir = c: \ temp, el archivo tocado aún termina al lado del archivo de script de msbuild. – RationalGeek

+0

¿Puedes mostrar un poco de ese archivo msbuild en la pregunta? –

+0

Sí puedo. Se agregó el guión completo a la pregunta. – RationalGeek

16

me encontré con esto mientras que en busca de una solución a mi problema. Aquí está mi solución (Creación de un script):

<?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> 

Creo que es más lo que estaba originalmente buscando?

Mi problema era que mi archivo por lotes llamaba a otro que esperaba estar en el mismo directorio, pero como mi script de compilación ms se estaba ejecutando en otro lugar, el archivo por lotes no pudo encontrar el segundo archivo por lotes.

+0

Has salvado mi vida. Salga del código 99, begone. – mmmeff

+0

El atributo 'WorkingDirectory' era lo que estaba buscando. ¡Un millón de gracias! –

Cuestiones relacionadas