我正在使用以下代码(批处理文件)从属性文件逐行读取到另一个文件。问题是它正在从源文件中删除所有空行。为了使空白行可用于目标文件,我应该做些什么更改?
FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.SRC"`) DO (
ECHO %%A>>"%FILE%"
)
答案 0 :(得分:2)
FOR / F将始终跳过空行,因此您必须避免空行。
这可以通过使用findstr或find前缀行号来解决。
然后您只需要删除行号。
(
setlocal DisableDelayedExpansion
for /F "delims=" %%L in ('findstr /n "^" "%FILE%.src"') do (
set "line=%%L"
setlocal EnableDelayedExpansion
set "line=!line:*:=!"
echo(!line!
endlocal
)
) > "%FILE%"
延迟扩展模式的切换是必要的,因为您需要延迟扩展以将行号删除到第一个冒号。
但是你需要禁用扩展来将%% L转移到行变量,否则它会破坏感叹号,有时会删除插入符号。
阅读文件的set/p
技术是一种不同的方法,在SO:Batch files: How to read a file?
答案 1 :(得分:0)
set SOMEUSELESSVAR=Nonsense
set PRINT=false
set DoPRINT=false
setlocal DisableDelayedExpansion
for /F "delims=" %%a in ('findstr /n "^" "%~f0"') do (
set "OUTPUT=%%a"
setlocal EnableDelayedExpansion
set "OUTPUT=!OUTPUT:ReplaceSomeText=WithSomeOtherTextIfYouNeed!"
set "OUTPUT=!OUTPUT:*:=!"
if !OUTPUT!==:TEXT_End (
goto TEXT_End
)
if !PRINT!==true (
echo(!OUTPUT!>>File.txt
set DoPRINT=true
)
if !OUTPUT!==:TEXT_Start (
set DoPRINT=true
set PRINT=true
)
if !DoPRINT! EQU true (
endlocal & set PRINT=true& set DoPRINT=true
) else (
endlocal
)
)
goto TEXT_End
:TEXT_Start
%SOMEUSELESSVAR%
!SOMEUSELESSVAR!
;SOMEUSELESSVAR
REM SOMEUSELESSVAR
^^SOMEUSELESSVAR
^SOMEUSELESSVAR
SOMEUSELESSVAR
:TEXT_End
pause
exit
这将从.TEXT_Start到:TEXT_End之间读取 .bat文件中的文本,并将不带标签(:TEXT_Start和:TEXT_End)的文本打印到File.txt中,然后继续执行以下代码: TEXT_End。它将保留空白行和变量,无论如何都不会扩展,并且注释将按原样打印。如果需要在子目录或任何其他目录中使用File.txt,则可以直接应用路径,也可以使用某些%path%变量。这将在Windows 7上运行,也许会或多或少。要使用其他输入文件读取%〜f0的行并替换为有效的文件路径,并根据需要调整:TEXT_Start和:TEXT_End标签。如果您需要替换文本,则可以调整行'设置“ OUTPUT =!OUTPUT:ReplaceSomeText = WithSomeOtherTextIfYouNeed!”。 '根据需要,并以相同的方式在行'之前添加更多替换“过滤器”,设置“ OUTPUT =!OUTPUT::=!” '。如果您在此类替换过滤器中使用特殊字符,则可能必须通过在特殊字符od前面加上^来加倍对特殊字符od进行转义。
编辑:没有添加过滤器功能以明确可以替换文本的位置。