批处理文件:如何读取文件?

Luc*_*hez 91 file batch-file

如何从批处理文件中读取文件(文本或二进制文件)?有一种方法可以在二进制模式或文本模式下读取它吗?

dev*_*vio 66

在NT风格的cmd.exe下,您可以使用循环遍历文本文件的行

FOR /F %i IN (file.txt) DO @echo %i
Run Code Online (Sandbox Code Playgroud)

在命令提示符下键入"help for"以获取更多信息.(不知道你使用的"DOS"是否有效)

  • 如果找到空白字符,此命令将退出读取行.我最终最终使用了FOR/F"tokens =*"%% i IN(file.txt)DO @ECHO %% i (31认同)
  • 它应该是'%% i`. (21认同)
  • 有用!如果您正在使用控制台尝试%i,如果您使用的是bat文件,请尝试%% i. (8认同)
  • 谢谢Jim Fell.如果只有我记得在把头发拉出来之前阅读评论! (4认同)

joh*_*tok 39

您可以使用for命令:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
Run Code Online (Sandbox Code Playgroud)

类型

for /?
Run Code Online (Sandbox Code Playgroud)

在命令提示符下.此外,您可以解析ini文件!

  • 这是一个非常复杂的示例,从特定格式的文本文件中解析非常具体的信息,而不给出任何解释.根据`for /?`命令*将解析myfile.txt中的每一行,忽略以分号开头的行,将第2和第3个标记从每行传递给for body,并用逗号和/或空格分隔标记*. (24认同)
  • 您的示例来自 cmd.exe 的帮助。您应该为此添加提示或复制整个描述。 (4认同)

jeb*_*jeb 36

FOR-LOOP通常有效,但存在一些问题.FOR不接受空行,超过~8190的行是有问题的.如果禁用延迟扩展,则扩展仅可靠.

CR/LF与单LF的检测似乎也有点复杂.
NUL字符也是有问题的,因为FOR-Loop立即取消了阅读.

因此,直接二进制读取几乎是不可能

空行的问题可以用技巧解决.使用findstr命令为每行添加行号,并在读取后删除前缀.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)
Run Code Online (Sandbox Code Playgroud)

在启用和禁用延迟扩展之间切换是必要的,以便安全地使用字符串,例如!^^^xy!z.
这是因为该行set "var=%%a"仅在使用DisabledDelayedExpansion时是安全的,否则会删除感叹号并将插入符号用作(辅助)转义字符,它们也会被删除.
但是使用变量var只对EnabledDelayedExpansion是安全的,因为即使是一个call %%var%%会失败的内容,如"&"&.

编辑:添加了set/p变体
有第二种方式读取文件set /p,唯一的缺点是每行限制为~1024个字符,并删除行尾的控制字符.
但优点是,您不需要延迟切换,并且更容易将值存储在变量中

@echo off
setlocal EnableDelayedExpansion
set "file=%~1"

for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"

<%file% (
  for /l %%l in (1 1 !len!) do (
    set "line="
    set /p "line="
    echo(!line!
  )
)
Run Code Online (Sandbox Code Playgroud)

将其读取为"二进制"为十六进制表示
您可以查看SO:使用批处理文件将二进制文件转换为HEX表示


小智 8

一种非常简单的方法是使用以下命令:

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%
Run Code Online (Sandbox Code Playgroud)

这只会显示文本文件中的第一行文本。另一种方法是使用以下命令:

type %pathtotextfile%\textfile.txt
Run Code Online (Sandbox Code Playgroud)

这会将所有数据放在屏幕上的文本文件中。希望这可以帮助!