gpt4 book ai didi

batch-file - 搜索特定扩展名的文件名并删除特殊字符

转载 作者:行者123 更新时间:2023-12-01 05:10:26 28 4
gpt4 key购买 nike

我正在尝试编写一个补丁文件,它将执行以下操作:

  • 在 w:\中搜索所有 *.pdf 和 *.xls 文件。有许多目录和子目录可供搜索。
  • 我需要搜索文件名并替换以下内容。并非每个文件名中都会包含这些不需要的字符。
  • 查找并替换为和
  • 找到 # 并删除 #
  • 找到“有限公司” (“L”之前有一个空格)并将其删除。
  • 如果进行了上述任何更改,请重命名文件。
  • 输出一个文件,所有文件都改变了。

  • 我遇到了一些问题,因此我的帖子在这里。我已经能够从本网站上的其他帖子中拼凑出这段代码。这是我到目前为止。放轻松,我已经 18 年没有在大学做任何编程了。

    我正在使用 JP Software 的一个名为 Take Command 的程序,因此我可以使用某种调试器并尝试找出我做错了什么。

    感谢您的任何帮助。
    @Echo OFF
    set /A xcount=0
    set root=c:\clients
    Set logfilename=Changed.txt
    cd %root%

    for /f "delims=" %%a in ('dir /a:-d /o:n /b /s *.pdf *.xls') do call :next "%%a"
    echo. >> %root%\%logfilename%
    echo End of file > %root%\%logfilename%
    pause
    GOTO:EOF

    :next
    set "current=%~nx1"
    set "newname=%~nx1"
    set "newname=%newname:&=and%"
    set "newname=%newname:#=%"
    set "newname=%newname: LTD.=%"
    set "newname=%newname:%=%"
    set "newname=%newname::=%"

    If "%current%" == "%newname%" goto nope
    SET /A xcount+=1
    ren "%current%" "%newname%"
    echo "%current%" "%newname%"
    echo %xcount% - "%current%" "%newname%" > %root%\%logfilename%
    :nope

    最佳答案

    我看到两个主要问题:

    1) 您的 REN 命令必须具有源文件的完整路径。您仅提供名称和扩展名。

    2) 看起来您正试图删除 %字符也是如此。正常扩展无法做到这一点 - 需要延迟扩展。另外,%必须加倍。

    我看到了一些效率低下的地方:

    1) 不需要任何 CALL 或 GOTO。两者都比较慢。一切都可以使用括号在一个循环中完成。如果要处理许多文件,则性能差异可能会很大。请注意,处理在块内设置的变量需要延迟扩展。

    2) 反复打开和关闭日志文件以附加更多信息很慢。将整个块括在括号内并仅重定向一次会更有效。

    3) 您正试图删除 :从名字。这不是必需的,因为 Windows 文件名不能包含 : .

    4)您已经将当前目录设置为根目录,因此重定向时无需包含路径。

    以下是我未经测试的解决方案的几点注意事项:

    1) 延迟扩展在循环内打开和关闭以保护任何 !可能出现在文件名或路径中。如果 FOR 变量包含 !,则在扩展时会损坏。并启用延迟扩展。

    2) 我用过 echo(而不是 echo.回显一个空行。这种语法看起来很奇怪,但它始终有效。 echo.在某些模糊的条件下,synyax 可能会失败。

    3)我使用PUSHD insead of CD将当前目录设置为您的根目录。如果您要更改当前音量(例如 D: 到 C:),没有/D 选项,CD 将无法正常工作

    4) 外部块将非标准/未使用的文件句柄重定向到日志文件。然后在块内,特定的输出被重定向到日志文件句柄。这样做是为了使日志文件不必重复打开、重新定位到结尾和关闭。其他输出进入正常的标准输出。

    @echo off
    setlocal disableDelayedExpansion
    set /a xcount=0
    set "root=c:\clients"
    Set "logfile=Changed.txt"
    pushd "%root%"

    3>"%logfile%" (
    for /f "delims=" %%F in ('dir /a:-d /o:n /b /s *.pdf *.xls') do (
    set "file=%%~fF"
    set "old=%%~nxF"
    set "new=%%~nxF"
    setlocal enableDelayedExpansion
    set "new=!new:&=and!"
    set "new=!new:#=!"
    set "new=!new: LTD.=!"
    set "new=!new:%%=!"
    if "!new!" neq "!old!" (
    set /a xcount+=1
    ren "!file!" "!new!"
    echo "!file!" "!new!"
    echo !xcount! - "!file!" "!new!">&3
    )
    endlocal
    )
    echo(>&3
    echo End of file>&3
    )
    popd
    pause
    exit /b

    备注 - 上面的解决方案实现了您所说的规则。但有一个问题。像 "Acme LTD.pdf" 这样的名字将更名为 "Acmepdf"
    更新

    自从回答后,我编写了一个名为 JREN.BAT 的方便实用程序。可以很简单的解决问题。该实用程序通过对文件名进行正则表达式搜索和替换来执行重命名操作。 JREN.BAT是一种混合 JScript/批处理脚本,可在 XP 以后的任何 Windows 机器上 native 运行。

    我对您的规则进行了一些改进,以便 LTD紧接在扩展名之前发生,为扩展名保留点,和 LTD.出现在名称中间会删除点。

    假设您的当前目录中有 JREN.BAT,或者更好的是,在您的 PATH 中的某个地方,那么以下脚本应该可以解决问题。

    renFiles.bat
    @echo off
    call jren "(&)|(#|%| LTD(?=\.[^.]*$)| LTD\.)" "$1?'and':''" /i /s /j /fm "*.pdf|*.xls" %1 >rename.log
    type rename.log

    我建议使用 /T 在测试模式下运行上述内容选项。它只会列出建议的重命名操作,而不实际重命名任何内容。
    renFiles /T

    确认一切正常后,再不加 /T 再次运行

    关于batch-file - 搜索特定扩展名的文件名并删除特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25492264/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com