1.问题说明
有批量修改mapper文件的需求,从MySQL数据库语法修改到PostgreSQL语法。
2.实例分享
核心代码为:
@echo off
setlocal EnableDelayedExpansion
set "strOld=STR_TO_DATE"
set "strNew=TO_TIMESTAMP"
for /f %%i in ('dir /b /s /a:-d *.xml') do (
pwsh -Command "
(gc %%i) -replace '%strOld%', '%strNew%' | Out-File %%i -Encoding utf8
"
)
主要使用到的函数:
- dir
- gc
- replace
- Out-File
这里做个说明,powershell
为低版本,pwsh
是高版本,由于处理的文件里有utf8
编码的中文,实用低版本的编码格式会转行成utf8bom
格式导致乱码,故实用高版本。版本升级可去【官网下载】。
# 使用到的
# 1.只显示下面所有的文件的文件名称信息 /B
DIR /B
# 2.显示所有子文件夹 /S
DIR /S
# 3.只显示文件 /A:-D
DIR /A:-D
# 4.组合使用,显示子文件夹下所有文件名称
DIR /B /S /A:-D
# 未使用的
# 1.显示帮助
DIR /?
# 2.只显示文件夹 /A:D
DIR /A:D
# 未使用的各种组合
# 1.组合使用,显示所有子文件夹下的文件
DIR /S /A:-D
# 2.组合使用只显示所有子文件夹 /A:D
DIR /S /A:D
# 3.组合使用,显示所有子文件夹名称
DIR /B /S /A:D
# 4.把命令行执行结果输出到文件 >[filename]
DIR /B >file01.txt
# 5.组合使用
DIR /B /S /A:-D >file01.txt
# 6.文件的创建时间、修改时间和访问时间 /T:C /T:A /T:W
DIR /T:C /A:-D
2.1 特殊字符%处理
@echo off
setlocal EnableDelayedExpansion
:: (1)替换 STR_TO_DATE 函数为 TO_TIMESTAMP
set "strOld1=STR_TO_DATE"
set "strNew1=TO_TIMESTAMP"
echo (1)Replac: STR_TO_DATE TO TO_TIMESTAMP
:: (2)替换 str_to_date 函数为 to_timestamp
set "strOld2=str_to_date"
set "strNew2=to_timestamp"
echo (2)Replac: str_to_date TO to_timestamp
:: (3)替换日期格式 %Y-%m-%d %H:%i:%s 为 YYYY-MM-DD hh24:mi:ss
set "strOld3=%%Y-%%m-%%d %%H:%%i:%%s"
set "strNew3=YYYY-MM-DD hh24:mi:ss"
echo (3)Replac: %%Y-%%m-%%d %%H:%%i:%%s TO YYYY-MM-DD hh24:mi:ss
for /f %%i in ('dir /b /s /a:-d *.xml') do (
pwsh -Command "(gc %%i) -replace '%strOld1%', '%strNew1%' -replace '%strOld2%', '%strNew2%' -replace '!strOld3!', '%strNew3%' | Out-File %%i -Encoding utf8 "
)
%
也是转义字符,MySQL的日期里也有%Y-%m-%d %H:%i:%s
,这里要进行特殊处理,注意'!strOld3!'
替换的时候用的不是%%
而是用的!!
。
2.2 括号()及成对单引号处理’’
:: (4)替换 sysdate() 函数为 to_timestamp ( '' || now( ), 'YYYY-MM-DD hh24:mi:ss' )
set "strOld=sysdate\(\)"
set "strNew=to_timestamp(now() || '''',''YYYY-MM-DD hh24:mi:ss'')"
echo (4)Replac: "sysdate() TO to_timestamp (now()||'', 'YYYY-MM-DD hh24:mi:ss')"
for /f %%i in ('dir /b /s /a:-d *.xml') do (
pwsh -Command "(gc %%i) -replace '!strOld!', '!strNew!' | Out-File %%i -Encoding utf8 "
)
- sysdate\(\)
- to_timestamp(now() || ‘’‘’,‘‘YYYY-MM-DD hh24:mi:ss’’)