如何从批处理文件读取文件(文本或二进制)?有没有办法以二进制模式或文本模式读取它?
TYPE [fileName]
用于MS-Dos。
如何从批处理文件读取文件(文本或二进制)?有没有办法以二进制模式或文本模式读取它?
TYPE [fileName]
用于MS-Dos。
Answers:
您可以使用for命令:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
类型
for /?
在命令提示符下。另外,您可以解析ini文件!
for /?
命令,将解析myfile.txt中的每一行,而忽略以分号开头的行,将第二和第三令牌从每一行传递到for主体,并以逗号和/或空格分隔。
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
从文本文件中获取第一行
0x1A
呢?确实for /F
的行为方式与NUL(同0x00
)字符?
:
或;
或包含开头,也是万无一失的!
更正的代码:
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
应使用引号,并且不切换延迟的扩展模式,代码无法读取感叹号