目前,我有一个CSV文件与100行。在每一行中,第一列中的文件夹名称后面有10个图像名。
FolderName1,ImageName1,ImageName2,ImageName3,...,ImageName10
FolderName2,ImageName1,ImageName2,ImageName3,...,ImageName10
... and so on upto
FolderName100,ImageName1,ImageName2,ImageName3,...,ImageName10我还有100个文件夹,每个文件夹有10个图片。我需要批量重命名图像,根据它们是在哪个目录中的CSV线。这就是我到目前为止尝试的,读取CSV文件,
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=1-10 delims=," %%a in (CSVExample.csv) do (
echo %%a
echo %%b
echo %%c
echo %%d
echo %%e
echo %%f
echo %%g
echo %%h
echo %%i
echo %%j
echo %%k
)
pause但是,上面的代码没有读取第十个图像名(ImageName10)。我不明白为什么?.
而且,这也是我想要重命名的部分,
OldImageName1 to ImageName1
OldImageName2 to ImageName2
OldImageName3 to ImageName3
OldImageName4 to ImageName4
OldImageName5 to ImageName5
OldImageName6 to ImageName6..。诸若此类。
旧的图像名称不一定要符合任何标准。我只需要重命名这些图像,而不考虑其现有的名称字符串。
发布于 2022-06-05 16:35:17
我相信这能解决你的问题。相关的方法学评论作为rem注释包括在内。
@ECHO Off
SETLOCAL
rem The following settings for the source directory is a name
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files\t w o"
SET "filename1=%sourcedir%\q72507524.txt"
FOR /f "usebackqtokens=1*delims=," %%b IN ("%filename1%") DO (
rem %%b contains the directoryname, %%c a comma-separated list of the new filenames for that subdirectory
FOR /f "delims=" %%e IN ('dir /b /a-d "%sourcedir%\%%b"') DO (
rem %%e contains each filename (only) in the directory
FOR %%y IN (%%c) DO IF NOT EXIST "%sourcedir%\%%b\%%y" IF EXIST "%sourcedir%\%%b\%%e" REN "%sourcedir%\%%b\%%e" "%%y"
)
)
GOTO :EOF在应用于实际数据之前,始终要针对测试目录进行验证。
发布于 2022-06-05 16:55:11
此任务可以使用以下批处理文件:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "%~dp0CSVExample.csv" echo ERROR: Missing file: "%~dp0CSVExample.csv"& exit /B 1
for /F "usebackq tokens=1* delims=," %%G in ("%~dp0CSVExample.csv") do if exist "%%~G\" (
for /F "delims=?" %%I in ('set ? 2^>nul') do set "?%%I?="
for %%I in ("%%~G\*") do set "?%%~nxI?=1"
for %%I in (%%H) do (
set "FileRenamed="
for /F "delims=?" %%J in ('set ? 2^>nul') do if not defined FileRenamed (
ren "%%~G\%%J" "%%~I"
if not errorlevel 1 (
set "?%%J?="
set "FileRenamed=1"
)
)
)
)
endlocal批处理文件不使用延迟变量展开来处理包含感叹号的文件夹路径和文件名。
批处理文件目录中CSV文件中的每一行首先被分割成两个子字符串,使用逗号作为分隔符。第一个值--文件夹名--根据G表分配给指定的循环变量H,所有文件名以逗号分隔给下一个循环变量H。
注意:由于这个原因,文件夹名和文件名都不能包含逗号。包含空格或其中一个字符&()[]{}^=;!'+`~的文件夹或文件名必须包含在CSV文件中的"中,否则处理不正确。
首先检查当前分配给循环变量G的文件夹是否存在。如果使用绝对路径指定的文件夹或相对于当前目录的路径不存在,则忽略CSV文件中的当前行。
接下来将执行一个for /F循环,它删除所有以问号开头和结尾的环境变量。
然后运行一个标准的for循环,按照文件系统返回的顺序获取当前文件夹中所有非隐藏文件的名称,以定义一个环境变量,文件名以?开头,以值1结尾,这并不重要。问号用作变量名的开始和结束,因为任何文件名都不能包含问号。因此,最终有一个以内存中的?开头和结尾的环境变量列表,这是当前文件夹中文件的名称。
第三个for循环现在处理CSV文件当前行中逗号分隔的文件名。
对于每个文件名,首先未定义环境变量FileRenamed。
接下来,像在命令设置之前一样,由for /F启动的命令进程在后台使用?作为参数来输出所有环境变量,其中的名称以问号开头。因此,输出是之前为当前文件夹确定的文件名列表,该列表由for /F循环捕获和处理。
从环境变量名称中提取文件名的捕获行以问号开头和结尾,只有在尚未对从CSV文件中的行读取的当前文件名进行重命名时才进行处理。
否则,当前文件夹中的下一个文件将重命名为CSV文件当前行中的当前文件名。如果该文件重命名成功,则从环境变量列表中删除重命名文件的名称,并定义环境变量FileRenamed以跳过最初在当前文件夹中找到的文件的所有其他文件名。
此过程使文件夹中的文件数可能与CSV文件中一行中的文件数不匹配。
要了解所使用的命令及其工作方式,请打开一个命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。
call /? ...解释%~dp0 ..。驱动器和参数0的路径,批处理文件路径总是以反斜杠结尾。echo /?endlocal /?exit /?for /?if /?ren /?set /?setlocal /?阅读有关使用命令重定向运算符的微软文档,了解2>nul的解释。当>命令解释器在执行命令FOR之前对这些命令行进行处理时,必须使用FOR命令行上的插入字符对重定向操作符进行转义,以便将其解释为文字字符,该命令行使用后台启动的单独命令进程执行嵌入式set命令行。
https://stackoverflow.com/questions/72507524
复制相似问题