繁体   English   中英

跳过标题行并在批处理脚本中替换文本文件中的字符串

[英]skip header line and replace string in text file in batch script

@echo off     
setlocal enableextensions disabledelayedexpansion    
for /r %f in (xis_a*) do  More +1 %~nxf >> No_header_%~nxf    
set "search=:20:"

    set "replace={:20:"
    for /f "delims=" %%i in ('type (No_header_*.txt) ^& break ^> (No_header_*.txt) ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        set "line=!line:%search%=%replace%!"
        >>No_header_*.txt echo(!line!
        endlocal
    )

正在尝试跳过文本文件中的标题行,并用{:20:替换:20:。 我已经写过并且几乎取得了成就..请尝试帮助我这个新手

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
set "search=:20:"
set "replace={:20:"

for /r "%sourcedir%" %%f in (xis_a*) do (
 REM DEL "%destdir%\No_header_%%~nf.txt" >NUL 2>nul
 for /f "usebackqskip=1delims=" %%i in ("%%f") do (
  set "line=%%i"
  setlocal enabledelayedexpansion
  set "line=!line:%search%=%replace%!"
  >>"%destdir%\No_header_%%~nf.txt" echo(!line!
  ENDLOCAL
 )
)

GOTO :EOF

这应该可以解决问题。

在您的代码中,初始setlocal建立了默认条件,因此我省略了它。

你必须%f在你的'for /r -的%的metavariable前f需要加倍。

不需要more仪式- for /f有一个skip选项,将允许skip前n行。

因此-所需要做的就是获取由for...%%f...循环生成的文件列表,并与每个文件一起处理每个文件,跳过第一行。 引用出现在%%f的文件名只是一种安全措施,允许包含分隔符的文件名,但这意味着需要调用usebackq来告诉for /f给出的列表不是文字字符串(它将假定为(带引号的字符串)),但文件名。

然后,由于%%f%%i循环的上下文,因此可以使用%%~nf选择目标文件名。 我不知道你是否希望~nf~nxf (添加第二个.txt扩展名),所以我选择使用~n孤独。 请注意,您对*的使用注定会失败-这意味着“所有文件都匹配”-可能与您想要的不完全相同, cmd会变得非常混乱。

我已经添加了一个remmed-out del命令,以允许删除目标文件-如果需要,只需删除rem ,否则数据将被附加到任何现有文件中。

我使用u:驱动器进行测试,并保留了源名称和目标名称。 毫无疑问,您将需要更改它们以适合您的系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM