用另一个文件列表#2重命名文件列表#1

时间:2016-06-16 00:47:08

标签: list file batch-file rename

MyList1.txt等文本文件中包含的文件列表(在一个文件夹中)重命名为MyList2.txt等其他文本文件中包含的另一个文件列表。

我想使用Windows命令批处理文件(不是PowerShell,脚本等),它通过另一个文本文件中包含的另一个文件列表重命名包含在文本文件中的文件夹中的文件列表。 / p>

假设我在文本文件中有一个文件列表。这些文件位于一个文件夹中,例如D:\Librarian

文件 D:\ Test \ MyList1.txt 包含:

Directory.zip
Subject.zip
Penny.zip
Car.zip
Auto.zip
One_Upon_A_time.zip
All is relative.zip
Zen of graphics programming – Corilolis.zip
PC Magazine – July 1999 No.22.zip
Bytes is over with quantum.zip

我想用 D:\ Test \ MyList2.txt 中列出的文件名替换它们,包含:

Patatoes.zip
Chips.zip
Hot Dogs Sweet.zip
Ice Cream_Very – Good.zip
We must eat to live.zip
Ketchup on potatoes is a muxt.zip
The Magazine are owned by few guys.zip
Desert are not necessary_in life.zip
Sugar_is_a_legal_drug.zip
People-who_don’t-like_pizzas_don’t like bread.zip

因此

Directory.zip将成为Patatoes.zip
Subject.zip将成为Chips.zip Penny.zip将成为Hot Dogs Sweet.zip  等

MyList1.txtMyList2.txt都有相同的行数(文件名数相同)。

操作系统是: Windows 10.
必须使用批次(cmd)

一个文件夹 - D:\Librarian包含要重命名的文件 另一个文件夹包含两个文件MyList1.txtMyList2.txt

MyList1.txt包含D:\Librarian的文件列表 MyList2.txt包含D:\Librarian

的新文件名

------ 开始1:dbenham ------------------------------ ----------------------------

我已经尝试了你所写的内容,除了2个文件名外,它的工作正常 可能Windows命令解释器不接受这些文件名中的一些标点符号。

此处出现在命令提示符下(Windows 10下的DOS):
(我当然会删除@echo off以便能够看到它。)

D:\>setlocal disableDelayedExpansion
D:\>pushd "d:\Librarian"
d:\Librarian>(for /F "usebackq eol=: delims=" %F in ("d:\Test\MyList1.txt") do (
set "from=%F"
 setlocal enableDelayedExpansion
 set "to="
 set /p "to="
 if defined to ren "!from!" "!to!"
 endlocal
) ) 0 (<)  d:\Test\MyList2.txt

不是(&lt;)而是仅&lt;但是对于x的原因0&lt;不可见。

d:\Librarian>(
set "from=Directory.zip "
 setlocal enableDelayedExpansion
 set "to="
 set /p "to="
 if defined to ren "!from!" "!to!"
 endlocal
)

d:\Librarian>(
set "from=Subject.zip"
 setlocal enableDelayedExpansion
 set "to="
 set /p "to="
 if defined to ren "!from!" "!to!"
 endlocal
)

...

d:\Librarian>(
set "from=Zen of graphics programming  Corilolis.zip"
 setlocal enableDelayedExpansion
 set "to="
 set /p "to="
 if defined to ren "!from!" "!to!"
 endlocal
)

系统找不到指定的文件。

d:\Librarian>(
set "from=PC Magazine  July 1999 No.22.zip""
 setlocal enableDelayedExpansion
 set "to="
 set /p "to="
 if defined to ren "!from!" "!to!"
 endlocal
)

系统找不到指定的文件。

d:\Librarian>(
set "from=Bytes is over with quantum.zip"
 setlocal enableDelayedExpansion
 set "to="
 set /p "to="
 if defined to ren "!from!" "!to!"
 endlocal
)

Windows命令解释程序可能不喜欢以下文件名中的-字符:

PC Magazine - July 1999 No.22.zip
Zen of graphics programming - Corilolis.zip

但是由于我的很多文件都有连字符,所以我想建议让批处理文件也适用于这样的文件名。

稍后...使用CMD重命名所有文件(在MyList1.txtMyList2.txt内以及文件夹D:\Librarian中)后,所有工作都正常。

我认为我复制并粘贴了此页面中的文件,因此即使-看起来-可能看起来像pushd "d:\Librarian"<br> (<)d:\Test\MyList2.txt (No () around the <) 也不是相同的字符,就像您说它们在控制台或网页上可能有所不同。

我不能说我理解你所做的一切(如此明亮)!

例如为什么:

D:\Librarian\
D:\Librarian\S1\
D:\Librarian\Plane\

我发现Windows命令非常特别。更多的是看看像你这样的人可以用如此少的命令来做到这一点。简直令人难以置信!

------ 结束1:dbenham ------------------------------ ----------------------------

希望不要厌烦你......

如果我的文件位于文件夹和子文件夹中,我可以这样做吗?

假设我的文件分发在以下文件夹中:

D:\Librarian\Directory.zip
D:\Librarian\Subject.zip
D:\Librarian\Penny.zip

D:\Librarian\S1\Car.zip
D:\Librarian\S1\Auto.zip
D:\Librarian\S1\One_Upon_A_time.zip
D:\Librarian\S1\All is relative.zip

D:\Librarian\Plane\Zen of graphics programming - Corilolis.zip
D:\Librarian\Plane\PC Magazine - July 1999 No.22.zip
D:\Librarian\Plane\Bytes is over with quantum.zip

MyList1.txt

D:\Librarian\Patatoes.zip
D:\Librarian\Chips.zip
D:\Librarian\Hot Dogs Sweet.zip

D:\Librarian\S1\Ice Cream_Very - Good.zip
D:\Librarian\S1\We must eat to live.zip
D:\Librarian\S1\Ketchup on potatoes is a must.zip
D:\Librarian\S1\The Magazine are owned by few guys.zip

D:\Librarian\Plane\Desert are not necessary_in life.zip
D:\Librarian\Plane\Sugar_is_a_legal_drug.zip
D:\Librarian\Plane\People-who_don't-like_pizzas_don't like bread.zip

MyList2.txt

ren "D:\Librarian\Directory.zip" "D:\Librarian\Patatoes.zip"
ren "D:\Librarian\Plane\Zen of graphics programming - Corilolis.zip" "D:\Librarian\Plane\People-who_don't-like_pizzas_don't like bread.zip"

我想要的是例如:

{{1}}

1 个答案:

答案 0 :(得分:2)

重命名文件很简单,使用FOR /F从单个文件读取很简单。唯一棘手的一点是从第二个文件读取相应的行,这在merging two text files时是同样的问题。最有效的解决方案是将stdin重定向到整个代码块的第二个文件。然后,您可以使用SET /P来读取连续的行

以下脚本通常可以使用,但请注意,不会尝试检测或处理重命名操作可能导致的名称冲突。

@echo off
setloacal disableDelayedExpansion
pushd "d:\Librarian"
<d:\Test\MyList2.txt (
  for /f "usebackq eol=: delims=" %%F in ("d:\Test\MyList1.txt") do (
    set "from=%%F"
    setlocal enableDelayedExpansion
    set "to="       %= Clear any existing value =%
    set /p "to="    %= Read the next line =%
    if defined to ren "!from!" "!to!"
    endlocal
  )
)