DOS教学帖:复制不同文件夹下的同名文件至同一文件夹下并自动重命名的批处理
2011-02-01 16:23
537 查看
@echo off
setlocal enabledelayedexpansion //告诉CMD要启用延迟的环境变量
set count=0
for /f "delims=" %%a in ('dir /b /ad "C:/test/source"') do ( // /b使用空格式(无标题信息或摘要)/ad表示显示目录
set /a count+=1 // /a指定等号右边的字符串为数字表达式
copy /y "C:/test/source/%%a/log.txt" "C:/test/dest/log!count!.txt" // /y不使用确认是否要改写现有目标文件的提示
)
当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。
在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。
而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。
而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。
因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非for语句内部。
延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off,它会打开一个新的命令行外壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/doudou321/archive/2009/07/19/4358885.aspx
setlocal enabledelayedexpansion //告诉CMD要启用延迟的环境变量
set count=0
for /f "delims=" %%a in ('dir /b /ad "C:/test/source"') do ( // /b使用空格式(无标题信息或摘要)/ad表示显示目录
set /a count+=1 // /a指定等号右边的字符串为数字表达式
copy /y "C:/test/source/%%a/log.txt" "C:/test/dest/log!count!.txt" // /y不使用确认是否要改写现有目标文件的提示
)
当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。
在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。
而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。
而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。
因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非for语句内部。
延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off,它会打开一个新的命令行外壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/doudou321/archive/2009/07/19/4358885.aspx
相关文章推荐
- 复制文件时,文件夹中有同名的文件时,自动给文件重命名
- 用批处理文件自动备份文件及文件夹,并自动删除n天前的文件_DOS/BAT
- 模拟dos中的xcopy功能,实现文件的复制,当子文件夹不存在时自动创建
- Dos命令XCOPY在批处理文件中的应用,且生成的备份文件夹为年月日命名的
- 计算机应用第三次作业:自动开机自动关机 常用DOS命令 关于文件文件夹
- DOS下如何复制文件和文件夹
- Java遍历文件夹,重命名文件,删除文件,复制文件等操作
- Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
- 批处理解决实际问题1——将目录下所有文件(*.cpp)分别创建同名文件夹并移入其中
- 通过Robocopy+DOS 命令+Windows排程实现自动备份(将特定文件/目录备份至自动创建的以年月日命名的目标目录)
- 尝试为文件 F:\visual studio 2010\bkbs\paperCMS\App_Data\Project.mdf 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
- 附加自动命名的数据库失败,已存在同名数据库或制定文件无法打开!
- 用批处理实现文件所在文件夹同名
- 用批处理文件自动备份文件及文件夹,并自动删除n天前的文件
- 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中[解决方法]
- 文件操作 复制移动删除重命名文件文件夹(转帖)
- Dos命令复制文件夹到制定目录 删除指定目录及其文件夹下的文件
- 写一个脚本,对一个文件夹内指定格式的文件做重命名处理,要求:重命名为数字编号从1开始,当有新增文件的时候,自动重名并跟随末尾编号格式,中间删减的时候,末尾名称自动改名补回空缺序号
- 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中[解决方法]
- 用批处理实现文件所在文件夹同名