【问题标题】:Rename files by CMD keep last 10 characters and remove all starting characters通过 CMD 重命名文件保留最后 10 个字符并删除所有起始字符
【发布时间】:2020-09-03 10:36:15
【问题描述】:

我有数千个 HTML 文件名称,如“jweofimsdkfmoiwe-8592547472.html.tmp”和“jweofimsdkfmoiwe-8592547472.html.readme”我想通过命令重命名所有文件,只需要最后 10 个字符和 .html,如 8592547472。 html。我不是专家,但通过搜索我发现以下命令删除所有 .tmp 和 .readme

for /f "delims=." %a in ('dir /b *.html.readme') do ren "%~a.html.readme" "%~a.html"
for /f "delims=." %a in ('dir /b *.html.tmp') do ren "%~a.html.tmp" "%~a.html"

我搜索了很多,找到了很多解决方案,但仅用于删除起始字符。

REN *.* " *.*" 
FOR %v IN (*.*) DO REN "%v" %v

我想要一个简单的代码来重命名文件并保留最后 10 个字符,如果包含删除最后一个 .tmp 和 .readme 的 .html 会非常好

How can convert it to use in CMD?
::Extract only the last 10 characters
SET _result=%_test:~-10%
ECHO %_result%          =8592547472

提前致谢。

【问题讨论】:

  • 文件名起始字符不固定为 16 个。
  • ss64.com/nt/syntax-substring.html 处的信息将有助于提取部分文件名字符串。
  • 从技术上讲,您不能按照您的问题进行操作,因为 jweofimsdkfmoiwe-8592547472.html.tmpjweofimsdkfmoiwe-8592547472.html.readme 都需要重命名为 8592547472.html,并且您不能在同级目录。
  • 所有文件都有唯一的名称,很抱歉造成混淆。

标签: cmd command-line rename


【解决方案1】:

如果要删除的文件名部分和要保留的文件名部分之间始终只有一个连字符,则可以使用以下批处理文件。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *.html.readme *.html.tmp /A-D /B 2^>nul') do for /F "eol=| tokens=1* delims=-" %%J in ("%%~nI") do ren "%%I" "%%K"
endlocal

内部 FOR 处理不带扩展名的文件名字符串 .readme.tmp 并将剩下的所有内容分配给第一个(系列)- 到指定的循环变量 J(不进一步使用)和第一个(一系列)- 到下一个之后的所有内容,但一个循环变量 K 根据ASCII table。在将第一个连字符分隔的子字符串分配给未使用的循环变量 J 之前,删除文件名开头的连字符。

否则,以下批处理文件可用于此文件重命名任务,其中文件名包含多个连字符:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *.html.readme *.html.tmp /A-D /B 2^>nul') do (
    set "SourceFileName=%%I"
    for %%J in ("%%~nI") do set "TargetFileName=%%~nJ"
    setlocal EnableDelayedExpansion
    set "TargetFileName=!TargetFileName:~-10!"
    ren "!SourceFileName!" "!TargetFileName!.html"
    endlocal
)
endlocal

请阅读this answer 了解有关命令 SETLOCALENDLOCAL 的详细信息。必须在 FOR 循环内启用/禁用delayed expansion,否则将无法处理包含一个或多个感叹号的正确文件名。

这个批处理文件确实总是使用源文件名的最后 10 个字符作为目标文件名。

如果保证要重命名的文件的名称中不包含一个或多个!,则可以使用以下批处理文件。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *.html.readme *.html.tmp /A-D /B 2^>nul') do (
    for %%J in ("%%~nI") do set "TargetFileName=%%~nJ"
    ren "%%I" "!TargetFileName:~-10!.html"
)
endlocal

另一种类似于上面的解决方案,通过不使用延迟扩展来处理带有一个或多个感叹号的文件名,而是使用命令 CALL 通过命令 REN 双重解析命令行strong> 在执行重命名命令之前。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *.html.readme *.html.tmp /A-D /B 2^>nul') do (
    for %%J in ("%%~nI") do set "TargetFileName=%%~nJ"
    call ren "%%I" "%%TargetFileName:~-10%%.html"
)
endlocal

要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • ren /?
  • set /?
  • setlocal /?

【讨论】:

    【解决方案2】:

    对于您提供的示例,如果您使用的是 Windows Vista 或更高版本,(并且只要您没有任何文件的扩展名超过这两个级别,例如 *.html.readme.ext。以下应重命名您的*.html 文件和*.html.ext 文件,(其中.ext 是任何其他有效的扩展名),其前面紧跟一个由连字符组成的字符串-,然后10 数字。

    For /F Delims^= %G In ('%__AppDir__%where.exe .:*-??????????.html* 2^>NUL^|%__AppDir__%findstr.exe "[-][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]\.html"') Do @Echo "%~nxG"|%__AppDir__%findstr.exe "\".*[-][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]\.html\"$">NUL&&(Set "_=%~nxG")||(For /F "EOL=?Delims=" %H In ("%~nG")Do @Echo "%~nxH"|%__AppDir__%findstr.exe "\".*[-][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]\.html\"$">NUL&&Set "_=%~nxH")&%__AppDir__%cmd.exe /V/Q/D/C "Ren "%G" "!_:~-15!""
    

    我不打算通过它来解释发生了什么以及它是如何工作的,因为试图在我的手机上输入所有这些内容已经耗尽了我的储备。

    通过规定“通过 CMD 重命名文件”和“通过命令重命名所有文件”而不是 (已经发布了一个潜在的解决方案),这项任务变得更加困难。 em>

    【讨论】:

    • 它是谁的错误“'%__AppDir' 不是内部或外部命令、可运行程序或批处理文件”
    • 我已经检查了@IftekHar 上面的代码,假设我打错了,但是我没有,请确保您粘贴的版本始终有%__AppDir__% 而不是%__AppDir__跨度>
    • 另外@IftekHar,如果你真的100%肯定你的%PATH%变量永远不会被修改,(有意或无意地),删除X:\Windows\System32,(其中X: 是您的%SystemDrive% 的占位符),您可以删除%__AppDir__% 的每个实例而不影响代码。
    • 你@Compo 解决了我的问题。你真是个专家。谢谢
    • 这段代码在一分钟内重命名了 1000 个文件,我想重命名数百万个文件。有什么方法可以快速完成吗?
    猜你喜欢
    • 2022-01-14
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多