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

[文件操作] 求助--WinPE运行 DrvIndex.exe -t 及 -h 进度条

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式
本帖最后由 766266yyn 于 2026-4-13 09:47 编辑

WinPE 启动过程中加载驱动时多用到 DrvIndex.exe -t 或 -h 可自动 Wifi,但发现往往 DrvIndex.exe 进程没有结束,pecmd 就运行以后的代码,甚至桌面加载完了,而 DrvIndex.exe 还没有结束,所以就想搞一个进度条,贯穿 DrvIndex.exe 整个进程,并待 DrvIndex.exe 运行结束后再运行 pecmd 以后的代码。奈何水平太菜,么有这个能力。所以,请哪位大神出手,做一个DrvIndex.exe -t 及 -h 进度条

在无忧论坛求助过,a66老大给出一个c语言代码和cmd代码,奈何本人不会编译,c语言代码使用不了,而cmd代码PE加载直接卡死,求助a66老师不理我了,没办法在此求助。
各位老师如果觉得我又不妥,可直接批评,不要谩骂。或者管理员直接删帖,不要影响论坛清誉。
这里也非常感谢 a66 老师。

a66老师的 CMD 代码:

  1. @echo off
  2. chcp 437 >nul
  3. mode con cols=60 lines=8
  4. title DrvIndex 加载监控

  5. set "ARGS=%*"
  6. echo 正在启动 DrvIndex.exe %ARGS%
  7. echo.

  8. :: 启动 DrvIndex.exe
  9. start /b "" DrvIndex.exe %ARGS%

  10. :: 进度条动画 + 等待进程结束
  11. set "p=0"
  12. :loop
  13. tasklist | find /i "DrvIndex.exe" >nul
  14. if errorlevel 1 goto done

  15. set /a p+=1
  16. if %p% gtr 50 set p=50

  17. set "bar="
  18. for /l %%i in (1,1,%p%) do set "bar=#%bar%"
  19. for /l %%i in (%p%,1,49) do set "bar=-%bar%"

  20. echo 加载中: [%bar%]
  21. cls
  22. goto loop

  23. :done
  24. cls
  25. echo ============================================================
  26. echo  DrvIndex.exe 已运行完毕
  27. echo  可继续执行后续 PECmd 命令
  28. echo ============================================================
  29. echo.
  30. ping -n 2 127.0.0.1 >nul
  31. exit
复制代码


使用方法
    把 DrvRun.cmd 和 DrvIndex.exe 放在同一个目录
EXEC =%CurDir%\DrvRun.cmd -t


a66 老师的完整C语言源码, 可用 VS 或 gcc 编译:

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <tlhelp32.h>

  4. // 进度条界面宽度
  5. #define PROGRESS_WIDTH 50

  6. // 清空控制台行
  7. void ClearLine() {
  8.     printf("\r");
  9.     for (int i = 0; i < 80; i++) printf(" ");
  10.     printf("\r");
  11. }

  12. // 绘制进度条
  13. void DrawProgress(int percent) {
  14.     char bar[PROGRESS_WIDTH + 1] = {0};
  15.     int pos = percent * PROGRESS_WIDTH / 100;

  16.     memset(bar, '#', pos);
  17.     memset(bar + pos, '-', PROGRESS_WIDTH - pos);

  18.     printf("\r[DrvIndex 运行中] [%s] %d%% ", bar, percent);
  19.     fflush(stdout);
  20. }

  21. // 等待进程结束,并更新进度条
  22. void WaitProcess(DWORD pid) {
  23.     int pct = 0;
  24.     while (1) {
  25.         HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  26.         PROCESSENTRY32 pe32;
  27.         pe32.dwSize = sizeof(PROCESSENTRY32);

  28.         BOOL found = FALSE;
  29.         if (Process32First(hSnapshot, &pe32)) {
  30.             do {
  31.                 if (pe32.th32ProcessID == pid) {
  32.                     found = TRUE;
  33.                     break;
  34.                 }
  35.             } while (Process32Next(hSnapshot, &pe32));
  36.         }
  37.         CloseHandle(hSnapshot);

  38.         if (!found) break;

  39.         // 模拟进度(0-95%)
  40.         if (pct < 95) pct++;
  41.         DrawProgress(pct);
  42.         Sleep(150);
  43.     }

  44.     // 完成
  45.     DrawProgress(100);
  46.     ClearLine();
  47.     printf("[DrvIndex 已完成] 进程已正常退出\n");
  48. }

  49. int main(int argc, char* argv[]) {
  50.     // 控制台标题
  51.     SetConsoleTitleA("DrvIndex 进度条启动器");

  52.     // 拼接命令行:DrvIndex.exe + 传入的参数
  53.     char cmd[512] = "DrvIndex.exe ";
  54.     for (int i = 1; i < argc; i++) {
  55.         strcat(cmd, argv[i]);
  56.         strcat(cmd, " ");
  57.     }

  58.     printf("正在启动:%s\n", cmd);
  59.     printf("========================================\n");

  60.     // 创建进程
  61.     STARTUPINFOA si;
  62.     PROCESS_INFORMATION pi;
  63.     ZeroMemory(&si, sizeof(si));
  64.     ZeroMemory(&pi, sizeof(pi));
  65.     si.cb = sizeof(si);

  66.     if (!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
  67.         printf("错误:无法启动 DrvIndex.exe\n");
  68.         system("pause >nul");
  69.         return 1;
  70.     }

  71.     // 等待进程结束 + 进度条动画
  72.     WaitProcess(pi.dwProcessId);

  73.     // 清理句柄
  74.     CloseHandle(pi.hProcess);
  75.     CloseHandle(pi.hThread);

  76.     printf("========================================\n");
  77.     printf("可以继续执行后续 PECmd 命令\n\n");
  78.     return 0;
  79. }
复制代码

发表于 6 天前 | 显示全部楼层
没有pe系统复验你的问题,只能给一点旁敲侧击的建议:
一。pe系统启动过程你能干预调整吗?
二。若能,会用哪些方法?这些方法允许增减参与启动过程的程序吗?或允许改变这些程序的先后顺序吗?
三。若允许,可以尝试将 DrvIndex.exe 放到启动过程最后一步运行,或与启动过程分开,其后单独运行。
发表于 6 天前 来自手机 | 显示全部楼层
aloha20200628 发表于 2026-4-13 13:22
没有pe系统复验你的问题,只能给一点旁敲侧击的建议:
一。pe系统启动过程你能干预调整吗?
二。若能,会用 ...

我觉得问题不是这样,我以前也玩过PE,他的问题是,启动进程,附加参数启动,等待进程加载完毕,结束退出,然后PE脚本才继续,,,

批处理写法上面没多大问题,只是有一个小纰漏,在启动前没有检查是否有DrvIndex.exe已经多进程在运行,,
在启动进程后,没有加载延迟,直接跳到检测进程是否驻留,这样写法会有一个后果,如果进程列表里已经有DrvIndex.exe存在,脚本会一直检测到errorlevel  代码 一直以1存在,,,
进度条就一直存在,,,

DrvIndex.exe,,在PE启动多个进程的时候,容易造成领一进程卡死,或加载缓慢,特别是内存有问题,或驱动不兼容的时候,会有某个驱动一直在安装状态,,,

解决他那问题嘛,说难也难,说不难也难,,,就是在启动前,先获取所有DrvIndex.exe进程的PID,再启动新的DrvIndex.exe,那样新出现的DrvIndex.exe进程PID就是刚启动的了,再检测这个新的PID,是否已经退出,然后才是跳到退出进度条,,,

只检测DrvIndex.exe,在多进程的情况下,那进度条永远也别想退出,因为常规PE在加载驱动的时候总有那么一个不肯退出,或退出得特别滞后,,,,

而至于,他那脚本还没退出就直接执行后续,我觉得,是PE脚本代码  
EXEC =%CurDir%\DrvRun.cmd -t
没有和批处理 start /w  一样的等待机制,,个人猜而已,,以前没注意过,,

思路大概问题就这样,,人在外面工作,爪机手打,只能纸上谈兵,,,
 楼主| 发表于 6 天前 | 显示全部楼层
本帖最后由 766266yyn 于 2026-4-13 14:17 编辑
aloha20200628 发表于 2026-4-13 13:22
没有pe系统复验你的问题,只能给一点旁敲侧击的建议:
一。pe系统启动过程你能干预调整吗?
二。若能,会用 ...


可以,启动过程可以通过配置文件控制,比如顺序、每个命令行的的显示或隐藏运行、等待时间等。

 楼主| 发表于 6 天前 | 显示全部楼层
jiavip 发表于 2026-4-13 14:15
我觉得问题不是这样,我以前也玩过PE,他的问题是,启动进程,附加参数启动,等待进程加载完毕,结束退出 ...

谢谢老师,我虽不懂,觉得原理如此,奈何自己不会弄啊。
发表于 6 天前 | 显示全部楼层
766266yyn 发表于 2026-4-13 14:16
可以,启动过程可以通过配置文件控制,比如顺序、每个命令行的的显示或隐藏运行、等待时间等。

...

把 drvIndex.exe -h -t 调整到配置文件最后一行的运行效果如何?
发表于 6 天前 | 显示全部楼层
jiavip 发表于 2026-4-13 14:15
我觉得问题不是这样,我以前也玩过PE,他的问题是,启动进程,附加参数启动,等待进程加载完毕,结束退出 ...

用A程序监视B程序的前提是确保A程序能够可靠判断B程序的终止标志 - 或进程标志或文件标志或其他可靠标志...
发表于 6 天前 来自手机 | 显示全部楼层
aloha20200628 发表于 2026-4-13 13:22
没有pe系统复验你的问题,只能给一点旁敲侧击的建议:
一。pe系统启动过程你能干预调整吗?
二。若能,会用 ...

不需要PE环境也可以复验的,PECMD.EXE 可以在常规WIN平台下运行,也可以加载配置文件运行,你可以把它当成一个小号的PowerShell 或第三方的Nircmd等第三方工具就可以了,上面不不少命令和组合挺实用的,,,我以前也摸过不少,现在年纪大了,没那心思和冲劲了,,,

--------说一个上古时期的笑话啊!
男人20,,,日立
男人30,,,奔腾
男人40,,,微软
男人50,,,松下
男人60,,,联想
男人70,,,东芝
男人80,,,图灵
,,,,,,,哈哈,,
鄙人,早已步入,微软之秋,却没有微软的市值,让人更难接受的事实是,此软是真实的软,,,
男人之隐,寡人之疾。,,唉。,,
 楼主| 发表于 6 天前 | 显示全部楼层
aloha20200628 发表于 2026-4-13 14:50
把 drvIndex.exe -h -t 调整到配置文件最后一行的运行效果如何?

放最后可以,加载驱动以后不会执行最后的刷新命令,因为DrvIndex.exe运行还没有结束,pecmd就已经运行了最后刷新指令了,没有刷新就不能显示任务栏及开始菜单工具,有的也不会自动连接 Wifi。
发表于 6 天前 | 显示全部楼层
766266yyn 发表于 2026-4-13 16:21
放最后可以,加载驱动以后不会执行最后的刷新命令,因为DrvIndex.exe运行还没有结束,pecmd就已经运行了 ...

   在专注PE的论坛或那些熟悉PE的先知和先行者,应该很容易解决你遭遇的问题吧?不要先强调需要一个进度条,而是要说清楚 drvindex.exe 与后续程序的 '冲突' 问题...
   求解只须说明缘由和真相,让解答者给解法就是了
发表于 6 天前 | 显示全部楼层
  1. @echo off

  2. set "ARGS=%*"
  3. DrvIndex.exe %ARGS%

  4. :loop
  5. timeout /t 3 /nobreak
  6. tasklist | find /i "DrvIndex.exe"
  7. if not errorlevel 1 (
  8.         goto :loop
  9. )

  10. pause
复制代码

 楼主| 发表于 6 天前 | 显示全部楼层
aloha20200628 发表于 2026-4-13 16:55
在专注PE的论坛或那些熟悉PE的先知和先行者,应该很容易解决你遭遇的问题吧?不要先强调需要一个进度 ...

pecmd.ini最后两行:目的是让 DrvIndex.exe 运行结束后刷新 explorer.exe,结果是 DrvIndex.exe 运行结束后什么也没做

  1. ... ...
  2. TEAM EXEC "%ProgramFiles%\Drvindex\Drvindex.exe" -t| WAIT 600| EXEC "%ProgramFiles%\Drvindex\Drvindex.exe" -h
  3. TEAM KILL Explorer.exe|LOAD NEI*FixWinD| WAIT 800
复制代码
 楼主| 发表于 6 天前 | 显示全部楼层

谢谢上校,如何使用?
发表于 6 天前 | 显示全部楼层
切!,,,他写的那进度条动画,,,不好用啊!,,,差评,,
-------------原进度条动画---------------------

  1. @echo off
  2. :: 进度条动画 + 等待进程结束
  3. set "p=0"
  4. :loop
  5. ::::::tasklist | find /i "DrvIndex.exe" >nul
  6. ::::::if errorlevel 1 goto done

  7. set /a p+=1
  8. if %p% gtr 50 set p=50

  9. set "bar="
  10. for /l %%i in (1,1,%p%) do set "bar=#%bar%"
  11. for /l %%i in (%p%,1,49) do set "bar=-%bar%"

  12. echo 加载中: [%bar%]
  13. cls
  14. goto loop
复制代码


-------------对比一下我刚写的进度条动画------------------

  1. @echo off
  2. Color e0
  3. Mode con cols=54 lines=3
  4. For /l %%i in (1,1,50) do Call Set "a=%%a%%="
  5. Set c=%a%
  6. :Loop
  7. Set/a s+=1
  8. Set "c=%c:~1%"
  9. Set "b=%b%^>"
  10. Ping 1 -n 1>Nul
  11. If %s%==51 Set s=0&Set c=%a%&Set b=
  12. Cls
  13. Echo.【%b%%c%】
  14. Echo.程序加载中.
  15. Title  程序加载中.%b%%c%
  16. Goto,Loop
复制代码


相比我写的动画效果 就明显多了,,,
要说写这些,花里胡哨的代码,,以前我可没少折腾。,,,
我记得我好像还发布过一个,,走马灯背景颜色的 批处理,,,
还发布过一个,多种颜色同时存在的批处理背景,花里胡哨的,,,
 楼主| 发表于 6 天前 | 显示全部楼层
jiavip 发表于 2026-4-13 19:41
切!,,,他写的那进度条动画,,,不好用啊!,,,差评,,
-------------原进度条动画---------------- ...

调用方法?

11楼老师的我 EXEC “X:\Program Files\DrvIndex\DrvIndex.cmd” -t -h,结果出现 DrvIndex.exe 不是内部也不是外部命令....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-19 19:32

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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