遍历文件保存到变量
loop through file saving to variable
我现在可以使用以下 bat 文件(它允许将文本添加到文件每一行的末尾)——另请参阅:
@echo off
setLocal EnableDelayedExpansion
IF EXIST "%FileToModify1%" (
for /f "tokens=* delims= " %%a in (%FileToModify1%) do (
echo %%a Note: certain conditions apply >> "%SaveFile1%"
)
)
但是,我想将每一行保存到一个变量(包括新行符号),然后在最后将该变量回显到一个文件中。由于文件中有几行,因此每行都保存到一个文件中确实效率低下。
我尝试用谷歌搜索这个,但答案不适合我的情况...
本质上,我需要用于连接和保存到变量的语法(累积起来就像 C# 中的“+=”),以及使用新行...
您可以一次性写入输出文件:
(
for /l %%i in (0,1,10) do (
echo line %%i
)
)>outfile.txt
(比分别追加每一行要快得多)
其实你不需要把所有的东西都放到一个变量里,你只需要将重定向放在另一个位置即可。
试试这个:
@echo off
setlocal EnableDelayedExpansion
if exist "%FileToModify1%" (
for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
echo %%a Note: certain conditions apply
)
) > "%SaveFile1%"
endlocal
请注意,原文件中的空行会被for /F
忽略,因此它们不会转移到新文件中。以 ;
开头的行也会被 for /F
忽略(除非您更改 eol
选项——参见 for /?
)。
我修改了for /F
选项:
- 不允许
delims
,因此每行按原样输出(使用 "tokens=* delims= "
,如果存在,则从每行中删除前导空格);
usebackq
允许将文件规范包围在 ""
中,这在包含空格时很有用;
附录 A
如果你还想把文件内容存储到一个变量中,你可以这样做:
@echo off
setlocal EnableDelayedExpansion
rem the two empty lines after the following command are mandatory:
set LF=^
if exist "%FileToModify1%" (
set "FileContent="
for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
set "FileContent=!FileContent!%%a Note: certain conditions apply!LF!"
)
(echo !FileContent!) > "%SaveFile1%"
)
endlocal
文件内容存储在变量FileContent
中,包括附录Note: certain conditions apply
。 LF
保留换行符。
注:
变量的长度非常有限(据我所知,自 Windows XP 以来为 8191 字节,而更早版本为 2047 字节)!
[参考文献:
Store file output into variable(最后一个代码片段);
Explain how dos-batch newline variable hack works]
附录 B
或者,您可以将文件内容存储在数组中,如下所示:
@echo off
setlocal EnableDelayedExpansion
if exist "%FileToModify1%" (
set /A cnt=0
for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
set /A cnt+=1
set "Line[!cnt!]=%%a Note: certain conditions apply"
)
(for /L %%i in (1,1,!cnt!) do (
echo !Line[%%i]!
)) > "%SaveFile1%"
)
endlocal
文件的每一行存储在数组Line[1]
、Line[2]
、Line[3]
等中,包括附录Note: certain conditions apply
。 cnt
包含总行数,即数组大小。
注:
实际上这不是真正的数组数据类型,因为它不存在于批处理中,它是具有数组样式命名的标量变量的集合(Line[1]
,Line[2]
,...);因此人们可能会称它为伪数组。
[参考文献:
Store file output into variable(第一个代码片段);
How to create an array from txt file within a batch file?]
我现在可以使用以下 bat 文件(它允许将文本添加到文件每一行的末尾)——另请参阅:
@echo off
setLocal EnableDelayedExpansion
IF EXIST "%FileToModify1%" (
for /f "tokens=* delims= " %%a in (%FileToModify1%) do (
echo %%a Note: certain conditions apply >> "%SaveFile1%"
)
)
但是,我想将每一行保存到一个变量(包括新行符号),然后在最后将该变量回显到一个文件中。由于文件中有几行,因此每行都保存到一个文件中确实效率低下。
我尝试用谷歌搜索这个,但答案不适合我的情况...
本质上,我需要用于连接和保存到变量的语法(累积起来就像 C# 中的“+=”),以及使用新行...
您可以一次性写入输出文件:
(
for /l %%i in (0,1,10) do (
echo line %%i
)
)>outfile.txt
(比分别追加每一行要快得多)
其实你不需要把所有的东西都放到一个变量里,你只需要将重定向放在另一个位置即可。 试试这个:
@echo off
setlocal EnableDelayedExpansion
if exist "%FileToModify1%" (
for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
echo %%a Note: certain conditions apply
)
) > "%SaveFile1%"
endlocal
请注意,原文件中的空行会被for /F
忽略,因此它们不会转移到新文件中。以 ;
开头的行也会被 for /F
忽略(除非您更改 eol
选项——参见 for /?
)。
我修改了for /F
选项:
- 不允许
delims
,因此每行按原样输出(使用"tokens=* delims= "
,如果存在,则从每行中删除前导空格); usebackq
允许将文件规范包围在""
中,这在包含空格时很有用;
附录 A
如果你还想把文件内容存储到一个变量中,你可以这样做:
@echo off
setlocal EnableDelayedExpansion
rem the two empty lines after the following command are mandatory:
set LF=^
if exist "%FileToModify1%" (
set "FileContent="
for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
set "FileContent=!FileContent!%%a Note: certain conditions apply!LF!"
)
(echo !FileContent!) > "%SaveFile1%"
)
endlocal
文件内容存储在变量FileContent
中,包括附录Note: certain conditions apply
。 LF
保留换行符。
注:
变量的长度非常有限(据我所知,自 Windows XP 以来为 8191 字节,而更早版本为 2047 字节)!
[参考文献:
Store file output into variable(最后一个代码片段);
Explain how dos-batch newline variable hack works]
附录 B
或者,您可以将文件内容存储在数组中,如下所示:
@echo off
setlocal EnableDelayedExpansion
if exist "%FileToModify1%" (
set /A cnt=0
for /F "usebackq delims=" %%a in ("%FileToModify1%") do (
set /A cnt+=1
set "Line[!cnt!]=%%a Note: certain conditions apply"
)
(for /L %%i in (1,1,!cnt!) do (
echo !Line[%%i]!
)) > "%SaveFile1%"
)
endlocal
文件的每一行存储在数组Line[1]
、Line[2]
、Line[3]
等中,包括附录Note: certain conditions apply
。 cnt
包含总行数,即数组大小。
注:
实际上这不是真正的数组数据类型,因为它不存在于批处理中,它是具有数组样式命名的标量变量的集合(Line[1]
,Line[2]
,...);因此人们可能会称它为伪数组。
[参考文献:
Store file output into variable(第一个代码片段);
How to create an array from txt file within a batch file?]