~〇~ 发表于 2023-12-23 23:06

bat命令行%*通配参数遇到带()的文件名秒退有解法吗


FOR %%i in (%*) do (7z.exe a "%%~i.7z" "%%i" -mx9 -mmt)

写个批量压缩的命令,把需要压缩的文件或者文件夹,拉到bat文件里就直接开始压缩

for循环命令下这个通配输入参数%*,遇到带()的文件或者文件夹,就会闪退,找不到办法解决

求大神指导

hayse 发表于 2023-12-23 23:29

bing的ai这么回答的,不知道有没有用。

在批处理脚本中,括号 ()、& 和 ^ 等字符具有特殊含义,因此在处理包含这些字符的文件名时可能会出现问题1。你可以通过启用并应用延迟扩展来解决这个问题1。以下是一个示例:

@echo off
setlocal enabledelayedexpansion
for %%i in (%*) do (
    set "file=%%~i"
    7z.exe a "!file:.=!.7z" "%%i" -mx9 -mmt
)
endlocal

在这个示例中,我们使用了 setlocal enabledelayedexpansion 来启用延迟扩展,然后使用 ! 而不是 % 来引用变量。这样,即使文件名中包含括号,也可以正确处理。希望这个解决方案对你有所帮助!

hayse 发表于 2023-12-23 23:31

另一个写法
--
以下是一个批量压缩的命令,可以将需要压缩的文件或文件夹拖到批处理文件中,然后开始压缩:

@echo off
setlocal enabledelayedexpansion
set "sevenzip=C:\Program Files\7-Zip\7z.exe"
for %%i in (%*) do (
    set "file=%%~i"
    set "file=!file:(=^(!"
    set "file=!file:)=^)! "
    "!sevenzip!" a -t7z "%%~ni.7z" "%%i" -mx9 -mmt
)

在上面的代码中,我们使用了setlocal enabledelayedexpansion来启用延迟扩展,这样我们就可以在循环中使用!来访问变量。我们还使用了set "file=!file:(=^(!"和set "file=!file:)=^)! "来转义文件名中的括号,以避免出现问题。

这个命令应该可以解决你的问题。如果你有任何疑问,请告诉我。

~〇~ 发表于 2023-12-23 23:53

hayse 发表于 2023-12-23 23:29
bing的ai这么回答的,不知道有没有用。

在批处理脚本中,括号 ()、& 和 ^ 等字符具有特殊含义,因此在处理 ...

2楼代码我还能看得懂,AI给的2楼代码是错误的,跑不起来的,修改之后能跑,但是问题依旧,遇到带()之类特殊名字的文件,还是闪退

setlocal enabledelayedexpansion
for %%i in (%*) do (
    set "file=%%~i"
    "C:\Program Files\7-Zip\7z.exe" a "!file!.7z" "%%i" -mx9 -mmt
)
endlocal

~〇~ 发表于 2023-12-23 23:59

hayse 发表于 2023-12-23 23:31
另一个写法
--
以下是一个批量压缩的命令,可以将需要压缩的文件或文件夹拖到批处理文件中,然后开始压缩: ...

3楼这个代码跑不起来,AI不是很靠谱呀,乱得很,我甚至没看懂思路,set 7Z程序干啥

xy. 发表于 2023-12-24 00:10

set "ARGS=%*"
setlocal EnableDelayedExpansion
for %%i in (!ARGS!) do (
    endlocal
    dir /A "%%~fi" | > nul 2>&1 findstr "DIR" && (
      "7z a "%%~i.7z" "%%~i\*" -mx9 -mmt
    ) || (
      7z a "%%~i.7z" "%%~fi" -mx9 -mmt
    )
    setlocal
)
endlocal

ai 的解释都对, 只是写的代码令人忍俊不禁

~〇~ 发表于 2023-12-24 00:38

本帖最后由 ~〇~ 于 2023-12-24 03:04 编辑

xy. 发表于 2023-12-24 00:10
ai 的解释都对, 只是写的代码令人忍俊不禁

大佬你的代码能行,非常感谢!

遇到()确实是可以了,但是碰到&依旧还是闪退,[晕倒]

~〇~ 发表于 2023-12-24 02:34

本帖最后由 ~〇~ 于 2023-12-24 03:09 编辑

xy. 发表于 2023-12-24 00:10
ai 的解释都对, 只是写的代码令人忍俊不禁

@echo off
set "ARGS=%*"
setlocal EnableDelayedExpansion
for %%i in (!ARGS!) do (
    endlocal
(
      7z.exe a "%%~ni.7z" "%%~i" -mx9 -mmt
    )
    setlocal
)
endlocal


看了一下,我把代码简化成这样也可以通过测试,遇到()确实搞定了,但是碰到&还是闪退,唉,太多坑了

YsHaNg 发表于 2023-12-24 04:35

23年了 pwsh吧

ONEChoy 发表于 2023-12-24 04:47

[困惑] 知道玩批命令就不知道批量改文件名?乌发李姐。。。
页: [1]
查看完整版本: bat命令行%*通配参数遇到带()的文件名秒退有解法吗