我的文件看起来像这样:
******************* Diagram Options****************
number_of_plots=4
header='Number of cycles'
color='red'
xlabel='RPM'
ylabel='degree'
我的CSV看起来像这样:
1989_Footer.gif
1989_Header.gif
260273_Footer.gif
260273_Header.gif
...
我想用CSV中给出的文件编号重命名文件编号。 CSV中的第一个数字是旧数字,第二个数字(分号后面)是新数字。如何在不加下划线后触摸文本的情况下实现这一目标?
我考虑过获取文件名,然后搜索CSV中的数字,并将其替换为分号后同一行中的值。
答案 0 :(得分: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文件,将{ - 1}}中的from-prefix和%%a
中的to前缀放在一起。
执行名为" %% a_ 任何"的文件的目录列表在源目录中,%%b
上的标记,以便第一个标记(必须为_
)转到%%a
,其余名称转到%%r
,然后重命名带有前缀的文件已切换。
假设文件名中的第一个%%s
永远不会是倍数 - _
答案 1 :(得分: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
答案 2 :(得分: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
命令!
此方法的优点在于,即使第一个_
之后的文件名部分也以_
开头,它也能正常工作;因此,文件名1989__some_name.gif
将重命名为10773387__some_name.gif
,因此会保留两个连续的__
。