109

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

4

7 回答 7

76

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

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

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

于 2008-10-15T19:45:02.597 回答
43

FOR-LOOP 通常可以工作,但也有一些问题。FOR 不接受空行和超过 ~8190 的行是有问题的。如果延迟扩展被禁用,扩展只能可靠地工作。

CR/LF 与单个 LF 的检测似乎也有点复杂。
NUL 字符也是有问题的,因为 FOR 循环会立即取消读取。

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

空行的问题可以通过一个技巧来解决。使用 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
)

在启用和禁用延迟扩展之间切换对于安全使用字符串(如!or )是必要的^^^xy!z
这是因为该行set "var=%%a"仅在DisabledDelayedExpansion时是安全的,否则会删除感叹号,并且插入符号用作(辅助)转义字符并且它们也被删除。
但是只有EnabledDelayedExpansionvar才能安全地使用该变量,因为即使是 a也会因.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:使用批处理文件将二进制文件转换为十六进制表示

于 2010-12-25T17:54:47.933 回答
39

您可以使用 for 命令:

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

类型

for /?

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

于 2008-10-15T19:47:00.003 回答
15

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

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

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

type %pathtotextfile%\textfile.txt

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

于 2017-08-10T23:28:37.983 回答
1

好吧,有很多不同的方法,但是如果您只想显示文本而不想在任何地方存储它,那么您只需使用:findstr /v "randomtextthatnoonewilluse" filename.txt

于 2016-09-13T21:32:02.830 回答
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
于 2019-06-14T14:29:18.527 回答
-6

在屏幕上显示 myfile.txt 文件内容的代码

设置 %filecontent%=0
类型 %filename% >> %filecontent%
echo %filecontent%

于 2018-10-18T15:29:02.733 回答