[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]用于自动加密的BAT脚本无法处理带括号的路径

本帖最后由 Rxinns 于 2023-9-5 17:33 编辑

请问一下大佬,我用ChatGPT帮忙写了一个脚本,但是这个脚本没办法输入带有英文双括号的路径,例如“D:\Desktop\学号(2).xls“,输入之后脚本会直接退出,没有任何提示。该怎么解决?
  1. @echo off
  2. rem ——————————————————————————
  3. REM 修改终端外观
  4. mode 49,15
  5. title 自动加密文件脚本(基于 7-zip )
  6. setlocal enabledelayedexpansion
  7. rem ——————————————————————————
  8. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  9. REM ▓▓输出路径在这里!!!▓▓
  10. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  11. set "outputroute=D:\desktop\"
  12. rem ——————————————————————————
  13. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  14. REM ▓▓程序路径在这里!!!▓▓
  15. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  16. set "zipProgram=C:\Program Files\7-Zip\7z.exe"
  17. rem ——————————————————————————
  18. REM 检查是否存在 7-Zip 程序
  19. if not exist "%zipProgram%" (
  20.     cls
  21.     color 4E
  22.     echo.
  23.     echo  -----------------------------------------------
  24.     echo   错误:找不到 7-Zip 程序。请确保程序已正确安装,
  25.     echo   并修改脚本中的“zipProgram”变量指向正确路径。
  26.     echo  -----------------------------------------------
  27.     echo.
  28.     pause >nul
  29.     goto :Error
  30. )
  31. rem ——————————————————————————
  32. REM 提示用户输入要压缩的文件路径
  33. color 1E
  34. echo.
  35. echo  -----------------------------------------------
  36. echo                      提示:
  37. echo        仅支持单个文件或者单个文件夹处理,
  38. echo           不支持多个文件或多个文件夹!
  39. echo  -----------------------------------------------
  40. echo.
  41. set /p "filePath=请输入要压缩的文件/文件夹的路径,或拖动文件/文件夹到窗口内,然后按 Enter 键: "
  42. rem ——————————————————————————
  43. REM 检测文件或文件夹是否存在
  44. if not exist "%filePath%" (
  45.     cls
  46.     color 4E
  47.     echo.
  48.     echo 您输入的路径为:
  49.     echo.
  50.     echo %filePath%
  51.     echo.
  52.     echo  -----------------------------------------------
  53.     echo   错误:找不到文件/文件夹。请检查路径是否有误。
  54.     echo  -----------------------------------------------
  55.     echo.
  56.     pause >nul
  57.     goto :Error
  58. )
  59. rem ——————————————————————————
  60. REM 随机生成密码
  61. setlocal EnableDelayedExpansion
  62. set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  63. set "password="
  64. for /L %%i in (1,1,64) do (
  65.     set /a "rand=!random! %% 62"
  66.     for /f %%j in ("!rand!") do (
  67.         set "password=!password!!chars:~%%j,1!"
  68.     )
  69. )
  70. endlocal & set "password=%password%"
  71. rem ——————————————————————————
  72. REM 提取原文件的文件名和拓展名
  73. for %%F in ("%filePath%") do set "fileName=%%~nF"
  74. for %%F in ("%filePath%") do set "extension=%%~xF"
  75. rem ——————————————————————————
  76. REM 组合出压缩包的文件名
  77. set "compressedFileName=!fileName!!extension!.7z"
  78. pau
  79. rem ——————————————————————————
  80. REM 压缩文件
  81. "%zipProgram%" a -mx0 -p%password% "%outputroute%!compressedFileName!" "%filePath%"
  82. rem ——————————————————————————
  83. REM 检查压缩是否成功
  84. if %errorlevel% neq 0 (
  85.     color 4E
  86.     echo 压缩文件时发生错误!
  87.     goto :Error
  88. )
  89. rem ——————————————————————————
  90. REM 显示密码
  91. cls
  92. color 2E
  93. echo.
  94. echo                     压缩成功
  95. echo.
  96. echo        请复制密码,关闭窗口将无法找回密码
  97. echo        请复制密码,关闭窗口将无法找回密码
  98. echo        请复制密码,关闭窗口将无法找回密码
  99. echo  -----------------------------------------------
  100. echo.
  101. echo  %compressedFileName% 的密码是:%password%
  102. echo.
  103. echo  -----------------------------------------------
  104. echo                 按任意键关闭窗口
  105. goto :End
  106. rem ——————————————————————————
  107. :Error
  108. REM 报错并退出脚本
  109. exit /b 1
  110. rem ——————————————————————————
  111. :End
  112. REM 正常结束脚本
  113. endlocal
  114. pause >nul
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# Rxinns


请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1# Rxinns


使用2楼提供的方法,可以发现错误在第60行,给变量加上双引号就行了:
  1. echo "%filePath%"
复制代码
2

评分人数

    • Rxinns: 感谢解答!已经解决了问题了技术 + 1
    • 77七: 感谢分享技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 Rxinns 于 2023-9-5 17:36 编辑

回复 3# Batcher


    感谢解答!不过好像不太管用。如果文件名是“学号 (2).xls”(文件名含有空格),那么终端窗口还是会异常关闭。

TOP

回复 4# Rxinns


    请继续使用2楼的方法,观察第几行代码在报错。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 Rxinns 于 2023-9-5 18:41 编辑

回复 5# Batcher
好的,我根据文章的说法,获得了以下内容:
  1. C:\Users\RXI>set /p "filePath=请输入要压缩的文件/文件夹的路径,或拖动文件/文件夹到窗口内,然后按 Enter 键: "
  2. 请输入要压缩的文件/文件夹的路径,或拖动文件/文件夹到窗口内,然后按 Enter 键: "D:\Desktop\学号 (2).xls"
  3. C:\Users\RXI>rem ——————————————————————————
  4. C:\Users\RXI>REM 检测文件或文件夹是否存在
  5. 此时不应有 .xls""。
  6. C:\Users\RXI>if not exist ""D:\Desktop\学号 (2).xls"" (
  7. C:\Users\RXI>
复制代码


这段话发给ChatGPT之后,ChatGPT给出的答复是:

看起来报错是因为文件路径包含了额外的引号。您可以尝试在set /p命令的末尾移除双引号,使输入的文件路径不包含额外的引号。以下是示例的修改:

  1. set /p "filePath=请输入要压缩的文件/文件夹的路径,或拖动文件/文件夹到窗口内,然后按 Enter 键: "
  2. set "filePath=%filePath:"=%"
复制代码


将以上代码添加到原始脚本的set /p行之后,它将移除输入路径中的所有双引号。这样,您再次运行脚本并输入文件路径时,就不会导致额外的引号出现在文件路径中,从而避免报错。

TOP

本帖最后由 Rxinns 于 2023-9-7 10:56 编辑

看起来已经解决了,再次感谢Batcher大佬给出的思路。
下面放出完整的代码,有需要的朋友可以自行修改使用:
  1. @echo off
  2. rem ——————————————————————————
  3. rem ###随机加密脚本 by Rxinns & ChatGPT-3.5###
  4. rem 这个脚本可以调用7-zip将任意单个文件或单个文件夹
  5. rem 加密打包,密码为程序随机生成的64位大小写字母+数字。
  6. rem ——————————————————————————
  7. REM 修改终端外观
  8. mode 49,15
  9. title 自动加密文件脚本(基于 7-zip )
  10. setlocal enabledelayedexpansion
  11. rem ——————————————————————————
  12. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  13. REM ▓▓程序路径在这里!!!▓▓
  14. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  15. set "zipProgram=C:\Program Files\7-Zip\7z.exe"
  16. rem ——————————————————————————
  17. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  18. REM ▓▓输出路径在这里!!!▓▓
  19. REM ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  20. set "outputFolder=D:\desktop\"
  21. rem ——————————————————————————
  22. REM 检查是否存在 7-Zip 程序
  23. if not exist "%zipProgram%" (
  24.     cls
  25.     color 4E
  26.     echo.
  27.     echo  -----------------------------------------------
  28.     echo   错误:找不到 7-Zip 程序。请确保程序已正确安装,
  29.     echo   并修改脚本中的“zipProgram”变量指向正确路径。
  30. echo     7-zip软件下载地址:https://www.7-zip.org/
  31.     echo  -----------------------------------------------
  32.     echo.
  33.     pause
  34.     goto :Error
  35. )
  36. rem ——————————————————————————
  37. REM 提示用户输入要压缩的文件路径
  38. color 1E
  39. echo.
  40. echo  -----------------------------------------------
  41. echo                      提示:
  42. echo        仅支持单个文件或者单个文件夹处理,
  43. echo           不支持多个文件或多个文件夹!
  44. echo  -----------------------------------------------
  45. echo.
  46. set /p "filePath=请输入要压缩的文件/文件夹的路径,或拖动文件/文件夹到窗口内,然后按 Enter 键: "
  47. set "filePath=%filePath:"=%"
  48. rem ——————————————————————————
  49. REM 检测文件或文件夹是否存在
  50. if not exist "%filePath%" (
  51.     cls
  52.     color 4E
  53.     echo.
  54.     echo 您输入的路径为:
  55.     echo.
  56.     echo "%filePath%"
  57.     echo.
  58.     echo  -----------------------------------------------
  59.     echo   错误:找不到文件/文件夹。请检查路径是否有误。
  60.     echo  -----------------------------------------------
  61.     echo.
  62.     pause
  63.     goto :Error
  64. )
  65. rem ——————————————————————————
  66. REM 随机生成密码
  67. setlocal EnableDelayedExpansion
  68. set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  69. set "password="
  70. for /L %%i in (1,1,64) do (
  71.     set /a "rand=!random! %% 62"
  72.     for /f %%j in ("!rand!") do (
  73.         set "password=!password!!chars:~%%j,1!"
  74.     )
  75. )
  76. endlocal & set "password=%password%"
  77. rem ——————————————————————————
  78. REM 提取原文件的文件名和拓展名
  79. for %%F in ("%filePath%") do set "fileName=%%~nF"
  80. for %%F in ("%filePath%") do set "extension=%%~xF"
  81. rem ——————————————————————————
  82. REM 组合出压缩包的文件名
  83. set "compressedFileName=!fileName!!extension!.7z"
  84. rem ——————————————————————————
  85. REM 压缩文件
  86. "%zipProgram%" a -mx0 -p%password% "%outputFolder%!compressedFileName!" "%filePath%"
  87. rem ——————————————————————————
  88. REM 检查压缩是否成功
  89. if %errorlevel% neq 0 (
  90.     color 4E
  91.     echo 压缩文件时发生错误!
  92.     goto :Error
  93. )
  94. rem ——————————————————————————
  95. REM 显示密码
  96. cls
  97. color 2E
  98. echo.
  99. echo                     压缩成功
  100. echo.
  101. echo      ▓ 请复制密码,关闭窗口将无法找回密码▓
  102. echo      ▓ 请复制密码,关闭窗口将无法找回密码▓
  103. echo      ▓ 请复制密码,关闭窗口将无法找回密码▓
  104. echo  -----------------------------------------------
  105. echo.
  106. echo  %compressedFileName% 的密码是:%password%
  107. echo.
  108. echo  -----------------------------------------------
  109. echo.
  110. rem ——————————————————————————
  111. REM 将密码写入文件名
  112. :RenameForPassword
  113. set /p "addPassword=输入“Y”可以将密码写入文件名: "
  114. if /i "%addPassword%"=="y" (
  115.     set "compressedFileNameWithPassword=!fileName!!extension!(密码:!password!).7z"
  116.     ren "%outputfolder%!compressedFileName!" "!compressedFileNameWithPassword!"
  117. cls
  118. echo  -----------------------------------------------
  119. echo.
  120. echo  %compressedFileName% 的密码是:%password%
  121. echo.
  122. echo  -----------------------------------------------
  123. echo.
  124. echo      已尝试将密码写入文件名,请检查是否成功
  125. echo.
  126. echo  -----------------------------------------------
  127. ) else (
  128. cls
  129. echo  -----------------------------------------------
  130. echo.
  131. echo  %compressedFileName% 的密码是:%password%
  132. echo.
  133. echo  -----------------------------------------------
  134. echo.
  135. echo 输入内容错误!如不需要写入,可关闭窗口
  136. echo.
  137.     goto :RenameForPassword
  138. )
  139. goto :End
  140. rem ——————————————————————————
  141. :Error
  142. REM 报错并退出脚本
  143. pause >nul
  144. rem ——————————————————————————
  145. :End
  146. REM 正常结束脚本
  147. endlocal
  148. pause >nul
复制代码

TOP

返回列表