2017-08-14 53 views
1

我试图用不同的文本位置重命名文本文件。批量重命名具有不同文本位置的文件

例子:

20170811191008_marie.txt --> marie_txt_20170811191008 

我有一个非常基本的重命名批处理命令在循环重命名文件,但我试图找出我怎么能更改文件名中的文本的位置。

命令:

for /f "delims=" %%i in ('dir /b /a-d *.txt') do ren "%%~i" "%%~ni txt%%~xi" 
+0

要重命名的文件总是具有相同的模式,即,即。 digit_alpha.txt? –

+0

是@SamirSadek –

+0

...而你不再需要文件扩展名! – Compo

回答

1

根据您的愿望

for /f "tokens=1* delims=_" %%i in (
    'dir /b /a-d *_*.txt ^|findstr /i "^20[0-9]*_.*\.txt$"' 
) do echo ren "%%i_%%j" "%%~nj_txt_%%i" 

> SO_45673483.cmd 
ren "20170811191008_marie.txt" "marie_txt_20170811191008" 

编辑忘了提,除去回声仁面前真正执行重命名,一旦你是舒尔它确实想要你想要的。

+0

谢谢!! ..这工作,但是,我们可以在多个文件的文件夹内进行大规模更改吗?在同一目录下运行时找不到文件 –

+0

这应该起作用,findstr将只使用以'20'开头的文件,并且编号为'_',因此它不会重新处理已重命名的文件。 – LotPings

+0

谢谢!得到它了!!!像一个魅力工作:))! –

1

对于多个文件扩展名,你总是可以使用这样的事情:

@Echo Off 
SetLocal EnableDelayedExpansion 
For /F "EOL=_ Tokens=1* Delims=_" %%A In ('Where .:??????????????_*.*') Do (
    Set "fx=%%~xB" 
    Ren "%%A_%%B" "%%~nB_!fx:~1!_%%A" 2>Nul) 

您当然可以仍指定.txt代替.*但就没有必要硬编码_txt_到的代码之后它。

+0

你为什么不把'setlocal'和'endlocal'移出循环?这听起来可能不合逻辑,但这个过程应该更快。顺便说一下,'超时-1'在哪里? – SteveFest

+0

@SteveFest,我决定删除暂停而不是超时,然后决定这两个都不是必需的,所以只删除了暂停。我不在乎速度问题,除非写作和使用脚本花费的时间比手动执行任务花费的时间更长,而是决定按照您提到的延迟扩展语句来做。 – Compo