【问题标题】:Combine lines in text file using batch使用批处理合并文本文件中的行
【发布时间】:2019-01-01 15:29:35
【问题描述】:

我想制作一个程序,它获取文本文件第二行的内容并将其放在第一行。 (如果第二个不被编辑也没关系)

for /f "tokens=1" %%t in (file.txt) do set string1=%%t
for /f "tokens=2" %%t in (file.txt) do set string2=%%t
echo %string1%%string2%>file.txt

我有两个问题似乎无法解决。

一个:循环只包含变量中每一行的第一个单词。

二:Echo 不会用给定的变量替换文件的第一行,而是写 ECHO 命令已停用(我有 Windows 10 的法语版本,只是简单地翻译了文件中写入的内容,英文 Windows版本可能略有不同,但你明白了)

如果您有任何建议,请解释您提供的代码的作用(我一直喜欢学习)

【问题讨论】:

  • FOR 命令默认使用空格作为分隔符。所以你必须告诉它不要在DELIMS 选项中使用任何分隔符。此外,您应该能够使用单个 FOR /F 命令来执行此操作。只需将上一行保存在变量中即可。
  • 使用skip省略第一行,将第二行写两次。一般来说,编辑文件意味着重写新文件,并可能重命名以保留旧文件名。
  • @LotPings,我是不是完全误解了他们的问题?他们是想合并第 1 行和第 2 行还是去掉第 1 行?
  • @Joujoubox 您能否提供一个输入和输出示例。我想我完全误解了你的意图。显示输入和输出示例有助于澄清问题。请更新您的问题。
  • @LotPings,那我猜题名应该改了。

标签: batch-file for-loop text echo


【解决方案1】:

FOR 命令默认使用空格作为分隔符。所以你必须告诉它不要在 DELIMS 选项中使用任何分隔符。此外,您应该能够使用单个 FOR /F 命令来执行此操作。只需将前一行保存在变量中即可。

@ECHO OFF
setlocal enabledelayedexpansion

set "line1="
(for /f "delims=" %%G in (file.txt) do (
    IF NOT DEFINED line1 (
        set "line1=%%G"
    ) else (
        echo !line1!%%G
        set "line1="
    )
)
REM If there are an odd amount of lines, line1 will still be defined.
IF DEFINED line1 echo !line1!
)>File2.txt

编辑:我想我完全误解了你的问题。一旦你澄清你的问题,如果需要,我会重新发布代码解决方案。

【讨论】:

    【解决方案2】:

    使用skip省略第一行,将第二行写两次。一般来说,文件的编辑意味着重写新文件并可能重命名以保留旧文件名。

    :: Q:\Test\2018\07\25\SO_51508268.cmd
    @Echo off
    Set "flag="
    ( for /f "usebackq skip=1 delims=" %%A in ("file1.txt") Do (
        If not defined flag (
          Echo=%%A
          Set flag=true
        )
        Echo=%%A
      )
    ) >file2.txt
    Del file1.txt
    Ren file2.txt file1.txt
    

    运行批处理后,最初编号为 1..5 行的 file1.txt 如下所示:

    > type file1.txt
    2
    2
    3
    4
    5
    

    【讨论】:

      【解决方案3】:

      您的问题不清楚,可以通过几种不同的方式来理解。反正这个管理更简单,不用for命令:

      @echo off
      setlocal EnableDelayedExpansion
      
      < file.txt (
      
         rem Takes the content of the first line
         set /P "line1="
      
         rem Takes the content of the second line and puts it on the first
         set /P "line2="
         echo !line1!!line2!
      
         rem It doesn't matter if the second line doesn't get edited
         echo !line2!
      
         rem Copy the rest of lines
         findstr "^"
      
      ) > output.txt
      
      move /Y output.txt file.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 2012-06-22
        • 2022-10-18
        • 1970-01-01
        • 2014-03-31
        相关资源
        最近更新 更多