【问题标题】:How can I load the contents of a text file into a batch file variable?如何将文本文件的内容加载到批处理文件变量中?
【发布时间】:2010-09-13 03:16:53
【问题描述】:

我需要能够加载文本文件的全部内容并将其加载到变量中以进行进一步处理。

我该怎么做?


感谢 Roman Odaisky 的回答,这就是我所做的。

SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i

echo %content%
EndLocal

【问题讨论】:

标签: windows batch-file command-line cmd


【解决方案1】:

要读入整个多行文件但保留换行符,您必须重新插入它们。以下(用我的文件路径替换'<...>')起到了作用:

@echo OFF
SETLOCAL EnableDelayedExpansion
set N=^


REM These two empty lines are required
set CONTENT=
set FILE=<...>
for /f "delims=" %%x in ('type %FILE%') do set "CONTENT=!CONTENT!%%x!N!"
echo !CONTENT!

ENDLOCAL

您可能想要做其他事情而不是回显文件内容。

请注意,以这种方式可以读取的数据量可能会受到限制,因此您的里程可能会有所不同。

【讨论】:

    【解决方案2】:

    如果您的set 命令支持/p 开关,那么您可以通过这种方式管道输入。

    set /p VAR1=<test.txt
    set /? |find "/P"
    

    /P 开关允许您将变量的值设置为一行 用户输入的输入。显示指定的promptString before 读取输入行。 promptString 可以为空。

    这具有适用于未注册文件类型的额外好处(接受的答案没有)。

    【讨论】:

    • 你能解释一下set /? |find "/P"吗?
    • 我正在通过管道输出 'set /?'命令进入 find 命令,然后在其中查找带有“/ P”的行。试试看 set /?输出自己看。
    • 需要注意的是,这个方法只捕获“test.txt”的第一行。它不会将 VAR1 设置为文件的全部内容。
    【解决方案3】:
    for /f "delims=" %%i in (count.txt) do set c=%%i
    echo %c%
    pause
    

    【讨论】:

    • -1因为它没有将内容放入变量中,只有最后一行
    【解决方案4】:

    你能定义进一步的处理吗?

    您几乎可以使用 for 循环来执行此操作,但没有简单的方法将 CR/LF 插入环境变量,因此您可以将所有内容放在一行中。 (根据您的需要,您或许可以解决此问题。)

    通过这种方式,您也被限制为少于 8k 的文本文件。 (您不能创建大于 8k 左右的单个 env var。)

    Bill 对 for 循环的建议可能正是您所需要的。您一次处理一行文件:

    (在命令行中使用%i 在批处理文件中%%i

    for /f "tokens=1 delims=" %%i in (file.txt) do echo %%i
    

    更高级:

    for /f "tokens=1 delims=" %%i in (file.txt) do call :part2 %%i
    goto :fin
    
    :part2
    echo %1
    ::do further processing here
    goto :eof
    
    :fin
    

    【讨论】:

      【解决方案5】:

      你可以使用:

      set content=
      for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i
      

      【讨论】:

        【解决方案6】:

        创建一个名为“SetFile.bat”的文件,其中包含以下行,结尾处无回车...

        set FileContents=
        

        然后在你的批处理文件中做这样的事情......

           @echo off
           copy SetFile.bat + %1 $tmp$.bat > nul
           call $tmp$.bat
           del $tmp$.bat
        

        %1 是输入文件的名称,%FileContents% 将包含调用后输入文件的内容。不过,这仅适用于单行文件(即不包含回车的文件)。如果需要,您可以在调用 %tmp%.bat 之前从文件中删除/替换回车符。

        【讨论】:

          【解决方案7】:

          使用for,类似于:

          set content=
          for /f "delims=" %%i in ('filename') do set content=%content% %%i
          

          也许您必须使用setlocal enabledelayedexpansion 和/或使用!content! 而不是%content%。我无法测试,因为我附近没有任何 MS Windows(我希望你也一样 :-)。

          我所知道的最好的批处理文件-black-magic-reference 位于http://www.rsdn.ru/article/winshell/batanyca.xml。如果您不会俄语,您仍然可以使用提供的代码 sn-ps。

          【讨论】:

          • 其中一个真正令人讨厌的部分是 Windows 需要为上面的“文件名”参数提供关联的文件类型。如果您尝试使用未注册的文件类型,您的脚本将在窗口提示中阻塞。
          • For 手册可在此处获得:FOR /F
          • 所有这些都是为我打开文件。
          • 那只是将 las 行放在变量中。最终结果:content=%content%lastline。请注意,%content% 未被解释。
          猜你喜欢
          • 2011-03-05
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 2019-05-12
          • 2022-12-31
          • 2015-05-09
          相关资源
          最近更新 更多