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’’)