【问题标题】:Renaming *.nfo files to match their *.mkv's重命名 *.nfo 文件以匹配它们的 *.mkv
【发布时间】:2015-03-20 22:40:18
【问题描述】:

尝试组织节目 *.nfo 文件,使它们与匹配的 mkv 同名(编辑:avi woops 不会真正更改代码)。

Test Folder:
76107.2.1.nfo 
76107.2.2.nfo
76107.2.3.nfo
Doctor Who - S02E01 (009) - Planet of Giants (1) - Planet of Giants.avi
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.avi
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.avi

现在 76107.2.*.nfo 中的剧集编号在后面的文件夹中是错误的,测试文件夹中的相似性只是因为它是本季的第一季。所以我不能简单地比较名称以匹配它们,但它们的顺序正确,所以我尝试使用计数器将第一个 *.nfo 重命名为与第一个 *.avi 相同,然后将第二个 *.nfo 重命名为与第二个 *.avi 相同,依此类推!

我制作了一个我认为应该可以工作的脚本,但它什么也没做。任何帮助将非常感激! 编辑感谢 Aacini,它现在可以工作了,除了在代码中注明的一个奇怪的错误。

@echo on
setlocal enableDelayedExpansion

set cnta=0
Set cntb=0
for %%b in (*.avi) do (
 set /a cnta=cnta+1
 set line_!cnta!=%%~Nb
)

for %%c in (*.nfo) do (
 set /a cntb=cntb+1
 for %%i in (!cntb!) do ren "%%~fc" "!line_%%i!.nfo"
)

错误:第一个 nfo 似乎被撞到了列表的末尾,但它的位置仍然保留。与其他所有 nfo 一样,它的命名与相应的 avi 相匹配。

Test 1 (Original Test Folder) Results:
.nfo
Doctor Who - S02E01 (009) - Planet of Giants (1) - Planet of Giants.avi
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.avi
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.nfo
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.avi
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.nfo

Test 2 (Added Extra Bonus File) Results:
Doctor Who - S02E01 (009) - Planet of Giants (1) - Planet of Giants.avi
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.avi
Doctor Who - S02E01 (009) - Planet of Giants (2) - Dangerous Journey.nfo
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.avi
Doctor Who - S02E01 (009) - Planet of Giants (3) - Crisis.nfo
Doctor Who - S02E01 (009) - Planet of Giants (4) - The Making of Planet of Giants.avi
Doctor Who - S02E01 (009) - Planet of Giants (4) - The Making of Planet of Giants.nfo

某些文件夹将在列表末尾包含没有匹配 nfo 的奖励视频,但它们始终位于末尾。我阅读了 nfo 以验证仅“.nfo”(测试 1)/“Doctor Who - S02E01 (009) - 巨人星球 (4) - 巨人星球的制作.nfo”(测试 2)放错了位置,他们应该被《神秘博士 - S02E01 (009) - 巨人星球(1) - 巨人星球.nfo》

【问题讨论】:

标签: batch-file


【解决方案1】:

命名line_!cnta! 变量的正确术语是数组。您可以在this post 的批处理文件中查看阵列管理的完整描述。例如,您的代码可能会这样修复:

编辑修复了小错误

@echo on
setlocal enableDelayedExpansion

set cnta=0
Set cntb=0

for %%b in (*.mkv) do (
 set /a cnta=cnta+1
 set line_!cnta!=%%~Nb
)

for /F "delims=" %%c in ('dir /B *.nfo') do (
 set /a cntb=cntb+1
 for %%i in (!cntb!) do ren "%%~fc" "!line_%%i!.nfo"
)

【讨论】:

  • 我认为更好的名称应该是“类似数组”,因为它不是真正的数组。这与包含一堆文件的文件夹和包含不使用任何压缩的相同文件的存档文件之间的区别相同。
  • @Dracrius:对不起,但重命名逻辑与您在问题中发布的相同;我刚刚解决了访问数组元素的问题。如果您希望我们也修复重命名逻辑,那么您必须发布导致错误和所需结果的文件列表。请编辑您的问题并将名称列表放在代码标签内,不要在此处发布名称列表,在 cmets...
  • @SomethingDark:我不同意。数组是一种数据结构:由一系列元素组成的变量,这些元素通过数字索引或下标访问。如果某些数据使用这种结构,它是一个数组;如果不是,那么不是。您不需要给定的编程语言或特定的符号(甚至也不需要计算机!)来管理数组...
  • 没错,但是批处理数组只是一组变量,它们恰好具有相似的名称,并且在其他方​​面不相关。
  • @SomethingDark:您说的是批处理文件中数组的实现细节!这些细节使这个数据结构不是一个“数组”?在这种情况下,汇编语言中没有数组! (也不是在计算机内存中)...
【解决方案2】:

我认为这对你有用。一旦您认为它看起来正确,您应该将 echo ren 更改为 ren

@echo on
setlocal enableDelayedExpansion

set cnta=0
set cntb=0

for %%a in (*.mkv) do (
    set /a cnta=cnta+1
    set line_!cnta!=%%a
)

for %%b in (*.nfo) do (
    set /a cntb=cntb+1
    set newname=line_!cntb!
    call set newname=%%!newname!%%
    echo ren "%%~fb" "!newname!"
)

我想你会更喜欢这样的循环。这次我实际上已经全部测试过了:

@echo on
setlocal enableDelayedExpansion

set cnta=0
set cntb=0

for /f "usebackq delims=" %%a in (`dir *.mkv /a-d /b /on`) do (
    set /a cnta=cnta+1
    set line_!cnta!=%%a
)

for /f "usebackq delims=" %%b in (`dir *.nfo /a-d /b /on`) do (
    set /a cntb=cntb+1
    set newname=line_!cntb!
    call set newname=%%!newname!%%
    echo ren "%%~fb" "!newname!"
)

如果您对使用批处理脚本有任何真正的兴趣,那么您需要大量的耐心和反复试验才能真正开始点击。它可能非常错综复杂。

【讨论】:

  • 这仍然没有任何作用。感谢您尝试它看起来比我的更好,但它甚至不会回声!
  • 当你真正想要 for 时,你使用的是 for /f,尽管我认为你仍然需要使用 dir 命令的选项。我编辑了答案。
  • 为什么dir版本会更好?很抱歉,它仍然什么也没做。
  • @Dracrius dir 更好,因为 /on - 按名称排序以确保您以正确的顺序获取文件。这里的两个例子都对我有用。
【解决方案3】:

既然您似乎在寻找替代方案,那么每个 .nfo 文件是否都包含其对应的 .mkv 文件的名称?如果是这样,您可以使用find 和条件执行通过.nfo 的内容将.mkv 与其.nfo 配对。这比 shawn 和 Aacini 的答案效率低很多(很多!),但至少您不必担心文件是否按这种方式排列。

@echo off
setlocal

for %%I in (*.mkv) do (
    for %%x in (76107*.nfo) do if not exist "%%~nI.nfo" (
        find /i "%%~nxI" "%%x" >NUL && ren "%%x" "%%~nI.nfo"
    )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    相关资源
    最近更新 更多