gpt4 book ai didi

windows - 批处理脚本在带括号的文件名上失败

转载 作者:可可西里 更新时间:2023-11-01 09:23:46 34 4
gpt4 key购买 nike

我写了一个批处理脚本:

@echo off
set "zip=C:\Program Files\7-Zip\7z.exe"
for %%f in (%*) do (
if exist "%%~f\" (
"%zip%" a -tzip "%%~f.zip" "%%~f\*" -mx0
) else (
"%zip%" a -tzip "%%~f.zip" %%f -mx0
)
)

当用户选择多个文件/文件夹并将它们拖到脚本文件中时,每个被拖拽的文件/文件夹都会打包成一个 zip 文件。

在大多数情况下它工作正常。但是,如果被拖动的文件位于文件名包含括号的目录中,例如“myfolder(large)”,脚本将失败。

谁能告诉我是什么原因导致这个问题以及如何解决它?

最佳答案

对于这个问题,我看到了以下选项:

  1. 通过 ^ 转义括号使用临时变量:

    @echo off
    set "ZIP=C:\Program Files\7-Zip\7z.exe"
    set "ARGS=%*"
    set "ARGS=%ARGS:^=^^%"
    set "ARGS=%ARGS:&=^&%"
    set "ARGS=%ARGS:(=^(%"
    set "ARGS=%ARGS:)=^)%"
    for %%F in (%ARGS%) do (
    dir /A "%%~fF" | > nul 2>&1 findstr "DIR" && (
    "%ZIP%" a -tzip "%%~F.zip" "%%~F\*" -mx0
    ) || (
    "%ZIP%" a -tzip "%%~F.zip" "%%~fF" -mx0
    )
    )

    此方法解决了括号问题 ()以及&^ , 但它对批处理脚本具有特殊含义的所有字符都不可靠,例如 < , >| .

  2. 启用和应用 delayed expansion对于有问题的字符串:

    @echo off
    set "ZIP=C:\Program Files\7-Zip\7z.exe"
    set "ARGS=%*"
    setlocal EnableDelayedExpansion
    for %%F in (!ARGS!) do (
    endlocal
    dir /A "%%~fF" | > nul 2>&1 findstr "DIR" && (
    "%ZIP%" a -tzip "%%~F.zip" "%%~F\*" -mx0
    ) || (
    "%ZIP%" a -tzip "%%~F.zip" "%%~fF" -mx0
    )
    setlocal
    )
    endlocal

    我更喜欢这种方法,因为它可以解决所有特殊字符的问题。循环内延迟扩展的切换(依赖于禁用它的 Windows 默认值)是为了在 %%F 扩展期间禁用它。变量实例,否则如果字符串包含感叹号会出现问题 ! .这里的问题是延迟扩展会消耗 !在命令行中遇到。 for%%F 这样的变量在执行延迟扩展之前扩展到它的值;所以如果 %%F值包含 !它消失了 - 除非延迟扩展被禁用,其中 !没有特别的意义。

关于windows - 批处理脚本在带括号的文件名上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988501/

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