2015-10-24 2 views
0

У меня возникла проблема с программой создания моего жизненного творца. Он просто выбирает случайные числа, которые означают что-то и объединяет их. (я пытался сочетающее переменные) вот код:Эхо в файл без завершения разрыва строки (пакетный)

@set num=1 
@SET /A a=%RANDOM% * 10/32768 + 1 
@if %a% == 10 set life%num%= ---- 
@if %a% == 9 set life%num%=O 
@if %a% == 8 set life%num%=^ 
@if %a% == 7 set life%num%=% 
@if %a% == 6 set life%num%=# 
@if %a% == 5 set life%num%[email protected] 
@if %a% == 4 set life%num%=) 
@if %a% == 3 set life%num%=() 
@if %a% == 2 set life%num%=~ 
@if %a% == 1 set life%num%=OO 
@echo %a% >"gencode".txt 
@set num=2 
@SET /A a=%RANDOM% * 10/32768 + 1 
@if %a% == 10 set life%num%=---- 
@if %a% == 9 set life%num%=O 
@if %a% == 8 set life%num%=^ 
@if %a% == 7 set life%num%=% 
@if %a% == 6 set life%num%=# 
@if %a% == 5 set life%num%[email protected] 
@if %a% == 4 set life%num%=) 
@if %a% == 3 set life%num%=() 
@if %a% == 2 set life%num%=~ 
@if %a% == 1 set life%num%=OO 
@set life3= %life1%-%life2% 
@echo %life3%>"lifeform".txt 
@echo %a% >>"gencode".txt 

и здесь переменные клюшки вместе вещь:

@set final= 500 
@set /a pass= %pass% + 1 
@set /a cnum= %cnum% + 1 
@set counterold=%counter% 
@set life%cnum%-%counter%= %a%-%b% 
@if %pass% == 1 goto start 
:repeat 
@if %ficnum% == 500 goto final 
@set life2%cnum%-%counter%= life%counterold%-life%counter% 
@set life2%cnum%-%counterold%= life%counterold%-life%counter% 
@set /a ficnum= %ficnum% + 1 
@set life3%ficnum%-%counter%= life2%counterold%-life2%counter% 
@goto repeat 
:final 
@set /a final= %final% + 1 
@set /a counter= %counter% + 1 
@set /a ficnum= %ficnum% + 1 
@set counter1= %counter% 
@set ficnum1= %ficnum% 
:finalst 
@set /a final= %final% - 1 
@set /a counter1= %counter1% - 1 
@set /a ficnum= %ficnum% - 1 
@set /a ficnum1= %ficnum1% - 1 
@set /a counter= %counter% - 1 
@set final%final%=%life3%%ficnum%-%counter%-%life3%%ficnum1%-%counter1% 
@if %final% == 0 goto finalend 
@goto finalst 
:finalend 
@echo final0>"lifeform".txt 

Так что я хотел бы знать, (ВМЕСТО JUST ОБЪЕДИНЕНИЯ КАЖДОГО ПЕРЕМЕН К ОДНОМУ И ЭХОНИРОВАНИЮ ТОГО, ЧТО В ОДНОЙ ЛИНИИ), как мне установить строку для записи, чтобы я мог просто написать каждую переменную в одну строку, создав жизненную форму. Я прошу об этом, потому что каждый раз, когда я повторяю что-то, он переходит в 1 строку в текстовом файле.

А вот экспериментальная версия жизни создателя:

@set num1=1 
:repeat 
@if %counter% == 500 exit 
@set /a num1= %num1% + 1 
@SET /A a=%RANDOM% * 10/32768 + 1 
@if %a% == 10 set life%num%=---- 
@if %a% == 9 set life%num%=O 
@if %a% == 8 set life%num%=^ 
@if %a% == 7 set life%num%=% 
@if %a% == 6 set life%num%=# 
@if %a% == 5 set life%num%[email protected] 
@if %a% == 4 set life%num%=) 
@if %a% == 3 set life%num%=() 
@if %a% == 2 set life%num%=~ 
@if %a% == 1 set life%num%=OO 
@echo %a% >>"gencode".txt 
@set /a num2= %num% + 1 
@SET /A a=%RANDOM% * 10/32768 + 1 
@if %a% == 10 set life%num%=---- 
@if %a% == 9 set life%num%=O 
@if %a% == 8 set life%num%=^ 
@if %a% == 7 set life%num%=% 
@if %a% == 6 set life%num%=# 
@if %a% == 5 set life%num%[email protected] 
@if %a% == 4 set life%num%=) 
@if %a% == 3 set life%num%=() 
@if %a% == 2 set life%num%=~ 
@if %a% == 1 set life%num%=OO 
@set final= 500 
@set /a pass= %pass% + 1 
@set /a cnum= %cnum% + 1 
@set counterold=%counter% 
@set life%cnum%-%counter%= %a%-%b% 
@if %pass% == 1 goto start 
:repeat 
@if %ficnum% == 500 goto final 
@set life2%cnum%-%counter%= life%counterold%-life%counter% 
@set life2%cnum%-%counterold%= life%counterold%-life%counter% 
@set /a ficnum= %ficnum% + 1 
@set life3%ficnum%-%counter%= life2%counterold%-life2%counter% 
@goto repeat 
:final 
@set /a final= %final% + 1 
@set /a counter= %counter% + 1 
@set /a ficnum= %ficnum% + 1 
@set counter1= %counter% 
@set ficnum1= %ficnum% 
:finalst 
@set /a final= %final% - 1 
@set /a counter1= %counter1% - 1 
@set /a ficnum= %ficnum% - 1 
@set /a ficnum1= %ficnum1% - 1 
@set /a counter= %counter% - 1 
@set final%final%=%life3%%ficnum%-%counter%-%life3%%ficnum1%-%counter1% 
@if %final% == 0 goto finalend 
@goto finalst 
:finalend 
@echo final0>"lifeform".txt 
+0

Знаете ли вы, что пробел после '=' в 'set var =' переходит в переменную? Чтобы отладить происходящее, удалите все '@' и посмотрите на результат. – wOxxOm

+0

@wOxxOm: Как правило, да, но это не относится к 'set/a' - любые пробелы обрезаются из результата вычисления; Аналогично, пробелы игнорируются, если вы используете операторы сравнения _numerical_, такие как 'EQU'. – mklement0

+0

Если вы хотите, чтобы ни одна из строк вашего сценария не эхом, просто используйте '@echo off' в качестве первой строки, тогда вам не нужно префикс каждой строки' @ '. – mklement0

ответ

3

Update: Для вывода на файл, как сейчас отражен в названии вопроса, не особых соображений не применяются (используйте обычные выходные перенаправления), что в конечном итоге делает этот вопрос дубликатом Windows batch: echo without new line.

Если я вас правильно понимаю, вы ищете способ для эхо (печати на стандартный вывод) строку без перерыва задней линии.

cmd.exe «s echo делает не позволяют сделать это, но есть обходного:

set "var=world" 
<NUL set /p ="Hello, %var%: " 
<NUL set /p ="Still on the same line. " 
echo Still on the same line, but ending it now. 

Это выводит следующую, одну строку:

Hello, world: Still on the same line. Still on the same line, but ending it now. 

РИСКОВАННЫХ re уровень ошибок: <NUL set /p ... трюк %ERRORLEVEL% до 1; чтобы явно сбросить его до 0, используйте команду фиктивного типа, например ver >NUL.

Есть ограничения:

  • Строка не должна содержать " символов. - в то время как вы можете удвоить, чтобы избежать синтаксической ошибки, они также будут отображаться на удвоенном выходе.

  • первый непробельным символ, используемый струны не должны быть = - будь то в качестве литерала или в результате расширения переменной.

    • <nul set /p ="=foo" и <nul set /p ==foo необъяснимо вызвать ошибку в синтаксиса (!).
    • (<nul set /p =^=foo также вызывает ошибку синтаксиса и <nul set "/p==foo" фактически будет интерпретироваться как неинтерактивно установки переменной /p оценить =foo и, следовательно, не производит никакого вывода вообще.)
  • Ведущие вкладки и пробелы удаляются из строки.
  • Обратите внимание, что если вы не дублируете строку, команда будет разбита, если строка содержит метасимволы оболочки, такие как & и |.

This answer может предоставить надежное решение для обработки всех этих случаев краев, хотя для этого требуется aux. командный файл.


Как это работает:

set /p <varName>=<value> предназначен для оперативного пользователя, для значения переменного, читая строки из стандартного ввода, используя <value> как строки приглашения для печати инлайн; попробуйте с set "/pFOO=Enter FOO: "

Нечто подобное <NUL set /p ="..." затем использует эту рядную печать строки приглашения, подавляя интерактивную подсказку (обеспечивая STDIN входа от NUL устройства (<NUL, который вызывает set /p вернуться немедленно, потому что нет ничего, чтобы прочитать) .

Обратите внимание, как /p ="..." не содержит имя переменной перед =, учитывая, что мы не заинтересованы в присвоении переменной здесь - set это, к счастью, хорошо с этим (вы может использовать фиктивный имя переменной - например, /p UNUSED="..." , но n oте, что вы можете непреднамеренно перезаписать существующую переменную этим именем; также, используя имя переменной, делает не, чтобы помочь в ошибке синтаксиса с строкой с ведущим =.

+0

Спасибо! Не могли бы вы объяснить, как это работает? Кроме того, будет ли он работать в цикле? – TheBeastprogrammer

+0

Извините, я просто попробовал, и, к сожалению, я хотел написать файл с ним .... – TheBeastprogrammer

+0

@ TheBeastprogrammer: Это должно быть хорошо - просто убедитесь, что вы никогда не используете 'echo' - используйте' > file' для всех выходных данных. – mklement0

Смежные вопросы