从文件名中间到开头复制字符串

时间:2014-01-23 05:27:53

标签: batch-file cmd filenames rename

拥有2,000个文件,每个文件包含51-62个字符长的文件名。对于每个文件名,我想将位置14-23中的字符拉伸添加到文件名的最开头。 (文件名字符类型和模式是可变的,因此重命名必须基于文件名开头的位置计数。) Windows 7,命令提示符FCIV解决方案首选。

例如:

原:

ABCDEFGHIJKLM的 No0123456p 8901234567890.ext

新:

No0123456p ABCDEFGHIJKLM的 No0123456p 8901234567890.ext

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\folder"
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*" '
 ) DO (
 SET "name=%%a"
 CALL :transform
)

GOTO :EOF

:transform
ECHO REN "%sourcedir%\%name%" "%name:~13,10%%name%"
GOTO :eof

为了测试目的,所需的REN命令仅为ECHO。在您确认命令正确无误后,将ECHO REN更改为REN以实际重命名文件。

变量sourcedirset,指向感兴趣的目录。通过设置变量,可以在一个位置更改目录名,而不是在多个位置使用目录名在多个位置进行编辑。 set "var=value"语法确保该行上的任何尾随空格不包含在分配的值中。

dir命令在目标目录中生成文件名列表/b表示“仅文件名 - 没有标题/尾部行,没有日期,时间大小 - 只有文件名”/a-d表示“并且没有目录名称”

此列表内置于内存中,然后由for/f逐行读取。 "delims="确保将整行应用于元变量%%a,以便不截断包含默认分隔符的文件名。然后将每个文件名分配给变量name,因为子串不能直接应用于元变量。然后执行子程序:transform

子程序非常简单 - 只需echo重命名命令,使用从变量sourcedirname构建的完整文件名。 ren命令的语法要求新名称仅为名称,子目录是隐式的。新名称是从name内的子字符串构建的,从字符13开始(第一个字符是字符0),长度为10个字符+原始名称。

由于dir列表是在for开始执行之前在内存中构建的,因此传递给for的名称是原始名称。如果文件已重命名,则不会重新处理该文件,因为其新名称不在该原始列表中。

ECHO ren行的想法是,用户可以查看生成的ren命令是否正确。所有这一切都是将报告发送到屏幕。如果确定结果显示正确,则将echo ren更改为ren实际上将执行重命名而不是报告。这是用户做出的决定。如果结果ren错误(错误的位置或长度计数,或错误的目录或其他),则不会造成任何损害,因为产品只是一个报告,直到作业运行echo ren更改为{ {1}}。