Nant cmd.exe создает файл перенаправления с именем 'program' на диске c: \ - PullRequest
1 голос
/ 20 февраля 2009

У меня есть скрипт 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}

часть, которая соответствует "> log.txt".

Это перенаправление, кажется, создает файл с именем "program" на диске C и портит все виды сервисов, а Windows, как правило, это не нравится. Чтобы обойти это, я вручную удаляю этот файл после запуска файла bat.

Проблема в том, что теперь мне нужно полностью выполнить аналогичную задачу для другого проекта, и если они выполняются одновременно, то первый заблокирует файл с именем «program», а второй завершится ошибкой. Не совсем хорошая ситуация для непрерывной интеграции.

Я искал в сети, но так как файл называется программой, я получаю всевозможные результаты мусора. Кто-нибудь получил какие-либо идеи обойти. Я пробовал выходной параметр в задаче exec, но проблема остается той же.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2009

Если путь к файлу журнала содержит пробелы, обычно требуется заключить путь в кавычки. Для этого в 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 голос
/ 20 февраля 2009

Обычно это происходит потому, что скрипт пытается создать файл с длинным именем файла с пробелом в нем (c:\program files в вашем случае), но он не использует кавычки вокруг длинного имени файла .

0 голосов
/ 14 декабря 2009

Вот что я сделал. Я думаю, что это немного чище для сложных команд.

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