如何从批处理文件中读取文件(文本或二进制文件)?有没有一种方法可以在二进制模式或文本模式下读取它?
在NT-style的cmd.exe环境下,你可以使用以下代码循环遍历文本文件中的每一行:
FOR /F %%i IN (file.txt) DO @echo %%i
在命令提示符上键入"help for"以获取更多信息(不知道你正在使用的任何"DOS"是否有效)。
FOR循环通常有效,但存在一些问题。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
)
在处理字符串时,如!
或^^^xy!z
,必须在启用和禁用延迟扩展之间切换。这是因为只有在DisabledDelayedExpansion的情况下,才可安全使用set "var=%%a"
这行代码,否则感叹号将被删除,插入符号将被用作(二级)转义字符并也会被删除。
但是,仅在EnabledDelayedExpansion的情况下,使用变量var
是安全的,因为即使像"&"&
这样的内容使用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:使用批处理文件将二进制文件转换为十六进制表示
set /p
的指导。我使用了 set /p value=< result.txt
从文本文件中获取第一行。 - SteveC0x1A
怎么办?for /F
与NUL(0x00
)字符的行为是否相同? - aschipfl:
或 ;
开始或包含 !
。 - ScriptKidd你可以使用for命令:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
类型
for /?
在命令提示符处。此外,您可以解析ini文件!
for /?
命令的说明,该命令会解析myfile.txt中的每一行,忽略以分号开头的行,并将每行的第二个和第三个标记传递到for循环体中,标记由逗号和/或空格分隔。 - Martin Prikryl有一个非常简单的方法,就是使用以下命令:
set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%
这将仅显示文本文件中的第一行。您可以使用以下命令进行操作:
type %pathtotextfile%\textfile.txt
这将把文本文件中的所有数据放在屏幕上。希望能帮到您!
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%
有很多种方法,但如果你只想显示文本而不想在任何地方存储它,那么你只需使用:findstr /v "randomtextthatnoonewilluse" filename.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
eol=
和 delims=
是多余的,set line=%%a
应该使用引号。此外,如果不切换延迟环境变量扩展模式,代码不能读取感叹号。 - jeb
TYPE [fileName]
。 - Roke