MSBuild命令行参数长度超过8191个字符

MSBuild命令行参数长度超过8191个字符,msbuild,Msbuild,我正在使用MSBUILD.exe为应用程序执行生成。作为其中的一部分,我将所需变量作为MSBUILD.exe的命令行参数传递 我有两个文件。xml和MyService.proj。下面的行显示在service.xml文件中 <installCommand name="MyService" cmd="msbuild.exe &quot;MyService.proj&quot; /p:{vairables}"> 最初命令的长度很小,一切都很好,因为我能够构建我的项目,

我正在使用MSBUILD.exe为应用程序执行生成。作为其中的一部分,我将所需变量作为MSBUILD.exe的命令行参数传递

我有两个文件。xml和MyService.proj。下面的行显示在service.xml文件中

<installCommand name="MyService" cmd="msbuild.exe &quot;MyService.proj&quot; /p:{vairables}">

最初命令的长度很小,一切都很好,因为我能够构建我的项目,但是随着项目大小的增加,参数的数量也增加了,现在我正处于命令行显示错误的阶段(输入行太长)

经过一些搜索,我发现命令行不能超过8191个字符


任何人都可以为此提出任何替代方案。

什么是
installCommand

MSBuild引擎将所有系统、用户和进程变量以及参数和属性合并到一个大池中,因此可以首先分别设置通过
{vairables}
传递的每个属性。请记住,通过命令行传递的属性是global属性,因此等效环境变量不会覆盖相应的项目属性,除非其上有
Condition=“”$(Foo)”==”


您可以在xml文件中设置变量,并将xml文件名传递给msbuild脚本

下面是一个使用MSBuildCommunityTasks的简单示例

Parameters.xml(以下内容)


谢谢你的评论,我已经编辑了原来的帖子。是,首先设置变量,然后将其传递给命令执行。我正在传递的变量超过了允许的最大长度。@Raghavendrapasa我的观点是,如果您先
设置它们,即将
{vairables}
转换为环境变量,而不需要再将它们传递给
/p:
,MSBuild无论如何都会读取它们,因此命令行将是最小的。Ilya Kozhevnikov:我试图将我的变量分配给环境变量。我用这个作为我的参考。[但我没有成功地实现我的目标。您能否提供任何示例或指向在生成XML文件中创建环境变量的引用。感谢@granadaCoder提供示例代码。您已经定义了参数并在触发生成之前为其分配了值,但在我的情况下,该值是在运行tim时分配的e(在构建过程中),当我使用您的代码时,我得到的参数值为“”。这种情况下是否有解决方法。如果您将它们作为参数传递给命令行,它们是如何生成的?因此,您可以将XmlWritePeekValue传递到一个文件…~然后调用传递xml文件名的子任务。然后在该文件中,读取值。一个进程将在xml中创建变量值,另一个进程将实现variab女同性恋。
<?xml version="1.0" encoding="utf-8"?>
<parameters>
  <setParameter name="LineNumber1" value="PeanutsAreCool" />
  <setParameter name="LineNumber2" value="" />
</parameters>
<?xml version="1.0" encoding="utf-8"?>
<Project  ToolsVersion="4.0"  xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">

    <Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />



    <PropertyGroup>
        <!-- Always declare some kind of "base directory" and then work off of that in the majority of cases  -->
        <WorkingCheckout>.</WorkingCheckout>
    </PropertyGroup>

    <Target Name="AllTargetsWrapped">
        <CallTarget Targets="ReadXmlPeekValue" />
        <CallTarget Targets="WriteXmlPeekValue" />
    </Target>   


    <Target Name="ReadXmlPeekValue">
        <!-- you do not need a namespace for this example, but I left it in for future reference -->
        <XmlPeek Namespaces="&lt;Namespace Prefix='peanutNamespace' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath=".\Parameters.xml" 
             Query="/parameters/setParameter[@name='LineNumber1']/@value">
            <Output TaskParameter="Result" ItemName="Peeked" />
        </XmlPeek>

        <Message Text="@(Peeked)"/>

        <XmlPeek Namespaces="&lt;Namespace Prefix='peanutNamespace' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath=".\Parameters.xml" 
             Query="/parameters/setParameter[@name='LineNumber1']/@value">
            <Output TaskParameter="Result" PropertyName="PeekedSingle" />
        </XmlPeek>      

        <Message Text="PeekedSingle = $(PeekedSingle)   "/>
    </Target>   




    <Target Name="WriteXmlPeekValue"  Condition=" '$(PeekedSingle)' != '' ">
        <XmlPoke Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
    XmlInputPath=".\Parameters.xml"
            Query="/parameters/setParameter[@name='LineNumber2']/@value"
    Value="$(PeekedSingle)" />
    </Target>   




</Project>
set msBuildDir=%WINDIR%\Microsoft.NET\Framework\v4.0.30319

call %msBuildDir%\msbuild /target:AllTargetsWrapped "MyMsbuildDef.proj" /p:Configuration=Debug;FavoriteFood=Popeyes /l:FileLogger,Microsoft.Build.Engine;logfile=ZZZZZAllTargetsWrapped.log

set msBuildDir=