Nant cmd.exe重定向在c:\驱动器上创建名为“program”的文件

时间:2009-02-20 15:51:11

标签: command-line continuous-integration nant

我有NAnt脚本,作为其项目的一部分,使用以下任务调用批处理文件:

<target name="makeplane">   
  <exec program="C:\WINDOWS\system32\CMD.EXE" 
      commandline="/C ${make.file} &gt; ${make.log}"          
      verbose="false" 
      workingdir="${make.dir}" 
      basedir="${make.dir}">         
      </exec>
    <delete>
      <fileset basedir="c:\">
        <include name="program" />
      </fileset>
    </delete>
</target>

不幸的是,我无法控制批处理文件中的内容,它会在屏幕上喷出大量垃圾,这在日志中没用。因此,为了解决这个问题,我使用

将bat文件的输出重定向到文本文件
 &gt; ${make.log}

部分等同于“&gt; log.txt”。

这个重定向似乎在C盘上创建了一个名为“program”的文件,并且混乱了各种各样的服务,并且Windows通常不喜欢它。为了解决这个问题,我在bat文件执行后手动删除了这个文件。

问题是我现在需要完全为另一个项目运行类似的任务,如果它们同时运行,那么第一个将锁定名为“program”的文件,第二个将失败。对于持续集成而言,情况并非如此。

我在网上搜索但由于该文件被称为程序,我得到了各种垃圾结果。任何人都有任何关于解决方案的想法。我在exec任务上尝试了输出参数,但问题仍然存在。

3 个答案:

答案 0 :(得分:3)

如果日志的文件路径包含空格,通常会想要用引号括起路径。为了在nant中执行此操作,可以使用&quot;实体。

听起来这就是你特殊情况下发生的事情。因此,如果您将示例更改为以下内容,我认为事情应该按预期工作。

<target name="makeplane">   
    <exec program="C:\WINDOWS\system32\CMD.EXE" 
        commandline="/C ${make.file} &gt; &quot;${make.log}&quot;"          
        verbose="false" 
        workingdir="${make.dir}" 
        basedir="${make.dir}">         
    </exec>
</target>

答案 1 :(得分:1)

通常会发生这种情况,因为脚本正在尝试创建一个文件名长的文件,其中包含空格(在您的情况下为 c:\program files ),但它没有使用周围的引号长文件名。

答案 2 :(得分:0)

这就是我所做的。我认为对于复杂的命令来说它有点清晰。

<property name="cmd.label" value="\${ss.previous.label}@$Project.SSPath" />
<echo message="Getting $Project.Name source code with label \${cmd.label}" />
<property name="cmd" value="&quot;\${tfs.root}\tf.exe&quot; get $Project.SSPath &quot;/version:L\${cmd.label}&quot; /force /recursive /noprompt"/>
<exec program="cmd.exe"
  workingdir="\${shadow.dir}"
  failonerror="true"
  verbose="true">
 <arg value="/c" />
 <arg value="&quot;\${cmd}&quot;" />
 <arg value="> nul" />
</exec>