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

[其他] [已解决]求助批处理延迟变量赋值的问题

[复制链接]
发表于 2025-4-30 16:58:08 | 显示全部楼层 |阅读模式
本帖最后由 zhoubin 于 2025-5-1 13:32 编辑

::请根据实际情况,修改:j:\常用工具-文件\MAKE ISO\64位Windows8 专业版(原RESC.GHO)华硕P43SJ.WIM文件路径,适合32位Win7PE和64位Win8PE添加文件,参考
PUSHD %~dp0
@ECHO OFF
for /f "tokens=1* delims=[" %%a in ('ver') do set FulVer=%%b
set FulVer=%FulVer:* =%
for /f "tokens=2 delims=[" %%a in ('ver') do for /f "tokens=2,3 delims=. " %%b in ("%%a") do set Winver=%%b%%c
@ECHO On
::if /i not "%windir:~,2%"=="X:" exit
set TarWim=j:\常用工具-文件\MAKE ISO\64位Windows8 专业版(原RESC.GHO)华硕P43SJ.WIM
If not Exist "%TarWim%" goto GetFileVer

DISM.exe /Get-WimInfo /WimFile:"%TarWim%"
SET /P drive_letter=   请输入你要查看挂载的wim镜像卷(1/2/3/4/5...)
@echo.
DISM.exe /Get-WIMInfo /WimFile:"%TarWim%" /index:%drive_letter%
@echo.
@echo 按任意键开始挂载指定wim卷文件......
@pause >NUL 2>NUL
md D:\123
Dism.exe /Mount-Wim /WimFile:"%TarWim%" /index:%drive_letter% /MountDir:d:\123 /ReadOnly
::start "" explorer.exe /n,"D:\123\Windows\System32\"
set TarDir=C:\Windows
if exist "D:\123\Windows\*" set TarDir=D:\123\Windows
call :MakeFileLst
call :JudgeSys
if exist FlashCenter补充文件.txt call :CopyFiles
@echo.
@echo 按任意键开始卸载......
@pause >NUL 2>NUL

DISM.exe /Unmount-Wim /MountDir:d:\123 /discard
rd /s /q D:\123
pause&&exit

:MakeFileLst
del FlashCenter补充文件.txt 2>NUL
if /i not "%windir:~,2%"=="X:" set TarDiX=%TarDir%
if /i "%windir:~,2%"=="X:" set TarDiX=%WinDir%
if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo ;;FlashCenter For Win10.安装再精简-FlashCenter可用,32位win7PE下,还需补充以下文件,PE下请连网测试;存档参考. . .>FlashCenter补充文件.txt
if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\System32\d3d9.dll>>FlashCenter补充文件.txt
帖子字数限制,其他文件,略. . .

if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo ;;FlashCenter For Win10.安装再精简-FlashCenter可用,32位win7PE下,还需补充以下文件,PE下请连网测试;存档参考. . .>FlashCenter补充文件.txt
if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\SysWOW64\d3d9.dll>>FlashCenter补充文件.txt
帖子字数限制,其他文件,略. . .

if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo ;;FlashCenter For Win10.安装再精简-FlashCenter可用,64位win8PE下,还需补充以下文件,PE下请连网测试;存档参考. . .>FlashCenter补充文件.txt
if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\dhcpcsvc.dll>>FlashCenter补充文件.txt
帖子字数限制,其他文件,略. . .
goto :eof

:CopyFiles
@echo off
PUSHD %~dp0

if /i "%windir:~,2%"=="X:" goto CopyFilesPE
for /f "delims=" %%a in (FlashCenter补充文件.txt) do (
  for /f "delims=" %%b in ("\%%~a") do (
    if /i not "%windir:~,2%"=="X:" if not exist "D:\123\Windows\*" xcopy "C:\%%~a" "%cd%\FlashCenter补充文件%%~pb" /h /y
    if /i not "%windir:~,2%"=="X:" if exist "D:\123\Windows\*" xcopy "D:\123\%%~a" "%cd%\FlashCenter补充文件%%~pb" /h /y
  )
)
@echo on
if exist "%cd%\FlashCenter补充文件" move FlashCenter补充文件.txt "%cd%\FlashCenter补充文件"
goto :eof

:CopyFilesPE
@echo off
PUSHD %~dp0
for /f "delims=" %%a in (FlashCenter补充文件.txt) do (
  for /f "delims=" %%b in ("\%%~a") do (
    if /i "%windir:~,2%"=="X:" if %TarVer:~,4%==%FulVer:~,4% if exist "D:\123\*" xcopy "D:\123\%%~a" "%SystemDrive%\%%~pb" /h /y
    if /i "%windir:~,2%"=="X:" if %TarVer:~,4%==%FulVer:~,4% if %TardrV%==C: xcopy "C:\%%~a" "%SystemDrive%\%%~pb" /h /y

  )
)
@echo on
if /i "%windir:~,2%"=="X:" IF %PROCESSOR_ARCHITECTURE:~-2%%Winver% EQU 8661 Move %Windir%\SysWOW64\* %Windir%\System32 2>NUL
if /i "%windir:~,2%"=="X:" IF %PROCESSOR_ARCHITECTURE:~-2%%Winver% EQU 8661 rd /s /q %Windir%\SysWOW64 2>NUL
goto :eof

:GetFileVer
@echo off
set FileVer=6.1.7601.17514
set FilePath =C:\Windows\System32\
If Exist %Windir%\SysWOW64\wbem\WMIC.exe for /f "skip=1 tokens=2 delims==" %%i in (
  '%Windir%\SysWOW64\wbem\WMIC.exe datafile where "name='%FilePath :\=\\%cmd.exe'" get Version /format:list'
) do for /f "delims=" %%v in ("%%i") do set "FileVer=%%v"

If Exist %Windir%\System32\wbem\WMIC.exe for /f "skip=1 tokens=2 delims==" %%i in (
  '%Windir%\SysWOW64\wbem\WMIC.exe datafile where "name='%FilePath :\=\\%cmd.exe'" get Version /format:list'
) do for /f "delims=" %%v in ("%%i") do set "FileVer=%%v"
@echo on
set TarDir=C:\Windows
if exist "D:\123\Windows\*" set TarDir=D:\123\Windows
call :MakeFileLst
call :JudgeSys
if exist FlashCenter补充文件.txt call :CopyFiles
pause&&exit

:JudgeSys
@echo off
if not exist %Windir%\System32\findstr.exe goto JudgeSysNoStr
setlocal enabledelayedexpansion
for /d %%a in (C D E F G H I J K L M N O P Q R S T U V W Y Z) do if exist %%a:\Windows\System32\config\system set /a n+=1 && set "TardrV-!n!=%%a:"
if exist "D:\123\Windows\*" set /a n+=1 && set "TardrV-!n!=D:\123"
for /l %%b in (1,1,!n!) do (
        if /i not "%Systemdrive%"=="!TardrV-%%b!" (
                set load_System_%%b=HKLM\Temp_System_%%b
                set load_Software_%%b=HKLM\Temp_Software_%%b
                reg load "!load_System_%%b!" !TardrV-%%b!\Windows\System32\config\SYSTEM >nul 2>&1
                reg load "!load_Software_%%b!" !TardrV-%%b!\Windows\System32\config\SOFTWARE >nul 2>&1
                if exist !TardrV-%%b!\Windows\SysWOW64 (set TarOsarch-%%b=x64) else if not exist !TardrV-%%b!\Windows\SysWOW64 (set TarOsarch-%%b=x86) else set "TarOsarch-%%b=???"
        )
        for /f "tokens=3" %%c in ('reg query "!load_System_%%b!\Setup\Service Reporting API\Components\CoreOS" /v Version 2^>nul ^| findstr /i "REG_SZ"') do (
        set TarVer-%%b=%%c
        if "!TarVer-%%b:~0,4!"=="%FulVer:~,4%" set TarVer=TarVer-%%b
        )
        if not defined TarVer-%%b (
                for /f "tokens=3" %%f in ('reg query "!load_Software_%%b!\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion 2^>nul ^| findstr /i "REG_SZ"') do set TarVer-%%b=%%f
                for /f "tokens=3" %%g in ('reg query "!load_Software_%%b!\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber 2^>nul ^| findstr /i "REG_SZ"') do set TarVer-%%b=!TarVer-%%b!.%%g
                if "!TarVer-%%b:~0,4!"=="%FulVer:~,4%" set TarVer=TarVer-%%b
        )

        for /f "tokens=3*" %%d in ('reg query "!load_Software_%%b!\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul ^| findstr /i "REG_SZ"') do set TarName-%%b=%%d %%e
        reg unload "!load_System_%%b!" >nul 2>&1
        reg unload "!load_Software_%%b!" >nul 2>&1
        echo; %%b│盘符│!TardrV-%%b!│离线系统│!TarName-%%b!^|!TarOsarch-%%b!^|^(!TarVer-%%b!^)
)
::endlocal

@echo off
if /i not "%systemdrive%"=="X:" set LoadrV=C:
if /i "%systemdrive%"=="X:" set LoadrV=X:
setlocal enabledelayedexpansion
if exist %Windir%\SysWOW64 (set LoaOsarch=x64) else if not exist %Windir%\SysWOW64 (set LoaOsarch=x86) else set "LoaOsarch=???"
for /f "tokens=3" %%c in ('reg query "HKLM\SYSTEM\Setup\Service Reporting API\Components\CoreOS" /v Version 2^>nul ^| findstr /i "REG_SZ"') do set LoaVer=%%c
if not defined LoaVer (
for /f "tokens=3" %%f in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion 2^>nul ^| findstr /i "REG_SZ"') do set LoaVer=%%f
for /f "tokens=3" %%g in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber 2^>nul ^| findstr /i "REG_SZ"') do set LoaVer=!LoaVer!.%%g
)
for /f "tokens=3*" %%d in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul ^| findstr /i "REG_SZ"') do set LoaName=%%d %%e
echo; %LoadrV%│本地系统│%LoaName%│%LoaOsarch%│^(%LoaVer%^)
::endlocal
@echo on
goto :eof

:JudgeSysNoStr
@echo on
if exist "%TarDir%\WinSxs\*.7600.*" set TarVer=6.1.7601.17514
if exist "%TarDir%\WinSxs\*.9200.*" set TarVer=6.2.9200.16384
goto :eof

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

 楼主| 发表于 2025-4-30 17:02:49 | 显示全部楼层
本帖最后由 zhoubin 于 2025-4-30 17:10 编辑

一楼贴的是完整代码,其中标红的部分有问题,代码执行到标红的地方,就退出了,请高手帮我修改一下,谢谢
发表于 2025-4-30 20:16:36 | 显示全部楼层
%%包裹的变量,能加双引号尽量都加上,否则可能因为预处理造成问题。

调试参考 批处理调试手段与常见错误浅析 1.点击运行时,窗口一闪而过
 楼主| 发表于 2025-4-30 22:38:09 | 显示全部楼层
本帖最后由 zhoubin 于 2025-4-30 22:39 编辑

改成这样:
if /i "%windir:~,2%"=="X:" if !TarVer:~,4!==%FulVer:~,4% if exist "D:\123\*" xcopy "D:\123\%%~a" "%SystemDrive%\%%~pb" /h /y
64位Win8PE下测试,标红部分仍然得不到正确值,提示错误:此时不应有 4!==6.2
发表于 2025-4-30 23:45:27 | 显示全部楼层
回复 4# zhoubin

用双引号包裹 if 比较表达式中 == 两边的字段即可,如下
   if /i "%windir:~,2%"=="X:" if "!TarVer:~,4!"=="%FulVer:~,4%" ...
 楼主| 发表于 2025-5-1 07:48:17 | 显示全部楼层
用双引号包裹
if /i "%windir:~,2%"=="X:" if "!TarVer:~,4!"=="%FulVer:~,4%" if exist "D:\123\*" xcopy "D:\123\%%~a" "%SystemDrive%%%~pb" /h /y
执行的结果是:
if /I "X:" == "X:" if "!TarVer:~,4!" == "6.2." if exist "D:\123\*" xcopy "D:\123\Windows\SysWOW64\d3d11.dll" "X:\Windows\SysWOW64\" /h /y
标红的地方没有正确解析
发表于 2025-5-1 09:11:27 | 显示全部楼层
回复 6# zhoubin

所谓延迟变量未被正确解析的原因是 ‘变量延迟’ 已被关闭 或 引用的延迟变量 !TarVer! 未被赋值(或是空值)

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 乐于助人,谢谢

查看全部评分

发表于 2025-5-1 10:38:45 | 显示全部楼层
回复 6# zhoubin


脚本第一行增加:
setlocal enabledelayedexpansion

其他地方的 setlocal enabledelayedexpansion 全部删除

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 感谢帮助!

查看全部评分

 楼主| 发表于 2025-5-1 10:42:02 | 显示全部楼层
回复 7# aloha20200628
谢谢,发现:不能跨标签段,引用延迟变量赋值,感谢提醒
 楼主| 发表于 2025-5-1 13:21:34 | 显示全部楼层
本帖最后由 zhoubin 于 2025-5-3 09:11 编辑
  1. ::-----请根据实际情况,修改:H:\常用工具-文件\MAKE ISO\64位Windows8 专业版(原RESC.GHO)华硕P43SJ.WIM文件路径;适合32位Win7PE和64位Win8PE添加文件,参考-----
  2. ::64位Win7SP1下,若Dism挂载.wim文件失败,需要安装PETOOLS\程序\磁盘光盘\WIM镜像\WIMSETUP\WIN7系统中的WIMMOUNT组件.EXE,其他更多系统,略. . .
  3. ::批处理调试
  4. ::%1 @cmd /k %0 :
  5. setlocal enabledelayedexpansion
  6. PUSHD %~dp0
  7. @ECHO OFF
  8. for /f "tokens=1* delims=[" %%a in ('ver') do set FulVer=%%b
  9. set FulVer=%FulVer:* =%
  10. for /f "tokens=2 delims=[" %%a in ('ver') do for /f "tokens=2,3 delims=. " %%b in ("%%a") do set Winver=%%b%%c
  11. @ECHO On
  12. ::if /i not "%windir:~,2%"=="X:" exit
  13. set TarWim=H:\常用工具-文件\MAKE ISO\64位Windows8 专业版(原RESC.GHO)华硕P43SJ.WIM
  14. If not Exist "%TarWim%" call :JudgeSys
  15. If not Exist "%TarWim%" goto GetFileVer

  16. ::Dism挂载.cmd
  17. DISM.exe /Get-WimInfo /WimFile:"%TarWim%"
  18. SET /P drive_letter=   请输入你要查看挂载的wim镜像卷(1/2/3/4/5...)
  19. @echo.
  20. DISM.exe /Get-WIMInfo /WimFile:"%TarWim%" /index:%drive_letter%
  21. @echo.
  22. @echo 按任意键开始挂载指定wim卷文件......
  23. ::@pause >NUL 2>NUL
  24. md D:\123
  25. Dism.exe /Mount-Wim /WimFile:"%TarWim%" /index:%drive_letter% /MountDir:D:\123 /ReadOnly
  26. ::start "" explorer.exe /n,"D:\123\Windows\System32"
  27. call :JudgeSys
  28. set TarDir=C:\Windows
  29. if not exist "C:\Windows\*" if exist "D:\Windows\*" set TarDir=D:\Windows
  30. if exist "D:\123\Windows\*" set TarDir=D:\123\Windows
  31. if not exist "D:\123\Windows\*" if "!TarVer:~0,4!"=="%FulVer:~,4%" set TarDir=!TardrV!\Windows
  32. call :MakeFileLst
  33. @echo on
  34. if exist FlashCenter补充文件.txt call :CopyFiles
  35. @echo.
  36. @echo 按任意键开始卸载......
  37. @pause >NUL 2>NUL

  38. ::Dism卸载.cmd
  39. DISM.exe /Unmount-Wim /MountDir:D:\123 /discard
  40. rd /s /q D:\123
  41. pause&&exit

  42. :MakeFileLst
  43. del FlashCenter补充文件.txt 2>NUL
  44. if /i not "%windir:~,2%"=="X:" set TarDiX=%TarDir%
  45. if /i "%windir:~,2%"=="X:" set TarDiX=%WinDir%
  46. if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo ;;FlashCenter For 64位Win10.安装再精简-FlashCenter可用,32位win7PE下,还需补充以下文件,PE下请连网测试;存档参考. . .>FlashCenter补充文件.txt
  47. if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\System32\d3d9.dll>>FlashCenter补充文件.txt
  48. if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\System32\d3d11.dll>>FlashCenter补充文件.txt
  49. if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\System32\dxgi.dll>>FlashCenter补充文件.txt
  50. if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\System32\dxva2.dll>>FlashCenter补充文件.txt
  51. if exist "%TarDir%\WinSxs\*.7600.*" if not exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\System32\dhcpcsvc.dll>>FlashCenter补充文件.txt

  52. if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo ;;FlashCenter For 64位Win10.安装再精简-FlashCenter可用,32位win7PE下,还需补充以下文件,PE下请连网测试;存档参考. . .>FlashCenter补充文件.txt
  53. if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\SysWOW64\d3d9.dll>>FlashCenter补充文件.txt
  54. if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\SysWOW64\d3d11.dll>>FlashCenter补充文件.txt
  55. if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\SysWOW64\dxgi.dll>>FlashCenter补充文件.txt
  56. if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\SysWOW64\dxva2.dll>>FlashCenter补充文件.txt
  57. if exist "%TarDir%\WinSxs\*.7600.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.7600.*" echo Windows\SysWOW64\dhcpcsvc.dll>>FlashCenter补充文件.txt

  58. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo ;;FlashCenter For 64位Win10.安装再精简-FlashCenter可用,64位win8PE下,还需补充以下文件,PE下请连网测试;存档参考. . .>FlashCenter补充文件.txt
  59. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\dhcpcsvc.dll>>FlashCenter补充文件.txt
  60. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\dxgi.dll>>FlashCenter补充文件.txt
  61. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\dxva2.dll>>FlashCenter补充文件.txt
  62. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\ncrypt.dll>>FlashCenter补充文件.txt
  63. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\ntasn1.dll>>FlashCenter补充文件.txt
  64. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\d3d9.dll>>FlashCenter补充文件.txt
  65. if exist "%TarDir%\WinSxs\*.9200.*" if exist %TarDir%\SysWOW64 if exist "%TarDiX%\WinSxs\*.9200.*" echo Windows\SysWOW64\d3d11.dll>>FlashCenter补充文件.txt
  66. goto :eof

  67. :CopyFiles
  68. ::按文件列表拷文件到对应目录.cmd,以下适合系统下,复制文件
  69. @echo off
  70. PUSHD %~dp0
  71. ::不能跨标签段,引用延迟变量赋值(存档参考)
  72. if /i "%windir:~,2%"=="X:" goto CopyFilesPE
  73. for /f "delims=" %%a in (FlashCenter补充文件.txt) do (
  74.   for /f "delims=" %%b in ("\%%~a") do (
  75.     if /i not "%windir:~,2%"=="X:" if not exist "D:\123\Windows\*" xcopy "%SystemDrive%\%%~a" "%cd%\FlashCenter补充文件%%~pb" /h /y
  76.     if /i not "%windir:~,2%"=="X:" if not exist "D:\123\Windows\*" if "!TarVer:~0,4!"=="%FulVer:~,4%" xcopy "!TardrV!\%%~a" "%cd%\FlashCenter补充文件%%~pb" /h /y
  77.     if /i not "%windir:~,2%"=="X:" if exist "D:\123\Windows\*" xcopy "D:\123\%%~a" "%cd%\FlashCenter补充文件%%~pb" /h /y
  78.   )
  79. )
  80. @echo on
  81. if exist "%cd%\FlashCenter补充文件" move FlashCenter补充文件.txt "%cd%\FlashCenter补充文件"
  82. goto :eof

  83. :CopyFilesPE
  84. ::不能跨标签段,引用延迟变量赋值(存档参考)
  85. ::按文件列表拷文件到对应目录.cmd,以下适合PE下,添加系统文件
  86. @echo off
  87. PUSHD %~dp0
  88. for /f "delims=" %%a in (FlashCenter补充文件.txt) do (
  89.   for /f "delims=" %%b in ("\%%~a") do (
  90.     rem if /i "%windir:~,2%"=="X:" if "!TarVer:~0,4!"=="%FulVer:~,4%" if exist "D:\123\*" xcopy "D:\123\%%~a" "%SystemDrive%%%~pb" /h /y
  91.     rem if /i "%windir:~,2%"=="X:" if "!TarVer:~0,4!"=="%FulVer:~,4%" if "!TardrV!"=="C:" xcopy "C:\%%~a" "%SystemDrive%%%~pb" /h /y
  92.     rem if /i "%windir:~,2%"=="X:" if "!TarVer:~0,4!"=="%FulVer:~,4%" if "!TardrV!"=="D:" xcopy "D:\%%~a" "%SystemDrive%%%~pb" /h /y
  93.     if /i "%windir:~,2%"=="X:" if "!TarVer:~0,4!"=="%FulVer:~,4%" if exist "%TardrV%\Windows\*" xcopy "%TardrV%\%%~a" "%SystemDrive%%%~pb" /h /y
  94.   )
  95. )
  96. @echo on
  97. if /i "%windir:~,2%"=="X:" IF %PROCESSOR_ARCHITECTURE:~-2%%Winver% EQU 8661 Move %Windir%\SysWOW64\* %Windir%\System32 2>NUL
  98. if /i "%windir:~,2%"=="X:" IF %PROCESSOR_ARCHITECTURE:~-2%%Winver% EQU 8661 rd /s /q %Windir%\SysWOW64 2>NUL
  99. goto :eof
复制代码
 楼主| 发表于 2025-5-1 13:22:06 | 显示全部楼层
本帖最后由 zhoubin 于 2025-5-3 09:12 编辑

  1. :GetFileVer
  2. ::获取文件版本(系统版本)
  3. @echo off
  4. set FileVer=6.1.7601.17514
  5. set FilePath =C:\Windows\System32\
  6. if not exist "C:\Windows\*" if exist "D:\Windows\*" set FilePath =D:\Windows\System32\
  7. if not exist "C:\Windows\*" if not exist "D:\Windows\*" set FilePath =!TardrV!\Windows\System32\
  8. Rem 获取文件版本(系统版本),PE下无效
  9. If Exist %Windir%\SysWOW64\wbem\WMIC.exe for /f "skip=1 tokens=2 delims==" %%i in (
  10.   '%Windir%\SysWOW64\wbem\WMIC.exe datafile where "name='%FilePath :\=\\%cmd.exe'" get Version /format:list'
  11. ) do for /f "delims=" %%v in ("%%i") do set "FileVer=%%v"

  12. If Exist %Windir%\System32\wbem\WMIC.exe for /f "skip=1 tokens=2 delims==" %%i in (
  13.   '%Windir%\System32\wbem\WMIC.exe datafile where "name='%FilePath :\=\\%cmd.exe'" get Version /format:list'
  14. ) do for /f "delims=" %%v in ("%%i") do set "FileVer=%%v"
  15. @echo on
  16. set TarDir=C:\Windows
  17. if not exist "C:\Windows\*" if exist "D:\Windows\*" set TarDir=D:\Windows
  18. if exist "D:\123\Windows\*" set TarDir=D:\123\Windows
  19. if not exist "D:\123\Windows\*" if "!TarVer:~0,4!"=="%FulVer:~,4%" set TarDir=!TardrV!\Windows
  20. call :MakeFileLst
  21. if exist FlashCenter补充文件.txt call :CopyFiles
  22. pause&&exit

  23. :JudgeSys
  24. @echo off
  25. @echo.
  26. set TardrV=C:
  27. if not exist "C:\Windows\*" if exist "D:\Windows\*" set TardrV=D:
  28. if exist "D:\123\Windows\*" set TardrV=D:\123
  29. if not exist %Windir%\System32\findstr.exe goto JudgeSysNoStr
  30. rem 查找所有系统盘盘符、系统名称、类型、版本号
  31. for /d %%a in (C D E F G H I J K L M N O P Q R S T U V W Y Z) do if exist %%a:\Windows\System32\config\system set /a n+=1 && set "TardrV-!n!=%%a:"
  32. if exist "D:\123\Windows\*" set /a n+=1 && set "TardrV-!n!=D:\123"
  33. for /l %%b in (1,1,!n!) do (
  34.         if /i not "%Systemdrive%"=="!TardrV-%%b!" (
  35.                 set load_System_%%b=HKLM\Temp_System_%%b
  36.                 set load_Software_%%b=HKLM\Temp_Software_%%b
  37.                 rem 加载注册表 SYSTEM 到HKLM\Temp_System,SOFTWARE到HKLM\Temp_Software
  38.                 reg load "!load_System_%%b!" !TardrV-%%b!\Windows\System32\config\SYSTEM >nul 2>&1
  39.                 reg load "!load_Software_%%b!" !TardrV-%%b!\Windows\System32\config\SOFTWARE >nul 2>&1
  40.                 rem 查询系统类型
  41.                 if exist !TardrV-%%b!\Windows\SysWOW64 (set TarOsarch-%%b=x64) else if not exist !TardrV-%%b!\Windows\SysWOW64 (set TarOsarch-%%b=x86) else set "TarOsarch-%%b=???"
  42.         )
  43.         rem 查询系统版本号
  44.         for /f "tokens=3" %%c in ('reg query "!load_System_%%b!\Setup\Service Reporting API\Components\CoreOS" /v Version 2^>nul ^| findstr /i "REG_SZ"') do (
  45.         set TarVer-%%b=%%c
  46.         if "!TarVer-%%b:~0,4!"=="%FulVer:~,4%" set TarVer=!TarVer-%%b!
  47.         )
  48.         rem 如果上面未查询到版本号,则在此处查询
  49.         if not defined TarVer-%%b (
  50.                 for /f "tokens=3" %%f in ('reg query "!load_Software_%%b!\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion 2^>nul ^| findstr /i "REG_SZ"') do set TarVer-%%b=%%f
  51.                 for /f "tokens=3" %%g in ('reg query "!load_Software_%%b!\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber 2^>nul ^| findstr /i "REG_SZ"') do set TarVer-%%b=!TarVer-%%b!.%%g
  52.                 if "!TarVer-%%b:~0,4!"=="%FulVer:~,4%" set TarVer=!TarVer-%%b!
  53.         )
  54.         rem 查询系统名称
  55.         for /f "tokens=3*" %%d in ('reg query "!load_Software_%%b!\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul ^| findstr /i "REG_SZ"') do set TarName-%%b=%%d %%e
  56.         if "!TarVer-%%b:~0,4!"=="%FulVer:~,4%" set TardrV=!TardrV-%%b!
  57.         rem 卸载加载的注册表
  58.         reg unload "!load_System_%%b!" >nul 2>&1
  59.         reg unload "!load_Software_%%b!" >nul 2>&1
  60.         echo; %%b│盘符│!TardrV-%%b!│离线系统│!TarName-%%b!^|!TarOsarch-%%b!^|^(!TarVer-%%b!^)
  61.         rem echo; %%b│盘符│!TardrV-%%b!│离线系统│!TarName-%%b!^|!TarOsarch-%%b!^|^(!TarVer-%%b!^)^|文件源自!TardrV!^|版本^(!TarVer!^)
  62. )

  63. @echo off
  64. if /i not "%Systemdrive%"=="X:" set LoadrV=C:
  65. if /i "%Systemdrive%"=="X:" set LoadrV=X:
  66. set LoadrV=%Systemdrive%
  67. rem 查询系统类型
  68. if exist %Windir%\SysWOW64 (set LoaOsarch=x64) else if not exist %Windir%\SysWOW64 (set LoaOsarch=x86) else set "LoaOsarch=???"
  69. rem 查询系统版本号
  70. for /f "tokens=3" %%c in ('reg query "HKLM\SYSTEM\Setup\Service Reporting API\Components\CoreOS" /v Version 2^>nul ^| findstr /i "REG_SZ"') do set LoaVer=%%c
  71. rem 如果上面未查询到版本号,则在此处查询
  72. if not defined LoaVer (
  73. for /f "tokens=3" %%f in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion 2^>nul ^| findstr /i "REG_SZ"') do set LoaVer=%%f
  74. for /f "tokens=3" %%g in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber 2^>nul ^| findstr /i "REG_SZ"') do set LoaVer=!LoaVer!.%%g
  75. )
  76. rem 查询系统名称
  77. for /f "tokens=3*" %%d in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul ^| findstr /i "REG_SZ"') do set LoaName=%%d %%e
  78. echo; %LoadrV%│本地系统│%LoaName%│%LoaOsarch%│^(%LoaVer%^)
  79. @echo on
  80. goto :eof

  81. :JudgeSysNoStr
  82. @echo on
  83. if exist "%TarDir%\WinSxs\*.7600.*" set TarVer=6.1.7601.17514
  84. if exist "%TarDir%\WinSxs\*.9200.*" set TarVer=6.2.9200.16384
  85. goto :eof
复制代码
 楼主| 发表于 2025-5-1 13:23:36 | 显示全部楼层
本帖最后由 zhoubin 于 2025-5-3 09:13 编辑

解决了;由于论坛帖子字数的限制,把10楼和11楼的代码合起来就是完整版的,可以直接使用,现分享给大家,谢谢大家的帮助!
经反复测试,把10楼和11楼的代码更新了一下,顺祝大家五一快乐!

更新了,说明一下:
这个批处理用于:在32位Win7PE和64位Win8PE下,添加FlashCenter所需的系统文件;在正常系统下保存32位Win7PE和64位Win8PE所需的FlashCenter系统文件,以备在32位Win7PE和64位Win8PE下,手动添加FlashCenter系统文件;如有其他需要,请自行修改本批处理脚本!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 05:58 , Processed in 0.024348 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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