2016-12-01 36 views
0

我有一个看起来像文件:重命名文件值

1989_Footer.gif 
1989_Header.gif 
260273_Footer.gif 
260273_Header.gif 
... 

,我有一个CSV,看起来像这样:

1989;10773387 
260273;10776516 
... 

我想用一个重命名的文件数在CSV中给出。 CSV中的第一个数字是旧数字,第二个数字(分号后)是新数字。下划线之后,如何在不触及文字的情况下实现该功能?

我想过要获取文件名,然后搜索CSV中的数字,并用分号后的同一行中的值替换它。

回答

1

JREN.BAT regular expression renaming utility可以简化的解决方案。 JREN.BAT是纯粹的脚本(混合批处理/ JScript),可以从任何Windows机器上运行,从XP开始 - 不需要第三方exe文件。可以通过命令行通过jren /?jren /??获得完整的文档以获取分页帮助。

从批处理脚本中:

@echo off 
for /f "delims=; tokens=1,2" %%A in (rename.csv) do call jren "^%%A_" "%%B_" /fm *.gif 

在命令行:

for /f "delims=; tokens=1,2" %A in (rename.csv) do @jren "^%A_" "%B_" /fm *.gif 
+0

另一个伟大的答案。从来没有听说过杰伦。但是这个工具真的很棒。我会勉强我们这个,因为有时我有数字背后的字母。这个脚本比Magoo的脚本更容易改变。谢谢! –

2
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q40908252.txt" 
FOR /f "usebackqtokens=1*delims=;" %%a IN ("%filename1%") DO (
FOR /f "tokens=1*delims=_" %%r IN ('dir /b /a-d "%sourcedir%\%%a_*"') DO (
    ECHO(REN "%sourcedir%\%%r_%%s" "%%b_%%s" 
) 
) 

GOTO :EOF 

您需要更改sourcedir的设置以适合您的情况。

我用了一个名为q40908252.txt的文件来存放我的测试数据。

为了测试目的,所需的REN命令仅仅是ECHO验证命令是否正确后,将ECHO(REN更改为REN以实际重命名文件。

读取csv文件,使用;作为分隔符,将起始前缀放在%%a中,将前缀放在%%b中。

_执行名为“%% A_ 什么”源目录中的文件的目录列表,tokenise使得第一令牌(必须是%%a)去%%r,其余-的名称来%%s ,然后重命名切换前缀的文件。

假定该文件名的第一个_永远不会成为一个多重_

+1

这是连续两个!我正要发布一个几乎相同的答案:-) – dbenham

+0

哇,非常感谢这么多的解释 - 工作就像一个魅力:) –

+0

Damnit ...刚刚完成我的,但你的看起来方式更紧凑...我哭了一个约32个嵌套循环和2个更多的独立循环中...我想更多的实践会做这项工作:) – geisterfurz007

0

我可能会那样做(见解释性说明rem):

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_CSV=%~dpn0.csv" & rem // (path to the CSV file holding the old and new numbers) 
set "_LOC=%~dp0"  & rem // (path to the directory containing the files to rename) 
set "_PAT=*.gif"  & rem // (pattern of the file name part after the first `_`) 

rem // Walk through the CSV file line by line and read old and new numbers: 
for /F "usebackq tokens=1-2 delims=,;" %%K in ("%_CSV%") do (
    rem // Search files whose names begin with the old number and an `_`: 
    for /F "delims=" %%F in ('dir /B /A:-D "%_LOC%\%%K_%_PAT%"') do (
     rem // Store current file name into variable: 
     set "NAME=%%F" 
     rem // Toggle delayed expansion to not lose any `!` in the file name: 
     setlocal EnableDelayedExpansion 
     rem // Rename current file by replacing the old number by the new one: 
     ECHO ren "%_LOC%\!NAME!" "%%L_!NAME:*_=!" 
     endlocal 
    ) 
) 

endlocal 
exit /B 

删除大写ECHO命令后r已成功测试脚本!

该方法的优点是,即使在第一个_之后的文件名部分也以_开头的情况下,它仍然可以工作;所以文件名1989__some_name.gif将被重命名为10773387__some_name.gif,因此连续两个__都被维护。