从一个文件读到另一个文件时保持空行不变

时间:2014-02-21 12:01:20

标签: batch-file command

我正在使用以下代码(批处理文件)从属性文件逐行读取到另一个文件。问题是它正在从源文件中删除所有空行。为了使空白行可用于目标文件,我应该做些什么更改?

FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.SRC"`) DO (
  ECHO %%A>>"%FILE%"
)

2 个答案:

答案 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进行转义。

编辑:没有添加过滤器功能以明确可以替换文本的位置。