如何批量传输重命名?
How to batch transfer rename?
有两个文件夹,它们之间的文件数量相等。
我想应用一组中的名称;没有特定顺序的另一组文件。继承名称,但保留扩展名 .
输入文件为.bmp 输出文件为.ini(有齿轮符号)。
示例:
folder 1- Flowers.bmp ; folder 2- blank.ini
. To this:
folder 1- Flowers.bmp ; folder 2- Flowers.ini
会有更多文件,但数量相等。
.ini 文件都是副本。所以他们可能有一个通用名称和编号,如果这很重要的话。这些都会从另一个文件夹中的其他 .bmp 文件中获得一个名称。
通常我的桌面上都有这两个文件夹。
我确保两个文件夹之间的文件数量相等。那将是一个常数。
我正在尝试简化一些琐碎的重复性日常任务。
我进行了搜索,但我发现的内容并没有真正帮助。
@ECHO OFF
SET "vers=%~1"
IF "%vers%" == "" SET /P "vers=Enter Vers: "
FOR %%F IN (file_XX_*.*) DO CALL :process "%%F"
GOTO :EOF
:process
SET "name=%~nx1"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "name=!name:_XX_=_%vers%_!"
RENAME %1 "%name%"
ENDLOCAL
希望最终能找到解决办法。
这不是最有效的方法,但考虑到您有限的批处理经验,我想一种可理解的方法比优化的方法(使用类似数组的变量)更好。
@echo off
setlocal enabledelayedexpansion
(for %%A in ("folder 1\*.bmp") do echo %%~nA)> "%temp%\names.txt"
<"%temp%\names.txt" (
for %%A in ("folder 2\*.ini") do (
set /p "name="
ECHO ren "%%A" "!name!.ini"
))
第一个 for
循环创建所需名称的列表(来自 Folder 1
)。修饰符 %%~nA
returns 仅 n。
第二个 for
处理 Folder 2
中的每个文件,并从先前生成的文件中为每个文件取一个名称。 这取决于两个文件夹中的文件数量是否相同,否则您可能会得到不想要的结果。
我通过回显禁用了实际的 ren
命令。检查输出,只有当您满意时,才删除 ECHO
.
好的,这是一个稍微长一点的版本,但它确保它获取每个文件夹的内容。
注意您必须确保在第三行和第四行中正确指定两个文件夹的路径:
@echo off
setlocal enabledelayedexpansion
set "source=%userprofile%\Desktop\folder 1"
set "destination=%userprofile%\Desktop\folder 2"
set /a num=0
for %%a in ("%source%\*") do (
set /a num+=1
set "fr!num!m=%%~na"
)
set /a oldn=!num!
set /a num=0
for %%b in ("%destination%\*") do (
set /a num+=1
set "to!num!r!=%%~nxb"
set "ext=%%~xb"
)
pushd "%destination%"
for /l %%i in (1,1,!oldn!) do ren "!to%%ir!" "!fr%%im!%ext%"
popd
pause
如果您对输出感到满意,您可以删除脚本底部的 pause
。
有两个文件夹,它们之间的文件数量相等。 我想应用一组中的名称;没有特定顺序的另一组文件。继承名称,但保留扩展名 .
输入文件为.bmp 输出文件为.ini(有齿轮符号)。
示例:
folder 1- Flowers.bmp ; folder 2- blank.ini
. To this:
folder 1- Flowers.bmp ; folder 2- Flowers.ini
会有更多文件,但数量相等。 .ini 文件都是副本。所以他们可能有一个通用名称和编号,如果这很重要的话。这些都会从另一个文件夹中的其他 .bmp 文件中获得一个名称。
通常我的桌面上都有这两个文件夹。 我确保两个文件夹之间的文件数量相等。那将是一个常数。
我正在尝试简化一些琐碎的重复性日常任务。 我进行了搜索,但我发现的内容并没有真正帮助。
@ECHO OFF
SET "vers=%~1"
IF "%vers%" == "" SET /P "vers=Enter Vers: "
FOR %%F IN (file_XX_*.*) DO CALL :process "%%F"
GOTO :EOF
:process
SET "name=%~nx1"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "name=!name:_XX_=_%vers%_!"
RENAME %1 "%name%"
ENDLOCAL
希望最终能找到解决办法。
这不是最有效的方法,但考虑到您有限的批处理经验,我想一种可理解的方法比优化的方法(使用类似数组的变量)更好。
@echo off
setlocal enabledelayedexpansion
(for %%A in ("folder 1\*.bmp") do echo %%~nA)> "%temp%\names.txt"
<"%temp%\names.txt" (
for %%A in ("folder 2\*.ini") do (
set /p "name="
ECHO ren "%%A" "!name!.ini"
))
第一个 for
循环创建所需名称的列表(来自 Folder 1
)。修饰符 %%~nA
returns 仅 n。
第二个 for
处理 Folder 2
中的每个文件,并从先前生成的文件中为每个文件取一个名称。 这取决于两个文件夹中的文件数量是否相同,否则您可能会得到不想要的结果。
我通过回显禁用了实际的 ren
命令。检查输出,只有当您满意时,才删除 ECHO
.
好的,这是一个稍微长一点的版本,但它确保它获取每个文件夹的内容。
注意您必须确保在第三行和第四行中正确指定两个文件夹的路径:
@echo off
setlocal enabledelayedexpansion
set "source=%userprofile%\Desktop\folder 1"
set "destination=%userprofile%\Desktop\folder 2"
set /a num=0
for %%a in ("%source%\*") do (
set /a num+=1
set "fr!num!m=%%~na"
)
set /a oldn=!num!
set /a num=0
for %%b in ("%destination%\*") do (
set /a num+=1
set "to!num!r!=%%~nxb"
set "ext=%%~xb"
)
pushd "%destination%"
for /l %%i in (1,1,!oldn!) do ren "!to%%ir!" "!fr%%im!%ext%"
popd
pause
如果您对输出感到满意,您可以删除脚本底部的 pause
。