找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 4343|回复: 9

[文本处理] 我用bat做了一个AI任务自动化工具,但是一打开就闪退

[复制链接]
发表于 2025-7-3 21:03:09 | 显示全部楼层 |阅读模式
各位大佬好!我是刚接触批处理的小白自学,写了个AI工具脚本,但一运行就闪退,卡了实在没头绪😢 想请教大家帮忙看看怎么改~
  1. @echo off
  2. chcp 65001 >nul
  3. setlocal enabledelayedexpansion
  4. set "DEBUG_MODE=1"

  5. :: AI任务自动化工具 v1.0.2
  6. set "PROJECT_PATH=D:\AI_Project"
  7. set "VENV_PATH=%PROJECT_PATH%\venv"
  8. set "LOG_FILE=%PROJECT_PATH%\log\ai_tool.log"
  9. set "CONFIG_FILE=%PROJECT_PATH%\config.ini"
  10. set "INPUT_FILE=%PROJECT_PATH%\input.txt"
  11. set "OUTPUT_FILE=%PROJECT_PATH%\output.txt"

  12. set "LOG_LEVEL_DEBUG=1"
  13. set "LOG_LEVEL_INFO=2"
  14. set "LOG_LEVEL_WARN=3"
  15. set "LOG_LEVEL_ERROR=4"
  16. set "CURRENT_LOG_LEVEL=%LOG_LEVEL_INFO%"

  17. if not exist "%PROJECT_PATH%\log" mkdir "%PROJECT_PATH%\log" 2>nul

  18. :: 日志函数
  19. :log
  20. if %CURRENT_LOG_LEVEL% gtr %1 exit /b
  21. for /f "skip=1" %%x in ('wmic os get LocalDateTime') do if not defined timestamp set "timestamp=%%x"
  22. set "timestamp=%timestamp:~0,4%-%timestamp:~4,2%-%timestamp:~6,2% %timestamp:~8,2%:%timestamp:~10,2%:%timestamp:~12,2%"
  23. if %1 equ %LOG_LEVEL_DEBUG% (set "level_prefix=DEBUG") else if %1 equ %LOG_LEVEL_INFO% (set "level_prefix=INFO ") else if %1 equ %LOG_LEVEL_WARN% (set "level_prefix=WARN ") else (set "level_prefix=ERROR")
  24. echo %timestamp% [%level_prefix%] - %* >> "%LOG_FILE%"
  25. if %DEBUG_MODE% equ 1 echo %timestamp% [%level_prefix%] - %*
  26. exit /b

  27. :: 检查Python
  28. :check_python
  29. echo 检查Python环境...
  30. python --version >nul 2>&1 || (
  31.     echo 错误: 未找到Python解释器!请安装Python并添加到PATH。
  32.     echo 下载地址: https://www.python.org/downloads/
  33.     call :log %LOG_LEVEL_ERROR% "未找到Python解释器"
  34.     pause
  35.     exit /b 1
  36. )
  37. exit /b 0

  38. :: 创建目录
  39. :create_dir
  40. if not exist "%~1" (
  41.     mkdir "%~1" 2>nul || (
  42.         echo 错误: 无法创建目录 "%~1"!请检查权限。
  43.         call :log %LOG_LEVEL_ERROR% "无法创建目录: %~1"
  44.         pause
  45.         exit /b 1
  46.     )
  47.     echo 已创建目录: %~1
  48.     call :log %LOG_LEVEL_INFO% "已创建目录: %~1"
  49. )
  50. exit /b 0

  51. :: 创建虚拟环境
  52. :create_venv
  53. echo 创建Python虚拟环境...
  54. python -m venv "%VENV_PATH%" || (
  55.     echo 错误: 无法创建虚拟环境!请检查Python安装。
  56.     call :log %LOG_LEVEL_ERROR% "无法创建虚拟环境"
  57.     pause
  58.     exit /b 1
  59. )
  60. echo 虚拟环境已创建: %VENV_PATH%
  61. call :log %LOG_LEVEL_INFO% "虚拟环境已创建"
  62. exit /b 0

  63. :: 安装依赖
  64. :install_dependencies
  65. echo 安装Python依赖库...
  66. "%VENV_PATH%\Scripts\python.exe" -m pip install torch diffusers transformers -q || (
  67.     echo 错误: 依赖库安装失败!请检查网络连接
  68.     call :log %LOG_LEVEL_ERROR% "依赖库安装失败"
  69.     pause
  70.     exit /b 1
  71. )
  72. echo 依赖库安装完成
  73. call :log %LOG_LEVEL_INFO% "依赖库安装完成"
  74. exit /b 0

  75. :: 初始化环境
  76. :init_env
  77. call :log %LOG_LEVEL_INFO% "开始环境初始化"
  78. echo ==========================
  79. echo        环境初始化
  80. echo ==========================
  81. echo.

  82. call :check_python || exit /b 1
  83. call :create_dir "%PROJECT_PATH%" || exit /b 1
  84. call :create_dir "%PROJECT_PATH%\outputs"
  85. call :create_dir "%PROJECT_PATH%\log"

  86. if not exist "%VENV_PATH%\Scripts\python.exe" (
  87.     call :create_venv || exit /b 1
  88.     call :install_dependencies || exit /b 1
  89. )

  90. set "PYTHON_EXE=%VENV_PATH%\Scripts\python.exe"
  91. echo 使用Python解释器: %PYTHON_EXE%
  92. call :log %LOG_LEVEL_INFO% "使用Python解释器: %PYTHON_EXE%"

  93. echo 检查CUDA环境...
  94. %PYTHON_EXE% -c "import torch; print('CUDA可用' if torch.cuda.is_available() else 'CUDA不可用')" >nul 2>&1
  95. if %errorlevel% neq 0 (
  96.     echo 警告: 无法检测CUDA环境,图像生成可能无法使用GPU加速
  97.     call :log %LOG_LEVEL_WARN% "无法检测CUDA环境"
  98. ) else call :log %LOG_LEVEL_INFO% "CUDA环境检查完成"

  99. call :log %LOG_LEVEL_INFO% "环境初始化完成"
  100. echo 环境初始化完成!
  101. timeout /t 2 >nul
  102. goto menu

  103. :: 主菜单
  104. :menu
  105. cls
  106. echo =============================
  107. echo    本地AI任务自动化工具 v1.0.2
  108. echo =============================
  109. echo.
  110. echo  1. 图像生成(Stable Diffusion)
  111. echo  2. 文本生成(LLaMA 7B)
  112. echo  3. 查看日志
  113. echo  4. 重新初始化环境
  114. echo  5. 使用方法
  115. echo  6. 退出程序
  116. echo.
  117. echo ========================
  118. choice /c 123456 /n /m "请选择操作 [1-6]: "
  119. if errorlevel 6 goto exit
  120. if errorlevel 5 goto usage
  121. if errorlevel 4 goto init_env
  122. if errorlevel 3 goto view_log
  123. if errorlevel 2 goto txt_gen_menu
  124. if errorlevel 1 goto img_gen_menu

  125. :: 图像生成
  126. :img_gen_menu
  127. cls
  128. echo =====================================
  129. echo             图像生成设置
  130. echo =====================================
  131. echo.
  132. set /p prompt=请输入提示词:
  133. set /p steps=生成步数 [50]:
  134. if "%steps%"=="" set steps=50
  135. set /p seed=随机种子 [1234]:
  136. if "%seed%"=="" set seed=1234

  137. echo.
  138. echo 生成参数:
  139. echo 提示词: %prompt%
  140. echo 步数: %steps%
  141. echo 种子: %seed%
  142. echo.
  143. choice /c yn /n /m "确认生成图像吗?(Y/N): "
  144. if errorlevel 2 goto menu

  145. for /f "skip=1" %%x in ('wmic os get LocalDateTime') do if not defined timestamp set "timestamp=%%x"
  146. set "timestamp=%timestamp:~0,4%%timestamp:~4,2%%timestamp:~6,2%_%timestamp:~8,2%%timestamp:~10,2%%timestamp:~12,2%"
  147. set "OUTPUT_DIR=%PROJECT_PATH%\outputs\%timestamp%"
  148. call :create_dir "%OUTPUT_DIR%" || goto menu

  149. call :log %LOG_LEVEL_INFO% "开始图像生成 - 提示词: %prompt%, 步数: %steps%, 种子: %seed%, 输出: %OUTPUT_DIR%"

  150. echo 正在生成图像...
  151. %PYTHON_EXE% generate_image.py --prompt "%prompt%" --steps %steps% --seed %seed% --output "%OUTPUT_DIR%" > "%OUTPUT_DIR%\generation.log" 2>&1
  152. if %errorlevel% neq 0 (
  153.     echo 错误: 生成失败!查看 %OUTPUT_DIR%\generation.log 获取详情
  154.     call :log %LOG_LEVEL_ERROR% "图像生成失败 - 错误代码: %errorlevel%"
  155.     if exist "%OUTPUT_DIR%\generation.log" type "%OUTPUT_DIR%\generation.log" | findstr /i "error" >> "%LOG_FILE%"
  156.     pause
  157. ) else (
  158.     echo 图像生成成功!输出目录: %OUTPUT_DIR%
  159.     call :log %LOG_LEVEL_INFO% "图像生成成功"
  160.     timeout /t 3 >nul
  161. )
  162. goto menu

  163. :: 文本生成
  164. :txt_gen_menu
  165. cls
  166. echo ========================
  167. echo           文本生成设置
  168. echo ========================
  169. echo.
  170. echo 注意: 文本生成将从 %INPUT_FILE% 读取输入提示
  171. echo.
  172. set /p timeout=超时时间(秒) [30]:
  173. if "%timeout%"=="" set timeout=30
  174. echo.
  175. echo 生成参数:
  176. echo 输入文件: %INPUT_FILE%
  177. echo 输出文件: %OUTPUT_FILE%
  178. echo 超时: %timeout%秒
  179. echo.
  180. choice /c yn /n /m "确认开始文本生成吗?(Y/N): "
  181. if errorlevel 2 goto menu

  182. if not exist "%INPUT_FILE%" (
  183.     echo 错误: 输入文件 "%INPUT_FILE%" 不存在!创建示例文件...
  184.     >"%INPUT_FILE%" echo 请输入提示文本,AI将基于此生成内容。
  185.     if exist "%INPUT_FILE%" (
  186.         echo 已创建示例输入文件: %INPUT_FILE%
  187.         call :log %LOG_LEVEL_WARN% "创建示例输入文件"
  188.         timeout /t 3 >nul
  189.     ) else (
  190.         echo 错误: 无法创建示例输入文件!
  191.         call :log %LOG_LEVEL_ERROR% "无法创建示例输入文件"
  192.         pause
  193.         goto menu
  194.     )
  195. )

  196. (
  197.     echo [text_gen]
  198.     echo input_file=%INPUT_FILE%
  199.     echo output_file=%OUTPUT_FILE%
  200.     echo timeout=%timeout%
  201. ) > "%CONFIG_FILE%" 2>nul || (
  202.     echo 错误: 无法创建配置文件!
  203.     call :log %LOG_LEVEL_ERROR% "无法创建配置文件: %CONFIG_FILE%"
  204.     pause
  205.     goto menu
  206. )

  207. call :log %LOG_LEVEL_INFO% "开始文本生成 - 输入: %INPUT_FILE%, 输出: %OUTPUT_FILE%, 超时: %timeout%秒"

  208. echo 正在生成文本...
  209. %PYTHON_EXE% generate_text.py --config "%CONFIG_FILE%" > "%PROJECT_PATH%\outputs\text_generation.log" 2>&1
  210. if %errorlevel% neq 0 (
  211.     echo 错误: 生成失败!查看 %PROJECT_PATH%\outputs\text_generation.log 获取详情
  212.     call :log %LOG_LEVEL_ERROR% "文本生成失败 - 错误代码: %errorlevel%"
  213.     if exist "%PROJECT_PATH%\outputs\text_generation.log" type "%PROJECT_PATH%\outputs\text_generation.log" | findstr /i "error" >> "%LOG_FILE%"
  214.     pause
  215. ) else (
  216.     echo 文本生成成功!输出文件: %OUTPUT_FILE%
  217.     call :log %LOG_LEVEL_INFO% "文本生成成功"
  218.     timeout /t 3 >nul
  219. )
  220. goto menu

  221. :: 查看日志
  222. :view_log
  223. cls
  224. echo ===========================
  225. echo           操作日志
  226. echo ===========================
  227. echo.

  228. if not exist "%LOG_FILE%" (
  229.     echo 日志文件不存在或为空。
  230.     pause
  231.     goto menu
  232. )

  233. set "page_size=15"
  234. for /f %%a in ('type "%LOG_FILE%" ^| find /c /v ""') do set /a "total_lines=%%a, pages=(total_lines+page_size-1)/page_size"
  235. if %pages% equ 0 set pages=1

  236. set /p page=输入页数 [1-%pages%]:
  237. if "%page%"=="" set page=1
  238. if %page% lss 1 (echo 错误: 页数不能小于1!& timeout /t 2 >nul & goto view_log)
  239. if %page% gtr %pages% (echo 错误: 页数不能大于%pages%!& timeout /t 2 >nul & goto view_log)

  240. set /a start_line=(%page%-1)*%page_size%+1, end_line=start_line+page_size-1
  241. if %end_line% gtr %total_lines% set end_line=%total_lines%

  242. echo 第%page%页 / 共%pages%页
  243. echo.

  244. setlocal enabledelayedexpansion
  245. set "lines=0"
  246. for /f "usebackq delims=" %%a in ("%LOG_FILE%") do (
  247.     set /a lines+=1
  248.     if !lines! geq %start_line% if !lines! leq %end_line% echo !line!
  249. )
  250. endlocal

  251. echo.
  252. echo =========================================
  253. pause >nul
  254. goto menu

  255. :: 使用方法
  256. :usage
  257. cls
  258. echo ==========================
  259. echo           使用方法
  260. echo ==========================
  261. echo.
  262. echo 1. 环境初始化:自动检查并初始化环境
  263. echo 2. 图像生成:基于Stable Diffusion生成图像
  264. echo 3. 文本生成:基于LLaMA 7B生成文本
  265. echo 4. 重新初始化环境:重建虚拟环境并安装依赖
  266. echo 5. 查看日志:查看工具运行记录
  267. echo 6. 退出程序:结束工具运行
  268. echo.
  269. pause >nul
  270. goto menu

  271. :: 退出程序
  272. :exit
  273. call :log %LOG_LEVEL_INFO% "程序正常退出"
  274. cls
  275. echo =================================
  276. echo    感谢使用本地AI任务自动化工具!
  277. echo =================================
  278. timeout /t 2 >nul
  279. exit /b 0

  280. :: 直接运行时初始化环境
  281. if "%0"=="%~dpnx0" call :init_env
复制代码
发表于 2025-7-3 23:17:15 | 显示全部楼层
bat的标签是按顺序执行的,:log :check_python :create_dir
应该把:menu 放到前面
发表于 2025-7-4 08:09:55 | 显示全部楼层
回复 2# flashercs


请参考Q-01观察一下在哪一步退出的:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
发表于 2025-7-4 10:55:51 | 显示全部楼层
回复 1# xnssg

一楼代码至少有两点须特别注意》
一。代码先切换码页到65001,就要求存盘批处脚本文件时须采用utf-8编码,否则代码中的中文屏显数据会变成乱码...
二。批处脚本是从上往下逐行(或逐块)执行的,因此,主控部分的行序要先于那些被其调用的子过程或子函数(除非用条件goto跳过),否则后者会在未被前者调用前就会执行,当然容易出错。例如代码中的 :log 子过程应该后置到代码末尾。据此,楼主须重新理清每个 :xxx 子过程与主控部分的从属(调用)关系及其行序...
发表于 2025-7-4 17:56:14 | 显示全部楼层
运行完第30行就直接退出了吧
那么多exit /b而且又没有用goto跳过 ,大概是流程没控制好
还有代码里用了chcp 65001 >nul ,bat文件编码得保存为utf-8,最后是没有bom的,而且为了防止utf-8编码出问题,最好在包含中文的那些代码行末尾添加一个英文空格
 楼主| 发表于 2025-7-6 10:58:53 | 显示全部楼层
回复 5# Five66

谢谢啦
 楼主| 发表于 2025-7-6 10:59:10 | 显示全部楼层
回复 4# aloha20200628


    谢谢啦
 楼主| 发表于 2025-7-6 10:59:30 | 显示全部楼层
回复 3# Batcher
谢谢啦
 楼主| 发表于 2025-7-6 10:59:45 | 显示全部楼层
回复 2# flashercs


    谢谢啦
发表于 2025-7-10 11:30:44 | 显示全部楼层
该说的楼上的大神们都说得差不多了,
告诉你一个经验之谈,
有个万能的查错方法:在感觉有可能出错的地方插入pause.
特别是在:xxx 标签结尾句或跳跃句,插入,,

学会灵活的使用pause暂停查错方法,基本可以自行排查脚本编写过程中一大半以上的出错。特别适用小白和新手,,
也是一步步拆解脚本运行步骤的重要方法,没有任何复杂的脚本能抵挡得了,一步步暂停之后被拆解的过程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 10:20 , Processed in 0.021470 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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