之前从sqlserver备份了大量存储过程,以每个存储过程一个文件的方式导出。格式如下:
数据库名称.架构名称.过程名称,如:ods_data.dbo.sp_etl_channelno.sql
通常这种文件名看起来比较麻烦,有的文件名长点的就被省略掉了。所以,希望能够将文件名的前缀都截掉,保留实际的存储过程名称即可。
如果只有几个文件,那可以直接手工修改。但是,如果有几十个上百个,手工处理就不那么让人愉快了。所以,这个时候就需要批处理出马。
那么,批处理该怎么做?
我的理解是,用for循环遍历出文件名,然后依次rename即可。所以,就有了如下代码:
for /F %%i in('dir *.sql') do (
rename %%i %i:~13%
)
跑了之后,发现不对。开始以为是字符串截取的语法写错了。查了下,没错。于是上网找案例。发现很多重命名的案例都会出现感叹号引用变量的情况,不明白为何意。
于是又搜索“批处理 感叹号”的关键字,结果出来有关变量延迟扩展的概念,再补习了下这块概念。
发现微软对于DOS脚本语言的支持确实比较弱,好好的一段代码,硬是被解释器解释的奇奇怪怪,再到让人诟病的for循环语法,让人无法理解。
好了,言归正传,学习了变量延迟扩展的概念后,就知道为什么我的for循环用不了了。
首先,申明要变量延迟扩展:
setlocal ENABLEDELAYEDEXPANSION
然后,告诉解释器,变量在什么情况下要延迟(即感叹号代替百分号引用),如:
set b=!b:~1!
完整的代码如下(截取13位以后的文件名):
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f %%a in ('dir /b *.sql') do (
set b=%%a
set b=!b:~13!
ren "%%a" "!b!"
)
pause
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12932950/viewspace-1437270/
,如需转载,请注明出处,否则将追究法律责任。