zoukankan      html  css  js  c++  java
  • bat应用----删除前三行、合并文件

    我有两个文件夹Types和TypeBodies,里面有同名的文件(后缀不同),否则只在Types里面。我需要删除每个文件里面前三行注释的内容,然后把TypeBodies的文件内容放到Types里的同名文件后。

    • 删除所有文件的前三行
    @echo off&setlocal enabledelayedexpansion
    rem 删除Types、TypeBodies文件夹里的前三行
    rem 遍历TypeBodies中的所有文件
    for /r .TypeBodies %%i in (*) do (
    	echo %%i
    	rem 按行读取文件内容,跳过前三行;'findstr .* %%i'查找文件所有内容,包括空格和空行
    	for /f "skip=3 delims=" %%j in ('findstr .* %%i') do (
    		rem 按行写到$
    		echo;%%j>>$
    	)
    	rem 把$中内容写到原文件
    	move $ %%i
    )
    pause
    
    • 合并同名文件
    @echo off&setlocal enabledelayedexpansion
    rem 把TypeBodies里的文件复制到Type的同名文件后边
    rem 遍历Types里的文件
    for /r .Types %%i in (*) do (
    	echo %%~ni
    	rem 如果TypeBodies里存在同名文件,合并两个文件,并放到Types文件夹
    	if exist .TypeBodies\%%~ni.tpb copy /b %%i+.TypeBodies\%%~ni.tpb %%i
    )
    pause
    

    下面说说我对其中命令的理解:
    ▶echo off关闭屏显,就是下面的指令不会在屏幕上打出来,前边加个@,echo off也不会显示;
    ▶&表示命令都执行,前边执行失败,后边不执行;
    ▶setlocal enabledelayedexpansion表示变量延迟,下面的for循环会用到,使得每次循环%%i的值不一样;
    ▶for %%i in (1) do (2)是bat中的for循环,%%i是循环变量,(1)是需要循环的集合,(2)是每次循环需要执行的语句块,/r表示递归遍历,.表示当前目录,后边的反斜杠是文件夹分隔符,切记只能用反斜杠;
    ▶echo打印后边内容到屏幕;rem表示注释,后边的内容不执行;
    ▶下边一个for循环按行遍历文件内容,/f表示读取文件内容,skip=3表示跳过前三行,delims=表示分隔符为空,findstr表示查找字符串,.*表示任意字符重复任意遍,用这种方法能查找文件内所有字符,包括空格和空行;
    ▶echo;表示忽略输出到屏幕,>>表示输出,$只是一个变量;
    ▶move 表示移动内容到$;pause是暂停,屏幕显示输入任意字符以继续
    ▶%%~ni表示%%i中文件名(没有路径,没有后缀),后边加.tpb表示字符拼接;
    ▶copy 把前边内容复制到后边文件,+表示两个文件拼接,/b表示是二进制文件,此处避免生成的文件后边有特殊字符

    ----华丽分割线---------------------------------------------------------------------------------------------

    这里贴出我学习中用到的测试代码,相对更入门一点儿

    • 提取文件内容
    @echo off&setlocal enabledelayedexpansion
    rem 从list.sql中读取文件列表,把所有文件合并到同一个文件
    rem 遍历文件中的所有文件名,排除含有--的行,去掉字符“;”,“@”
    for /f "delims=;@" %%i in ('findstr /v "--" "list.sql"') do (
    	echo %%i
    	rem 按行读取文件中所有内容
    	for /f "delims=" %%j in ('findstr .* %%i') do (
    		rem echo %%j
    		rem 写入内容到$
    		echo;%%j>>$	
    	)
    )
    rem 把$中内容移到temp.txt中
    move $ temp.txt
    pause
    

    注:其中findstr后边的/v,表示排除匹配的行,是转义字符(是findstr中的,bat中的转义字符是^)

    • 从一个文件中查找另一个文件中的同名文件
    @echo off&setlocal enabledelayedexpansion
    rem 在TypeBodies里查找Type里的同名文件
    rem 遍历types里的文件
    for /r ./Types %%i in (*) do (
    	rem 打印文件路径和名字带后缀
    	echo %%i
    	rem 打印文件路径
    	echo %%~pi
    	rem 打印文件名和后缀
    	echo %%~xni
    	rem 打印文件名
    	echo %%~ni
    	rem 打印后缀
    	echo %%~xi
    	pause
    	rem 如果存在同名文件在窗口里显示具体内容
    	if exist .TypeBodies\%%~ni.tpb type .TypeBodies\%%~ni.tpb
    )
    pause
    

    下边的几个文件操作不能保留空白字符和空行,请慎重

    • 复制内容到同名文件
    @echo off&setlocal enabledelayedexpansion
    echo 复制
    for %%j in (*.txt) do (
      echo %%j
      for /f %%i in (%%j) do (
      set a=%%i
      echo;!a!>>$
      )
      move $ %%j >nul 2>nul
    )
    pause
    

    注:>nul 2>nul能够使move操作不在窗口显示

    • 同名txt文件添加到sql文件后
    @echo off&setlocal enabledelayedexpansion
    rem 得到所有sql文件的文件名
    echo 把同名txt文件合并到sql文件后
    for %%i in (*.sql) do (
        echo %%i
        rem %%~in表示只取文件名
        for /f %%j in ('type %%~ni.txt') do (
    	echo;%%j >> %%i
        )
    )
    pause
    

    注:第二个循环里面的'type %%ni.txt'如果换成%%ni.txt则找不到a.txt文件,具体原因不知道。。。type命令是在窗口显示文件内容

    • 删除文件第一行
    @echo off&setlocal enabledelayedexpansion
    set file=aa.txt
    echo 删除第一行
    for /f "skip=1" %%i in (%file%) do (
    set a=%%i
    echo;!a!>>$
    )
    move $ %file% >nul 2>nul
    pause
    
    • 删除文件最后一行
    @echo off&setlocal enabledelayedexpansion
    set file=aa.txt
    rem 删除文件最后一行,但多一个空行
    echo 删除最后一行
    for /f %%a in (%file%) do (
    echo;!var!
    set var=%%a
    )>> $
    @move $ %file% >nul 2>nul
    
    rem 删除多余的空行
    rem 删除第一行
    for /f "skip=1" %%i in (%file%) do (
    set a=%%i
    echo !a!>>$
    )
    @move $ %file% >nul 2>nul
    pause
    
    • 删除文件最后一行pro
    @echo off&setlocal enabledelayedexpansion
    set file=aa.txt
    rem 删除文件最后一行
    echo 删除最后一行
    for /f %%a in (%file%) do (
    rem 判断var被定义就输出
    if defined var echo;!var!
    set var=%%a
    )>> $
    @move $ %file% >nul 2>nul
    pause
    

    最后补充一点儿,!var!和%var%都表示取变量var的值,但!!取到变量延迟的值(可以理解是在循环里定义的变量的值);>和>>都是将内容输出,>表示清空里面内容再添加,>>表示在文件后添加
    注:在cmd命令窗,help显示大部分命令和其简短描述,rem /?显示rem的用法,其他命令也是。善用这些文档,祝你更快成长。

  • 相关阅读:
    C#流(stream)
    高并发图片(缩略图)处理中间层服务架构设计
    WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
    我们一起学习WCF 第六篇文件传输
    远程服务器返回了意外相应:(413) Request Entity Too Large。
    三层架构
    传说中的WCF(9):流与文件传输
    分享WCF文件传输---WCFFileTransfer
    分享基于EF+WCF的通用三层架构及解析
    Winform开发框架之框架演化
  • 原文地址:https://www.cnblogs.com/so-easy/p/10010401.html
Copyright © 2011-2022 走看看