我有NAnt脚本,作为其项目的一部分,使用以下任务调用批处理文件:
<target name="makeplane">
<exec program="C:\WINDOWS\system32\CMD.EXE"
commandline="/C ${make.file} > ${make.log}"
verbose="false"
workingdir="${make.dir}"
basedir="${make.dir}">
</exec>
<delete>
<fileset basedir="c:\">
<include name="program" />
</fileset>
</delete>
</target>
不幸的是,我无法控制批处理文件中的内容,它会在屏幕上喷出大量垃圾,这在日志中没用。因此,为了解决这个问题,我使用
将bat文件的输出重定向到文本文件 > ${make.log}
部分等同于“&gt; log.txt”。
这个重定向似乎在C盘上创建了一个名为“program”的文件,并且混乱了各种各样的服务,并且Windows通常不喜欢它。为了解决这个问题,我在bat文件执行后手动删除了这个文件。
问题是我现在需要完全为另一个项目运行类似的任务,如果它们同时运行,那么第一个将锁定名为“program”的文件,第二个将失败。对于持续集成而言,情况并非如此。
我在网上搜索但由于该文件被称为程序,我得到了各种垃圾结果。任何人都有任何关于解决方案的想法。我在exec任务上尝试了输出参数,但问题仍然存在。
答案 0 :(得分:3)
如果日志的文件路径包含空格,通常会想要用引号括起路径。为了在nant中执行此操作,可以使用"
实体。
听起来这就是你特殊情况下发生的事情。因此,如果您将示例更改为以下内容,我认为事情应该按预期工作。
<target name="makeplane">
<exec program="C:\WINDOWS\system32\CMD.EXE"
commandline="/C ${make.file} > "${make.log}""
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=""\${tfs.root}\tf.exe" get $Project.SSPath "/version:L\${cmd.label}" /force /recursive /noprompt"/>
<exec program="cmd.exe"
workingdir="\${shadow.dir}"
failonerror="true"
verbose="true">
<arg value="/c" />
<arg value=""\${cmd}"" />
<arg value="> nul" />
</exec>