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的用法,其他命令也是。善用这些文档,祝你更快成长。