dos批量处理文件更名

需求:从文件夹中,可能有子文件夹中将所有文件更名

 

------------------------------------------------------------------

dos bat脚本

@echo off
for /f "delims=" %%i in ('dir /A-D /S/B D:\test ') do  (     ---------A-D过滤文件夹只保留文件
setlocal EnableDelayedExpansion          -------------调整为全局变量,下面可用!b!访问
set b=%%~ni
echo %%i
ren %%i !b!a.sql                                          -------------拼接字符窜,也可以连接日期%date%
)

----------------------------------------------------------------------

 

@echo off
for /f "delims=" %%i in ('dir /A-D /S/B D:\test ') do  (  
setlocal EnableDelayedExpansion          -------------调整为全局变量,下面可用!b!访问
set b=%%~ni
echo %%i
ren %%i!b :~0,-1!.sql                                   -------------截取字符窜,截掉一个字符

 

运行结果如下

 

------------------------------------------------------------

参考资料

setlocal EnableDelayedExpansion 命令咨询

这条语句的意思是:启用变量延迟。

      关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽,而且有数个代码示例,应该不难理解。在此仅略作一些补充。

      在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。

      而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。

      而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。

      因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非for语句内部。
     
      而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。

      延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off(此处说法有误,应为 CMD /v:on——namejm 注),它会打开一个新的命令行外壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。

     注:你可能用在for语句内部或者goto循环中,使得 setlocal enabledelayedexpansion 语句被执行了32次以上——当 setlocal 语句被执行32次以上时,就会达到它的最大递归层,从而引发错误。避免这个错误的办法就是:避免在for中或goto循环中的执行次数超过32次,或者在超过32次前用 endlocal 终止 setlocal 。

@echo off
for /l %%a in (1 1 50) do (
        set num=%%a
        setlocal enabledelayedexpansion
        echo !num!
)
pause
显示到32会出错

@echo off
for /l %%a in (1 1 50) do (
set num=%%a
setlocal enabledelayedexpansion
echo !num!
endlocal
)
pause
可完全显示

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值