【问题标题】:Echo to a file without trailing a line break (batch) [duplicate]在不尾随换行符的情况下回显文件(批处理)[重复]
【发布时间】:2016-01-24 02:52:56
【问题描述】:

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

@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

这里是把变量放在一起的东西:

@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 行。

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

@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

【问题讨论】:

  • 你知道set var== 后面的空格会进入变量吗?要调试正在发生的事情,请删除所有 @ 并查看输出。
  • @wOxxOm:通常,是的,但这不适用于set /a - 从计算结果中删除任何空格;同样,如果您使用 numerical 比较运算符(例如 EQU),则会忽略空格。
  • 如果您不希望任何脚本行回显,只需使用@echo off 作为第一行,那么您不必在每行前面加上@
  • @mklement0,我专门写了set var=,而不是set /a var=
  • 不清楚你在问什么 - 你的问题中有很多“噪音”。你能把它归结为MCVE (Minimal, Complete, and Verifiable Example)吗?

标签: batch-file line


【解决方案1】:

更新:要输出到文件,正如现在问题标题中所反映的那样,没有需要特殊注意事项(使用通常的输出重定向),这最终使这个问题与Windows batch: echo without new line 重复。

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

cmd.exeecho不允许让您这样做,但有一个解决方法

 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.

警告关于错误级别&lt;NUL set /p ... 技巧将%ERRORLEVEL% 设置为1;要将其显式重置为 0,请使用虚拟命令,例如 ver &gt;NUL

限制

  • 字符串不能包含" 字符。 - 虽然您可以将它们加倍以避免语法错误,但它们随后会在也输出。

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

    • &lt;nul set /p ="=foo"&lt;nul set /p ==foo 莫名其妙地导致 语法错误(!)。
    • &lt;nul set /p =^=foo 也会导致语法错误,&lt;nul set "/p==foo" 实际上会被解释为以非交互方式将变量/p 设置为值=foo,因此根本不会产生无输出。)
  • 前导制表符和空格已从字符串中删除
  • 请注意,如果您不对字符串进行双引号,如果字符串包含诸如&amp;| 之类的shell 元字符,则命令将中断。

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


工作原理:

set /p &lt;varName&gt;=&lt;value&gt; 旨在提示用户输入变量值,方法是从标准输入读取一行,使用&lt;value&gt; 作为提示字符串来打印内联;试试set "/pFOO=Enter FOO: "

&lt;NUL set /p ="..." 这样的东西会在抑制交互式提示的同时使用提示字符串的这种内联打印(通过从NUL 设备提供标准输入输入(&lt;NUL,这会导致set /p 立即返回,因为什么都没有阅读)。

注意/p ="..."= 之前不包含变量名,因为我们对在这里分配变量不感兴趣 - 幸运的是set 很好(你可能使用虚拟变量名称 - 例如,/p UNUSED="...",但请注意,您可能会无意中用该名称覆盖现有变量;另外,使用变量名称 not 有助于解决字符串的语法错误问题带有领先的=

【讨论】:

  • 谢谢!很多,你能解释一下它是如何工作的吗?另外,它会循环工作吗?
  • 对不起,我刚试了一下,对不起,我是想用它写一个文件....
  • @TheBeastprogrammer:应该没问题——只要确保你从不使用echo——所有输出都使用&lt;NUL set /p="..." &gt;&gt;file
  • 还有一个问题,它会循环工作吗?
  • 例如 for /L %G in (1,1,3) do &lt;nul set /p="Hello, %var%: "&gt;&gt;foo.txt 循环按预期工作(在批处理脚本中使用 %%G 而不是 %G
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多