【问题标题】:Write batch variable into specific line in a text file将批处理变量写入文本文件中的特定行
【发布时间】:2012-05-21 13:32:41
【问题描述】:

我有一个批处理文件,我需要将变量写入文本文件的特定行并覆盖该行中所有准备好的内容。我有从文件中读取特定行的代码,也许我可以切换它来写?

阅读行代码:

setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in (variables.txt) do (
set /a N+=1
set v!N!=%%a
)
set variable1=!v1!
set variable2=!v2!
set variable3=!v3!
set variable4=!v4!

我尝试添加 echo %variable1% > !v4! 类似的东西,但它不起作用。

【问题讨论】:

    标签: text batch-file


    【解决方案1】:

    我想通了!!这是其他任何可能需要它的人的代码。

    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    set inputfile=variables.txt
    
    set tempfile=%random%-%random%.tmp
    
    copy /y nul %tempfile%
    
    set line=0
    
    for /f "delims=" %%l in (%inputfile%) do (
        set /a line+=1
        if !line!==4 (
            echo WORDS YOU REPLACE IT WITH>>%tempfile%
        ) else (
            echo %%l>>%tempfile%
        )
    )
    
    del %inputfile%
    ren %tempfile% %inputfile%
    
    endlocal
    

    【讨论】:

    • 很好地解决了这个问题!不知道为什么整个循环的单个重定向对您不起作用,但无论如何都做得很好。
    【解决方案2】:

    另一种选择可能是完全覆盖文件。这是执行此操作的部分:

    :saveVars
    (
    ECHO %v1%
    ECHO %v2%
    ECHO %v3%
    ECHO %v4%
    ECHO %v5%
    ) >variables.txt
    GOTO :EOF
    

    也就是说,如果行数是固定的并且事先已知。如果没有,您可能希望在示例代码中存储增量的最后一个值,并在保存变量时,像这样使用它:

    :saveVars
    SETLOCAL EnableDelayedExpansion
    (
      FOR /L %%i IN (1,1,%N%) DO (ECHO !v%%i!)
    ) >variables.txt
    ENDLOCAL
    GOTO :EOF
    

    我在这里假设v1/v2 等变量将仅用于与文件同步:读取时,行存储在这些变量中,当其中任何一个(变量) 发生变化,您只需立即调用saveVars 子例程。这是一个如何使用它的示例:

    …
    SET v2=something
    CALL :saveVars
    …
    SET v4=%somevar%
    CALL :saveVars
    …
    

    如果文件很小,重写应该足够快。

    【讨论】:

      【解决方案3】:

      不确定我是否正确理解了所有内容,但如果您想用批处理脚本替换文本文件的现有部分,则需要将所有内容(包括更改的部分)写入新文件首先,然后删除原来的文件并将新文件重命名为原来的名称。

      我真的看不出将所有内容读入变量的意义,除非我遗漏了什么。您可以简单地遍历将它们一一写入新文件的行,并在此过程中用替换文本替换特定行的内容:

      setLocal EnableDelayedExpansion
      >newFile.txt (
        for /f "tokens=* delims= " %%a in (variables.txt) do (
          set /a N+=1
          if !N! == 4 (ECHO substitute text) ELSE ECHO %%a
        )
      )
      del variables.txt
      rename newFile.txt variables.txt
      

      如果替代文本又必须从其中一行派生,您可以执行以下操作:

      setLocal EnableDelayedExpansion
      >newFile.txt (
        for /f "tokens=* delims= " %%a in (variables.txt) do (
          set /a N+=1
          if !N! == 1 SET subst_text=%%a
          if !N! == 4 (ECHO !subst_text!) ELSE ECHO %%a
        )
      )
      del variables.txt
      rename newFile.txt variables.txt
      

      【讨论】:

      • 我不知道你在做什么,在这里我只想要一个批处理文件来更改已经存在的文本文件中的特定行。假设文本文件的第 5 行说你好。我想让批处理获取一个变量并用变量内容写在第 5 行。就是这样。
      • 你的意思是,variables.txt 不是需要替换一行的文件吗?
      • 它是......但我不想创建一个新文件。我知道你在做什么,但我觉得除了创建一个新文件之外必须有更好的方法:/
      • 只使用批处理语法和标准工具,是不可能做到你想做的。您可以将行附加到文本文件,但您不能在文件中间的某处修改行,而不必写入新文件。在 Windows 批处理脚本中,无法打开文件、写入文件、保存结果等。
      • 请添加一个示例(最好是针对您的问题),说明文本文件的外观、输入参数可能是什么以及应该产生什么结果/输出。
      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2014-10-02
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多