ITPub博客

首页 > Linux操作系统 > Linux操作系统 > windows批处理之七-变量延迟扩展与文件重命名

windows批处理之七-变量延迟扩展与文件重命名

原创 Linux操作系统 作者:regonly1 时间:2015-02-16 14:46:25 0 删除 编辑
之前从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博客 ” ,链接:http://blog.itpub.net/12932950/viewspace-1437270/,如需转载,请注明出处,否则将追究法律责任。

下一篇: ORADEBUG使用详解
请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1067162