回显到文件而不跟踪换行符(批处理)

时间:2015-10-24 17:57:15

标签: batch-file line

我的生活创作者计划有问题。 它只是选择代表某些东西的随机数字并将其组合在一起。 (我尝试过组合变量) 这是代码:

int

这里是变量推杆的事情:

@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%=@
@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%=@
@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

所以我想知道,(只需将每个变量组合到一个并将其转换为一行)如何设置要写入的行以便我可以将每个变量写入一行,从而创建生命 - 形成。 我问这个是因为每当我回应一些东西时,它会在文本文件中下移1行。

这是生活创造者的实验版本:

@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

1 个答案:

答案 0 :(得分:3)

更新:要输出到文件,如问题标题中所示,特殊注意事项适用(使用通常的输出重定向),最终使这个问题与Windows batch: echo without new line重复。 功能

如果我理解正确,您正在寻找一种方法回显(打印到标准输出)字符串,而不会有拖尾换行符。

cmd.exe' 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.

警告重新错误级别<NUL set /p ...技巧将%ERRORLEVEL%设置为1;为了明确地将其重置为0,请使用虚拟命令,例如ver >NUL

限制

  • 字符串不得包含"字符。 - 虽然您可以双重它们以避免语法错误,但它们会在输出中也出现了翻倍。

  • 字符串的第一个非空白字符不能是= - 无论是文字还是变量扩展的结果。< / p>

    • <nul set /p ="=foo"<nul set /p ==foo莫名其妙地导致语法错误(!)。
    • <nul set /p =^=foo也会导致语法错误,而<nul set "/p==foo"实际上会被解释为非交互式设置变量/p到值=foo,从而产生无输出。)
  • 从字符串中删除前导标签和空格
  • 请注意,如果您不重复引用该字符串,则该字符串包含&|等shell元字符时,该命令将会中断。

This answer可以提供一个强大的解决方案来处理所有这些边缘情况,尽管它确实需要辅助。批处理文件。

工作原理:

set /p <varName>=<value>旨在提示用户输入变量值,方法是从stdin读取一行,使用<value>作为提示字符串打印内嵌;试试set "/pFOO=Enter FOO: "

<NUL set /p ="..."之类的东西会在禁止交互式提示时使用此内联打印提示字符串(通过提供NUL设备(<NUL)的stdin输入,这会导致set /p立即返回,因为没有什么可读的。)

请注意/p ="..."=之前不包含变量名称的方式,因为我们对此处的变量不感兴趣 - set幸运的是很好(你) 可能使用虚拟变量名称 - 例如/p UNUSED="...",但请注意,您可能无意中用该名称覆盖现有变量;另外,使用变量名称​​不使用前导=的字符串帮助解决语法错误问题。