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

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

453273 次浏览

在 NT 样式的 cmd.exe 下,可以使用

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

在命令提示符上输入“ help for”以获得更多信息。(不知道它是否适用于你使用的任何“ DOS”)

可以使用 for 命令:

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

类型

for /?

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

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"只有在使用 禁用延迟扩展时才是安全的,否则感叹号将被删除,插入符号被用作(次要的)转义字符,它们也将被删除。
但是只有在使用 启用延迟扩展时使用变量 var才是安全的,因为即使是 call %%var%%也会在使用像 "&"&这样的内容时失败。

编辑: 增加设置/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!
)
)

把它“二进制”读成十六进制
您可以查看 < a href = “ https://stackoverflow. com/a/4648636/463115”> SO: 使用批处理文件将二进制文件转换为 HEX 表示

Well theres a lot of different ways but if you only want to DISPLAY the text and not STORE it anywhere then you just use: findstr /v "randomtextthatnoonewilluse" filename.txt

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

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

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

type %pathtotextfile%\textfile.txt

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

更正代码:

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

settings.ini

name="John"
lastName="Doe"

Script bat

@echo off
for /f "tokens=1,2 delims==" %%a in (settings.ini) do (
if %%a==name set %%a=%%b
if %%a==lastName set %%a=%%b
)


echo %name% %lastName%