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


97

如何从批处理文件读取文件(文本或二进制)?有没有办法以二进制模式或文本模式读取它?


@ RookieTEC9:是的,我知道它们是2个完全不同的东西,但是我需要一个在msdos而不是Windows nt(或更新版本)中可用的答案,这个问题也是7年前问的,请记住
Lucas Gabriel Sánchez15年

@ RookieTEC9:我认为你是对的,从那以后已经有一段时间了。我只是删除ms-dos标签
Lucas GabrielSánchez15年

1
您可以将命令TYPE [fileName]用于MS-Dos。
RookieTEC9 2015年

尝试了这一点,它的工作对我来说- stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Answers:


40

您可以使用for命令:

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

类型

for /?

在命令提示符下。另外,您可以解析ini文件


25
这是一个非常复杂的示例,它从特定格式的文本文件中解析出非常具体的信息,而没有给出任何解释。按照for /?命令,将解析myfile.txt中的每一行,而忽略以分号开头的行,将第二和第三令牌从每一行传递到for主体,并以逗号和/或空格分隔。
Martin Prikryl 2014年

2
您的示例来自cmd.exe的帮助。您应该为此添加提示或复制整个描述。
Th。Thielemann

70

在NT风格的cmd.exe下,您可以使用

FOR /F %i IN (file.txt) DO @echo %i

在命令提示符下键入“帮助”以获取更多信息。(不知道它是否可以在您使用的任何“ DOS”下运行)


22
应该是%%i
Jim Fell

32
如果找到空白字符,此命令将退出读取行。我最终使用FOR / F“ tokens = *” %% i IN(file.txt)DO @ECHO %% i
Jason

9
有用!如果使用的是bat文件,请尝试使用%i;如果使用的是bat文件,请尝试使用%i。
史蒂文·杜

41

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
)

为了安全地使用字符串(如!或),需要在启用和禁用延迟扩展之间切换^^^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!
  )
)

为了将其“二进制”读取为十六进制表示,
您可以看一下SO:使用批处理文件将二进制文件转换为HEX表示


感谢您使用的指针set /p。我曾经set /p value=< result.txt从文本文件中获取第一行
SteveC,2012年


EOF(文件结尾)字符ASCII 0x1A呢?确实for /F的行为方式与NUL(同0x00)字符?
aschipfl 2015年

@aschipfl我想0x1A在某些情况下的行为类似于换行(或者更好地将其转换为换行)。有没有一种方法可以在不使用临时文件的情况下创建SUB?
2015年

这应该是公认的答案,即使行以:;或包含开头,也是万无一失的!
HackingAddict1337

11

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

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%

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

type %pathtotextfile%\textfile.txt

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


1

嗯,有很多不同的方法,但是如果您只想显示文本而不是将其存储在任何地方,则可以使用: findstr /v "randomtextthatnoonewilluse" filename.txt


0

更正的代码:

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause

页面的主要代码。引号的位置不正确,该代码不适用于名称带有空格的文件。我的是。我在这里给了^^^^的窍门
Celes

您在文件名周围使用引号是正确的,但是您的代码存在一些问题:eol=并且delims=多余,set line=%%a应使用引号,并且不切换延迟的扩展模式,代码无法读取感叹号
jeb

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.