回显到文件而不带换行符(批量)

Exp*_*pto 1 batch-file line

我的生活创造者程序有问题。它只是选择代表某些内容的随机数并将其放在一起。(我尝试过组合变量)这里是代码:

@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
Run Code Online (Sandbox Code Playgroud)

这是可变的推杆:

@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
Run Code Online (Sandbox Code Playgroud)

所以我想知道,(而不是仅仅将每个变量组合为一个并将其回显到一行)如何设置要写入的行,以便我可以将每个变量写入一行,从而创建生命形式。我问这个问题是因为每次我回显某些内容时,它都会在文本文件中下降 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%=@
@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%=@
@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
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

更新:要输出到文件,如问题标题中现在所反映的,没有特殊注意事项适用(使用通常的输出重定向),这最终使该问题成为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.
Run Code Online (Sandbox Code Playgroud)

这将输出以下单行:

Hello, world: Still on the same line. Still on the same line, but ending it now.
Run Code Online (Sandbox Code Playgroud)

警告错误级别<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,因此根本不会产生任何输出。)
  • 字符串中的前导制表符和空格被删除。
  • 请注意,如果不对字符串使用双引号,则当字符串包含 shell 元字符(例如&和 )时,该命令将中断|

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


怎么运行的:

set /p <varName>=<value>旨在通过从 stdin 读取一行来提示用户输入变量值,并用作<value>打印inline提示字符串;尝试一下set "/pFOO=Enter FOO: "

<NUL set /p ="..."then 这样的东西使用提示字符串的内联打印,同时抑制交互式提示(通过提供来自设备的标准输入NUL<NUL,这会导致set /p立即返回,因为没有任何内容可读取)。

请注意,/p ="..."考虑=到我们对在这里分配变量不感兴趣,set幸运的是,这样就可以了(您可以使用虚拟变量名称 - 例如,,/p UNUSED="..."但请注意,您可能会无意中覆盖现有变量)通过该名称;此外,使用变量名并不能解决. 开头的字符串的语法错误问题=