Windows 批处理文件-在文件中插入行
我正在尝试使用以下代码(从)将一行插入到文件中 我的问题是该文件有注释行(以分号开头),需要保留这些注释行Windows 批处理文件-在文件中插入行,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在尝试使用以下代码(从)将一行插入到文件中 我的问题是该文件有注释行(以分号开头),需要保留这些注释行 ; directory during network startup. This statement must indicate a local disc ; drive on your PC and not a network disc drive. LOCALDRIVE=C:\TEMP; ; PANELISATION PART/NET NAMING CONVENTION ; When
; directory during network startup. This statement must indicate a local disc
; drive on your PC and not a network disc drive.
LOCALDRIVE=C:\TEMP;
; PANELISATION PART/NET NAMING CONVENTION
; When jobs are panelised, parts/nets are renamed for each panel step by
当我运行批处理文件时,它会忽略分号行,因此我只得到:
LOCALDRIVE=C:\TEMP;
要保留分号行,我需要做什么?看起来您只回显了行分隔符,而不是整行: echo%%l>>%tempfile%
我对ms dos脚本很生疏,所以我不能给你更多的信息。看起来你只是在回显行分隔符,而不是整行: echo%%l>>%tempfile%
我对ms dos脚本很生疏,所以我不能给你更多的信息。看起来你只是在回显行分隔符,而不是整行: echo%%l>>%tempfile%
我对ms dos脚本很生疏,所以我不能给你更多的信息。看起来你只是在回显行分隔符,而不是整行: echo%%l>>%tempfile%
我对ms dos脚本很生疏,所以我不能给你更多的信息。默认情况下,
FOR
命令处理
作为行尾字符,因此所有以开头的行代码>正在被忽略
将eol=
添加到FOR
命令中,如下所示:
for /f "eol= delims=" %%l in (%inputfile%) do (
默认情况下,FOR
命令处理
作为行尾字符,因此所有以开头的行代码>正在被忽略
将eol=
添加到FOR
命令中,如下所示:
for /f "eol= delims=" %%l in (%inputfile%) do (
默认情况下,FOR
命令处理
作为行尾字符,因此所有以开头的行代码>正在被忽略
将eol=
添加到FOR
命令中,如下所示:
for /f "eol= delims=" %%l in (%inputfile%) do (
默认情况下,FOR
命令处理
作为行尾字符,因此所有以开头的行代码>正在被忽略
将eol=
添加到FOR
命令中,如下所示:
for /f "eol= delims=" %%l in (%inputfile%) do (
EOL选项确定要忽略的行。默认值是分号。如果您知道一个字符永远不会出现在行的第一个位置,那么您可以简单地将EOL设置为该字符。例如,如果您知道一行不能以|
开头,则可以使用
for /f "eol=| delims=" %%l in (%inputfile%) do ...
有一种笨拙的语法完全禁用了EOL,也禁用了DELIMS:
for /f delims^=^ eol^= %%l in (%inputfil%) do ...
请注意,FOR/F始终丢弃空行,因此上述任一情况都会导致:
; directory during network startup. This statement must indicate a local disc
; drive on your PC and not a network disc drive.
LOCALDRIVE=C:\TEMP;
; PANELISATION PART/NET NAMING CONVENTION
; When jobs are panelised, parts/nets are renamed for each panel step by
如果要保留空行,则需要使用技巧。使用FIND或FINDSTR在每行之前插入行号,然后使用展开查找/替换删除行号。现在你知道了,这一行永远不会以开头代码>,因此您可以忽略EOL选项
for /f "delims=" %%L in ('findstr /n "^" "%inputfile%"') do (
set "ln=%%L"
set "ln=!ln:*:=!"
REM You now have the original line, do whatever needs to be done here
)
但是以上所有内容都有一个潜在的问题,即在扩展FOR变量时启用了延迟扩展,这意味着任何包含的内容代码>将被损坏。要解决此问题,必须在循环中打开和关闭延迟扩展:
setlocal disableDelayedExpansion
...
for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
set "ln=%%L"
setlocal enableDelayedExpansion
set "ln=!ln:*:=!"
REM You now have the original line with ! preserved, do whatever needs done here
endlocal
)
此外,当回显空行时,它将打印出ECHO处于关闭状态
,除非您执行以下操作
echo(!ln!
每次在循环中使用>
时,打开并将写入光标定位到末尾都需要时间。将整个操作括在一组括号中并重定向一次会更快。此外,还可以使用单个移动命令替换DEL和REN
下面是最后一个健壮的脚本:
@echo off
setlocal disableDelayedExpansion
set "inputfile=variables.txt"
set line=0
>"%inputfile%.new" (
for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
set "txt=%%L"
set /a line+=1
setlocal enableDelayedExpansion
set "txt=!txt:*:=!"
if !line! equ 4 (
echo New line content here
) else (
echo(!txt!
)
endlocal
)
)
move /y "%inputfile%.new" "%inputfile%" >nul
endlocal
对于这样一项简单的任务来说,这是一项非常艰巨的工作,它需要大量的神秘知识
有一个更快的黑客,只要
- 前4行不超过1021字节
- 前3行都没有需要保留的尾随控制字符
- 其余的行没有必须保留的
字符(更多的行将
转换为空格字符串)
@echo关闭
setlocal enableDelayedExpansion
设置“inputfile=variables.txt”
>%inputfile%。新建(
EOL选项确定要忽略的行。默认值为分号。如果您知道某个字符永远不会出现在行的第一个位置,则可以简单地将EOL设置为该字符。例如,如果您知道某行不能以|
开头,则可以使用
for /f "eol=| delims=" %%l in (%inputfile%) do ...
有一种笨拙的语法完全禁用了EOL,也禁用了DELIMS:
for /f delims^=^ eol^= %%l in (%inputfil%) do ...
请注意,FOR/F始终丢弃空行,因此上述任一情况都会导致:
; directory during network startup. This statement must indicate a local disc
; drive on your PC and not a network disc drive.
LOCALDRIVE=C:\TEMP;
; PANELISATION PART/NET NAMING CONVENTION
; When jobs are panelised, parts/nets are renamed for each panel step by
如果要保留空行,请使用技巧。使用“查找”或“查找”命令在每行之前插入行号,然后使用“扩展查找/替换”删除行号。现在您知道该行从不以;
开头,因此可以忽略下线选项
for /f "delims=" %%L in ('findstr /n "^" "%inputfile%"') do (
set "ln=%%L"
set "ln=!ln:*:=!"
REM You now have the original line, do whatever needs to be done here
)
但上述所有问题都存在一个潜在问题,即在展开FOR变量时启用了延迟展开,这意味着任何包含!
的内容都将被损坏。要解决此问题,必须在循环中打开和关闭延迟展开:
setlocal disableDelayedExpansion
...
for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
set "ln=%%L"
setlocal enableDelayedExpansion
set "ln=!ln:*:=!"
REM You now have the original line with ! preserved, do whatever needs done here
endlocal
)
此外,当回显空行时,它将打印出ECHO处于关闭状态
,除非您执行以下操作
echo(!ln!
每次在循环中使用>
时,打开并将写入光标定位到末尾都需要时间。将整个操作括在一组括号中并重定向一次会更快。此外,您还可以使用单个移动命令替换DEL和REN
下面是最后一个健壮的脚本:
@echo off
setlocal disableDelayedExpansion
set "inputfile=variables.txt"
set line=0
>"%inputfile%.new" (
for /f "delims=" %%L in (findstr /n "^" "%inputfile%") do (
set "txt=%%L"
set /a line+=1
setlocal enableDelayedExpansion
set "txt=!txt:*:=!"
if !line! equ 4 (
echo New line content here
) else (
echo(!txt!
)
endlocal
)
)
move /y "%inputfile%.new" "%inputfile%" >nul
endlocal
对于这样一项简单的任务来说,这是一项非常艰巨的工作,它需要大量的神秘知识
有一个更快的黑客,只要
- 前4行不超过1021字节
- 前3行都没有需要保留的尾随控制字符
- 其余的行没有必须保留的
字符(更多的行将
转换为字符串)