找回密码
 加入我们
搜索
      
查看: 2096|回复: 9

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

[复制链接]
发表于 2023-12-23 23:06 | 显示全部楼层 |阅读模式

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

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

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

求大神指导
发表于 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 来启用延迟扩展,然后使用 ! 而不是 % 来引用变量。这样,即使文件名中包含括号,也可以正确处理。希望这个解决方案对你有所帮助!
发表于 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程序干啥
发表于 2023-12-24 00:10 | 显示全部楼层
  1. set "ARGS=%*"
  2. setlocal EnableDelayedExpansion
  3. for %%i in (!ARGS!) do (
  4.     endlocal
  5.     dir /A "%%~fi" | > nul 2>&1 findstr "DIR" && (
  6.         "7z a "%%~i.7z" "%%~i\*" -mx9 -mmt
  7.     ) || (
  8.         7z a "%%~i.7z" "%%~fi" -mx9 -mmt
  9.     )
  10.     setlocal
  11. )
  12. 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 的解释都对, 只是写的代码令人忍俊不禁

  1. @echo off
  2. set "ARGS=%*"
  3. setlocal EnableDelayedExpansion
  4. for %%i in (!ARGS!) do (
  5.     endlocal
  6. (
  7.         7z.exe a "%%~ni.7z" "%%~i" -mx9 -mmt
  8.     )
  9.     setlocal
  10. )
  11. endlocal
复制代码



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

发表于 2023-12-24 04:35 来自手机 | 显示全部楼层
23年了 pwsh吧
发表于 2023-12-24 04:47 | 显示全部楼层
知道玩批命令就不知道批量改文件名?乌发李姐。。。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2024-6-16 06:08 , Processed in 0.011827 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表