找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 650|回复: 25

[分享] 服务器pe和一般pe里使用vssadmin命令创建和还原VSS卷影副本备份所依赖的最少8个文件

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 sairen139 于 2026-5-12 20:20 编辑

服务器pe和一般pe里使用vssadmin命令创建和还原VSS卷影副本备份所依赖的最少8个文件


折腾了下找到基于winre精简的骨头pe里使用vssadmin命令创建和还原VSS卷影副本备份所依赖的最少8个文件如下(22000.1到28000pe都测试过了全部创建和还原卷影成功的依赖文件):

\Windows\System32\swprv.dll
\Windows\System32\vss_ps.dll
\Windows\System32\vssadmin.exe
\Windows\System32\vssapi.dll
\Windows\System32\vsstrace.dll
\Windows\System32\VSSVC.exe
\Windows\System32\zh-CN\vssadmin.exe.mui
\Windows\System32\zh-CN\vsstrace.dll.mui

需要注意的普通WinPE 环境中, 在运行此 vssadmin命令之前, 可以将注册表项 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ProductOptions 的值 ProductType 的数据更改为 ServerNT, 瞒天过海即可命令生成VSS卷影副本。服务器pe本身注册表里该值就是ServerNT无需这般修改操作。vssadmin命令执行时不要cmd访问C盘或者文件管理器访问C盘的文件或者文件夹,会导致无法执行成功。

具体1秒备份离线系统盘为VSS卷影副本和1秒恢复C盘所有文件和注册表到备份前方法:

就是利用vssadmin的备份命令和还原命令

1秒VSS备份离线系统盘C盘的命令(如果在正常系统里可以win+r组合键输入SystemPropertiesProtection就能点击创建还原点效果也是一样的)
vssadmin create shadow /for=c:

1秒VSS还原离线系统盘的命令
vssadmin revert shadow /shadow={卷影副本ID}

查看VSS卷影副本ID的命令
vssadmin list shadows



1pe里vssadmin命令创建和还原VSS卷影副本的截图之一.png
2pe里vssadmin命令list shadows查看所有VSS卷影副本ID.png
22000pe里VSS一一还原基于ssadmin的revertshadow命令的一键还原卷影恢复离线系统盘所.png

VSS一键自动还原.zip

1.15 KB, 下载次数: 19, 下载积分: 无忧币 -2

VSS一键自动还原

VSS一键自动还原加pe桌面和开始菜单快捷图标.zip

2.56 KB, 下载次数: 20, 下载积分: 无忧币 -2

VSS一键自动还原加pe桌面和开始菜单快捷图标

ShadowCopyView卷影查看和文件恢复最新1.16中文版.zip

63.22 KB, 下载次数: 6, 下载积分: 无忧币 -2

ShadowCopyView卷影查看和文件恢复最新1.16中文版

还原完可自动重启或取消重启的VSS一一还原.zip

1.3 KB, 下载次数: 0, 下载积分: 无忧币 -2

还原完可自动重启或取消重启的VSS一一还原.zip

点评

一个帖子里能解决的事情,为何要分2个帖子来搞,毫无意义的增量备份,搞得如此轰轰烈烈,唯恐天下人不知?!  发表于 4 天前
 楼主| 发表于 4 天前 | 显示全部楼层
本帖最后由 sairen139 于 2026-5-12 16:49 编辑

vssadmin自动还原卷影副本回目标分区的批处理:
@echo off
setlocal enabledelayedexpansion

:: WinPE兼容性处理:确保reg命令可用
set "RegCmd=reg.exe"
if not exist "%SystemRoot%\System32\reg.exe" (
    echo.
    echo 警告: 未找到reg.exe
    echo.
    pause
    exit /b 1
)

:: 查询当前的ProductType值
set "OriginalProductType="
for /f "skip=2 tokens=3" %%a in ('%RegCmd% query "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType 2^>nul') do (
    set "OriginalProductType=%%a"
)

:: 如果查询失败(键值不存在),设置默认值
if not defined OriginalProductType (
    set "OriginalProductType=WinNT"
)

:: 如果不是ServerNT,则修改为ServerNT
if /i not "!OriginalProductType!"=="ServerNT" (
    %RegCmd% add "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType /d ServerNT /f >nul 2>&1
)
echo.
echo. 卷影副本列表如下请输入行号数字还原系统
echo.
echo. 由大到小按需输入
echo.

set /a id_cnt=0, vol_cnt=0, time_cnt=0
for /f "delims=" %%a in ('vssadmin list shadows 2^>nul') do (
    set "line=%%a"
    if "!line:卷影副本 ID:=!" neq "!line!" (
        set /a id_cnt+=1
        for /f "tokens=3" %%b in ("!line!") do set "shadowid_!id_cnt!=%%b"
    )
    if "!line:原始卷:=!" neq "!line!" (
        set /a vol_cnt+=1
        for /f "tokens=2 delims=()" %%c in ("!line!") do set "vol_!vol_cnt!=%%c"
    )
    if "!line:在创建时间:=!" neq "!line!" (
        set /a time_cnt+=1
        for /f "tokens=2,3" %%d in ("!line!") do set "time_!time_cnt!=%%d %%e"
    )
)

if %id_cnt% equ 0 (echo.检索不到卷影&pause&goto :eof)

set /a total=%id_cnt%
for /l %%i in (1,1,%total%) do echo [%%i] 卷影副本 ID: !shadowid_%%i! 原始卷(!vol_%%i!) !time_%%i!

set /p V=请输入行号数字进行卷影还原:
if /i "%V%"=="0" goto Done

set "valid=0"
for /l %%i in (1,1,%total%) do if "%V%"=="%%i" set "valid=1"
if "!valid!"=="0" (echo 请输列表里的行号数字&goto Done)

echo.
echo. 按 Y 键还原目标分区所有文件和注册表,按 N 键不进行
echo.

vssadmin revert shadow /shadow=!shadowid_%V%!

echo.
echo 系统将在 9 秒后自动重启,按 Y 键取消...
choice /c YN /t 9 /d N /m "按 Y 取消重启,超时或按 N 则自动重启"
if errorlevel 2 (
    echo 即将自动重启...
    Wpeutil Reboot
) else (
    echo 自动重启已取消,请手动重启系统。
    endlocal
    pause
    exit /b
)

:Done
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType /d !OriginalProductType! /f >nul 2>&1
endlocal
pause
exit /b

VSS一一还原.zip

1.15 KB, 下载次数: 10, 下载积分: 无忧币 -2

Vssadmin自动还原.zip

还原完可自动重启或取消重启的VSS一一还原.zip

1.3 KB, 下载次数: 0, 下载积分: 无忧币 -2

点评

@echo off setlocal enabledelayedexpansion reg add "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType /d ServerNT /f >nul 2>&1 echo. 卷影副本列表如下请输入行号数字还原系统 echo. 由  详情 回复 发表于 3 天前
你的下面一楼发生了什么事?  详情 回复 发表于 4 天前
回复

使用道具 举报

发表于 4 天前 来自手机 | 显示全部楼层
感谢分享,有意思的研究
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层

你的下面一楼发生了什么事?
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
楼上发生了什么事,管理员呢?
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
按楼主说的改注册表,用2013koko的PE,完美!


QQ截图20260509203241.png
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 3 天前 来自手机 | 显示全部楼层
sairen139 发表于 2026-5-9 19:03
Vssadmin自动还原批处理语句如下:



@echo off
setlocal enabledelayedexpansion

reg add "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType /d ServerNT /f >nul 2>&1

echo. 卷影副本列表如下请输入行号数字还原系统
echo. 由大到小按需输入

set /a id_cnt=0, vol_cnt=0, time_cnt=0
for /f "delims=" %%a in ('vssadmin list shadows 2^>nul') do (
    set "line=%%a"
    if "!line:卷影副本 ID:=!" neq "!line!" (
        set /a id_cnt+=1
        for /f "tokens=3" %%b in ("!line!") do set "shadowid_!id_cnt!=%%b"
    )
    if "!line:原始卷:=!" neq "!line!" (
        set /a vol_cnt+=1
        for /f "tokens=2 delims=()" %%c in ("!line!") do set "vol_!vol_cnt!=%%c"
    )
    if "!line:在创建时间:=!" neq "!line!" (
        set /a time_cnt+=1
        for /f "tokens=2,3" %%d in ("!line!") do set "time_!time_cnt!=%%d %%e"
    )
)

if %id_cnt% equ 0 (echo.检索不到卷影&pause&goto :eof)

set /a total=%id_cnt%
for /l %%i in (1,1,%total%) do echo [%%i] 卷影副本 ID: !shadowid_%%i! 原始卷(!vol_%%i!) !time_%%i!

set /p VSAA=请输入行号数字进行卷影还原:
if /i "%VSAA%"=="0" goto Done

set "valid=0"
for /l %%i in (1,1,%total%) do if "%VSAA%"=="%%i" set "valid=1"
if "!valid!"=="0" (echo 请输列表里的行号数字&goto Done)

vssadmin revert shadow /shadow=!shadowid_%VSAA%!

echo.
echo 卷影还原已完成,请手动重启系统。
echo 卷影还原已完成,请手动重启系统。
echo 卷影还原已完成,请手动重启系统。

:Done
reg add "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType /d WinNT /f >nul 2>&1
endlocal
pause
exit /b

点评

此批处理的最大不足在于仅适用简体中文系统  发表于 3 天前
那假如服务器PE呢,难道最后也要执行 reg add "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType /d WinNT /f >nul 2>&1 吗?  详情 回复 发表于 3 天前
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
sairen139 发表于 2026-5-10 03:06
@echo off
setlocal enabledelayedexpansion

那假如服务器PE呢,难道最后也要执行 reg add "HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions" /v ProductType /d WinNT /f >nul 2>&1 吗?
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
感谢,学习了。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
本帖最后由 lyrgcy 于 2026-5-11 20:34 编辑

在楼主批处理文件添加了可查看,建立,恢复,删除卷影

VssadminRevert.7z

2.08 KB, 阅读权限: 10, 下载次数: 18, 下载积分: 无忧币 -2

回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
来了解一下了
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
用powershell 就不用进 PE 创建了  (Get-WmiObject -List Win32_ShadowCopy).Create('C:\', 'ClientAccessible')

点评

牛逼  详情 回复 发表于 3 天前
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
我是小白,向老师学习!
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
oym2016 发表于 2026-5-10 17:20
用powershell 就不用进 PE 创建了  (Get-WmiObject -List Win32_ShadowCopy).Create('C:\', 'ClientAccessi ...


牛逼
回复

使用道具 举报

发表于 3 天前 来自手机 | 显示全部楼层
创建的卷影副本,在用TBI格式或SNA镜像格式备份一遍C盘,那么这两种镜像里面就有了卷影副本的备份,恭喜你创建了一个VSS卷影+TBI,SNA共生的镜像,实现随时秒还原。
在把备份TBI,SNA镜像存储盘,创建一个卷影副本,恭喜你,给TBI,SNA备份加了一把锁🔒,防止误删除和破坏。

点评

win11正常系统,会自动创建卷影,自动创建5个。用ShadowCopyView查看。  发表于 前天 08:57
多份保险,这个好  详情 回复 发表于 前天 08:31
回复

使用道具 举报

发表于 前天 08:31 | 显示全部楼层
gxbcm 发表于 2026-5-10 23:09
创建的卷影副本,在用TBI格式或SNA镜像格式备份一遍C盘,那么这两种镜像里面就有了卷影副本的备份,恭喜你 ...

多份保险,这个好
回复

使用道具 举报

发表于 前天 12:45 来自手机 | 显示全部楼层
本帖最后由 23070205 于 2026-5-11 22:06 编辑

  1. @echo off
  2. title 卷影副本全能工具箱 PE通用版
  3. net session >nul 2>&1
  4. if %errorlevel% neq 0 (
  5.     echo 错误:需要管理员权限!
  6.     echo 请右键此脚本选择“以管理员身份运行”。
  7.     pause
  8.     exit /b
  9. )

  10. mode con cols=100 lines=30

  11. where powershell >nul 2>&1
  12. if %errorlevel% neq 0 (
  13.     echo 警告:当前环境未安装 PowerShell,部分功能将不可用。
  14.     echo 按任意键,退出批处理...
  15.     pause >nul
  16.      exit /b
  17. )


  18. :menu
  19. cls
  20. echo ==============================================================
  21. echo                卷影副本 全能工具箱(自动空闲盘符版)
  22. echo ==============================================================
  23. echo  1. 创建C盘卷影 + 自动找空闲盘符挂载并打开
  24. echo  2. 卸载本次挂载的卷影盘符
  25. echo  3. 查看所有卷影副本列表
  26. echo  4. 查看卷影副本空间占用
  27. echo  5. 智能删除:全局选序号删除任意卷影
  28. echo  6. 只删除C盘卷影(列表选序号)
  29. echo  7. 只删除D盘卷影(列表选序号)
  30. echo  8. 自选任意盘符,删除对应卷影
  31. echo  9. 一键清空所有卷影副本
  32. echo  0. 退出工具箱
  33. echo ==============================================================
  34. set /p sel=请输入功能序号:

  35. if "%sel%"=="1" goto op1
  36. if "%sel%"=="2" goto op2
  37. if "%sel%"=="3" goto op3
  38. if "%sel%"=="4" goto op4
  39. if "%sel%"=="5" goto op5
  40. if "%sel%"=="6" goto op6
  41. if "%sel%"=="7" goto op7
  42. if "%sel%"=="8" goto op8
  43. if "%sel%"=="9" goto op9
  44. if "%sel%"=="0" exit
  45. goto menu

  46. :op1
  47. echo 正在创建C盘卷影副本...
  48. powershell "(Get-CimInstance -List Win32_ShadowCopy).Create('C:\', 'ClientAccessible')"
  49. echo 正在自动寻找空闲盘符并挂载...
  50. powershell -Command ^
  51. $used = (Get-CimInstance win32_logicaldisk).DeviceID; ^
  52. $all = ForEach($c in 'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'){$c+':'}; ^
  53. $free = $all | Where-Object {$_ -notin $used} | Select -First 1; ^
  54. if(-not $free){Write-Host 无空闲可用盘符!;Read-Host;exit}; ^
  55. $s = Get-CimInstance Win32_ShadowCopy|Sort InstallDate -Desc|Select -First 1; ^
  56. $p = "\\?\GLOBALROOT" + $s.DeviceObject + "\"; ^
  57. subst $free $p; ^
  58. echo 已自动挂载为:$free; ^
  59. $free | Out-File $env:temp\shadow_drive.txt; ^
  60. Start $free
  61. echo 完成!已自动打开挂载盘符
  62. pause
  63. goto menu

  64. :op2
  65. if not exist "%temp%\shadow_drive.txt" (
  66.     echo 未检测到本次挂载的卷影盘符
  67.     pause
  68.     goto menu
  69. )
  70. set /p Drv=<"%temp%\shadow_drive.txt"
  71. subst %Drv% /d >nul 2>&1
  72. del /f /q "%temp%\shadow_drive.txt" >nul 2>&1
  73. echo 已成功卸载挂载盘符 %Drv%
  74. pause
  75. goto menu

  76. :op3
  77. vssadmin list shadows
  78. pause
  79. goto menu

  80. :op4
  81. vssadmin list shadowstorage
  82. pause
  83. goto menu

  84. :op5
  85. powershell -Command "$arr=@();$i=1;Get-CimInstance Win32_ShadowCopy|ForEach-Object{Write-Host $i. 盘符:$_.VolumeName ID:$_.ID;$arr+=$_.ID;$i++};$arr|Export-Clixml $env:temp\all_shadow.xml"
  86. set /p num=输入要删除序号:
  87. powershell "$arr=Import-Clixml $env:temp\all_shadow.xml;$id=$arr[%num%-1];vssadmin delete shadows /shadow=$id /quiet"
  88. del /f /q "%temp%\all_shadow.xml" >nul 2>&1
  89. echo 删除完成
  90. pause
  91. goto menu

  92. :op6
  93. powershell -Command "$list=@();$i=1;Get-CimInstance Win32_ShadowCopy|Where-Object {$_.VolumeName -eq 'C:\'}|ForEach-Object{Write-Host $i. ID:$_.ID;$list += $_.ID;$i++};if($list.Count -eq 0){Write-Host C盘无卷影副本;exit 99};$list|Export-Clixml $env:temp\c_shadow.xml"
  94. if %errorlevel% equ 99 (pause&goto menu)
  95. set /p n=输入序号:
  96. powershell "$a=Import-Clixml $env:temp\c_shadow.xml;$id=$a[%n%-1];vssadmin delete shadows /shadow=$id /quiet"
  97. del /f /q "%temp%\c_shadow.xml" >nul 2>&1
  98. echo 删除完成
  99. pause
  100. goto menu

  101. :op7
  102. powershell -Command "$list=@();$i=1;Get-CimInstance Win32_ShadowCopy|Where-Object {$_.VolumeName -eq 'D:\'}|ForEach-Object{Write-Host $i. ID:$_.ID;$list += $_.ID;$i++};if($list.Count -eq 0){Write-Host D盘无卷影副本;exit 99};$list|Export-Clixml $env:temp\d_shadow.xml"
  103. if %errorlevel% equ 99 (pause&goto menu)
  104. set /p n=输入序号:
  105. powershell "$a=Import-Clixml $env:temp\d_shadow.xml;$id=$a[%n%-1];vssadmin delete shadows /shadow=$id /quiet"
  106. del /f /q "%temp%\d_shadow.xml" >nul 2>&1
  107. echo 删除完成
  108. pause
  109. goto menu

  110. :op8
  111. cls
  112. set /p Drive=输入盘符(如C:\ D:\):
  113. powershell -Command "$disk='%Drive%';$list=@();$idx=1;Get-CimInstance Win32_ShadowCopy|Where-Object {$_.VolumeName -eq $disk}|ForEach-Object{Write-Host 第$idx个 ID:$_.ID;$list+=$_.ID;$idx++};if($list.Count -eq 0){Write-Host 该盘无卷影副本;exit 99};$list|Export-Clixml $env:temp\sel_drive_shadow.xml"
  114. if %errorlevel% equ 99 (pause&goto menu)
  115. set /p No=输入删除序号:
  116. powershell -Command "$arr=Import-Clixml $env:temp\sel_drive_shadow.xml;$delId=$arr[%No%-1];vssadmin delete shadows /shadow=$delId /quiet"
  117. del /f /q "%temp%\sel_drive_shadow.xml" >nul 2>&1
  118. echo 删除完成
  119. pause
  120. goto menu

  121. :op9
  122. vssadmin delete shadows /all /quiet
  123. echo 已清空所有卷影副本
  124. pause
  125. goto menu
复制代码



保存以上内容为bat文件,可以直接在线生成卷影副本,无须到pe生成。
😄恢复肯定要到pe下了。

大家可以虚拟机测试一下,是否有效。
刚刚生成的,没有测试。

点评

WinPE卷影副本全能恢复工具 @echo off chcp 65001 title WinPE卷影副本全能工具【恢复+挂载+卸载】 mode con cols=130 lines=50 fltmc >nul 2>&1 || (echo 请以管理员身份运行本工具!& pause>nul & exit) :main  详情 回复 发表于 前天 13:04
回复

使用道具 举报

发表于 前天 13:04 来自手机 | 显示全部楼层
本帖最后由 23070205 于 2026-5-11 22:21 编辑
23070205 发表于 2026-5-11 12:45
@echo off
chcp 65001
title 卷影副本全能工具箱
  1. @echo off
  2. chcp 936 >nul
  3. title 卷影副本全能工具箱(恢复/挂载/卸载/删除)- WinPE专用
  4. mode con cols=100 lines=30

  5. :: 检查管理员权限
  6. net session >nul 2>&1
  7. if %errorlevel% neq 0 (
  8.     echo 错误:需要管理员权限!
  9.     echo 请右键此脚本选择“以管理员身份运行”。
  10.     pause
  11.     exit /b
  12. )

  13. :: 检查 vssadmin 是否可用
  14. where vssadmin >nul 2>&1
  15. if %errorlevel% neq 0 (
  16.     echo 错误:当前环境不支持 vssadmin,无法使用卷影副本功能。
  17.     pause
  18.     exit /b
  19. )

  20. set "TEMP_DIR=%TEMP%\VSS_Tool"
  21. if not exist "%TEMP_DIR%" mkdir "%TEMP_DIR%"

  22. :MAIN_MENU
  23. cls
  24. echo ===================================================================
  25. echo          卷影副本全能工具 - 恢复 / 挂载 / 卸载 / 删除
  26. echo ===================================================================
  27. echo  1. 查看所有卷影副本
  28. echo  2. 恢复卷影(原地还原到原分区)
  29. echo  3. 挂载卷影(只读访问,不修改原数据)
  30. echo  4. 卸载已挂载的卷影盘符
  31. echo  5. 删除卷影副本(从系统中移除)
  32. echo  0. 退出工具
  33. echo ===================================================================
  34. echo  提示:恢复操作会覆盖原分区所有数据,请务必谨慎!
  35. echo ===================================================================
  36. set /p "choice=请输入功能序号 [0-5]:"
  37. if "%choice%"=="1" goto SHOW_LIST
  38. if "%choice%"=="2" goto RESTORE_SHADOW
  39. if "%choice%"=="3" goto MOUNT_SHADOW
  40. if "%choice%"=="4" goto UNMOUNT_DRIVE
  41. if "%choice%"=="5" goto DELETE_SHADOW
  42. if "%choice%"=="0" exit
  43. goto MAIN_MENU

  44. :SHOW_LIST
  45. cls
  46. echo 正在读取卷影副本列表...
  47. call :ENUM_SHADOWS
  48. if %errorlevel% neq 0 (
  49.     echo 当前系统没有卷影副本,或获取失败。
  50.     pause
  51.     goto MAIN_MENU
  52. )
  53. echo.
  54. echo 卷影副本列表:
  55. echo ---------------------------------------------------------------
  56. type "%TEMP_DIR%\shadow_table.txt"
  57. echo ---------------------------------------------------------------
  58. pause
  59. goto MAIN_MENU

  60. :RESTORE_SHADOW
  61. cls
  62. call :ENUM_SHADOWS
  63. if %errorlevel% neq 0 (
  64.     echo 没有可用的卷影副本,无法恢复。
  65.     pause
  66.     goto MAIN_MENU
  67. )
  68. echo 请从上方列表中选择要恢复的卷影序号:
  69. set /p "sel=输入序号 (1-%shadow_count%):"
  70. if "%sel%"=="" goto RESTORE_SHADOW
  71. set /a "idx=%sel%-1" 2>nul
  72. if %idx% lss 0 goto RESTORE_SHADOW
  73. if %idx% geq %shadow_count% goto RESTORE_SHADOW

  74. call :GET_SHADOW_INFO %idx%
  75. if "%shadow_id%"=="" (
  76.     echo 错误:未获取到卷影ID。
  77.     pause
  78.     goto MAIN_MENU
  79. )

  80. cls
  81. echo ==================== 警告:原地恢复 ====================
  82. echo 卷影ID   : %shadow_id%
  83. echo 原卷盘符 : %shadow_volume%
  84. echo 创建时间 : %shadow_time%
  85. echo.
  86. echo 操作将覆盖 %shadow_volume% 上的所有现有数据,不可撤销!
  87. echo 请确保已经备份重要文件。
  88. echo ========================================================
  89. set "confirm="
  90. set /p "confirm=输入 YES(全大写)确认恢复,其它任意键取消:"
  91. if not "%confirm%"=="YES" (
  92.     echo 操作已取消。
  93.     pause
  94.     goto MAIN_MENU
  95. )
  96. echo 正在恢复卷影,请耐心等待(窗口可能会短暂无响应)...
  97. vssadmin revert shadows /shadow=%shadow_id% /quiet
  98. if %errorlevel% equ 0 (
  99.     echo 恢复成功!原分区 %shadow_volume% 已还原为选定卷影的状态。
  100. ) else (
  101.     echo 恢复失败,请检查卷影是否有效或原分区是否被占用。
  102. )
  103. pause
  104. goto MAIN_MENU

  105. :MOUNT_SHADOW
  106. cls
  107. call :ENUM_SHADOWS
  108. if %errorlevel% neq 0 (
  109.     echo 没有可用的卷影副本,无法挂载。
  110.     pause
  111.     goto MAIN_MENU
  112. )
  113. echo 请选择要挂载的卷影序号:
  114. set /p "sel=输入序号 (1-%shadow_count%):"
  115. if "%sel%"=="" goto MOUNT_SHADOW
  116. set /a "idx=%sel%-1"
  117. if %idx% lss 0 goto MOUNT_SHADOW
  118. if %idx% geq %shadow_count% goto MOUNT_SHADOW

  119. call :GET_SHADOW_INFO %idx%
  120. if "%shadow_device%"=="" (
  121.     echo 错误:未获取到卷影设备路径。
  122.     pause
  123.     goto MAIN_MENU
  124. )

  125. echo.
  126. echo 可用的空闲盘符(推荐从列表中选择):
  127. call :GET_FREE_DRIVES
  128. echo 空闲盘符: %free_drives%
  129. echo.
  130. set /p "mount_drv=请输入挂载盘符(例如 Z: 或 X:,不带反斜杠):"
  131. if "%mount_drv%"=="" goto MOUNT_SHADOW
  132. if not "%mount_drv:~1,1%"==":" (
  133.     echo 错误:盘符格式应为字母加冒号,如 Z:
  134.     pause
  135.     goto MOUNT_SHADOW
  136. )
  137. set "mount_drv=%mount_drv:~0,2%"

  138. :: 清除原先可能存在的映射
  139. subst %mount_drv% /d >nul 2>&1
  140. subst %mount_drv% "\\?\GLOBALROOT%shadow_device%"
  141. if %errorlevel% equ 0 (
  142.     echo 挂载成功!现在可以通过 %mount_drv% 访问卷影副本内容。
  143. ) else (
  144.     echo 挂载失败,请检查盘符是否被占用或路径无效。
  145. )
  146. pause
  147. goto MAIN_MENU

  148. :UNMOUNT_DRIVE
  149. cls
  150. echo 当前已挂载的 subst 盘符列表:
  151. subst
  152. echo.
  153. set /p "umnt=请输入要卸载的盘符(例如 Z:):"
  154. if "%umnt%"=="" goto UNMOUNT_DRIVE
  155. if not "%umnt:~1,1%"==":" (
  156.     echo 错误:盘符格式不正确。
  157.     pause
  158.     goto UNMOUNT_DRIVE
  159. )
  160. subst %umnt% /d >nul 2>&1
  161. if %errorlevel% equ 0 (
  162.     echo 盘符 %umnt% 已成功卸载。
  163. ) else (
  164.     echo 卸载失败,可能该盘符未通过 subst 挂载或不存在。
  165. )
  166. pause
  167. goto MAIN_MENU

  168. :DELETE_SHADOW
  169. cls
  170. call :ENUM_SHADOWS
  171. if %errorlevel% neq 0 (
  172.     echo 没有可删除的卷影副本。
  173.     pause
  174.     goto MAIN_MENU
  175. )
  176. echo 请选择要删除的卷影序号:
  177. set /p "sel=输入序号 (1-%shadow_count%):"
  178. if "%sel%"=="" goto DELETE_SHADOW
  179. set /a "idx=%sel%-1"
  180. if %idx% lss 0 goto DELETE_SHADOW
  181. if %idx% geq %shadow_count% goto DELETE_SHADOW

  182. call :GET_SHADOW_INFO %idx%
  183. if "%shadow_id%"=="" (
  184.     echo 错误:未获取到卷影ID。
  185.     pause
  186.     goto MAIN_MENU
  187. )

  188. echo.
  189. echo 即将删除以下卷影:
  190. echo   ID: %shadow_id%
  191. echo   原盘符: %shadow_volume%
  192. echo   创建时间: %shadow_time%
  193. set "del_confirm="
  194. set /p "del_confirm=确认删除?[Y/N]:"
  195. if /i not "%del_confirm%"=="Y" (
  196.     echo 操作取消。
  197.     pause
  198.     goto MAIN_MENU
  199. )
  200. vssadmin delete shadows /shadow=%shadow_id% /quiet
  201. if %errorlevel% equ 0 (
  202.     echo 卷影已成功删除。
  203. ) else (
  204.     echo 删除失败,请检查卷影ID是否正确。
  205. )
  206. pause
  207. goto MAIN_MENU

  208. :: ====================== 子程序区 ======================

  209. :ENUM_SHADOWS
  210. :: 输出卷影列表到 %TEMP_DIR%\shadow_table.txt,并设置 shadow_count
  211. setlocal enabledelayedexpansion
  212. set "outfile=%TEMP_DIR%\shadow_table.txt"
  213. set "rawfile=%TEMP_DIR%\vss_raw.txt"
  214. vssadmin list shadows > "%rawfile%" 2>nul
  215. if %errorlevel% neq 0 (
  216.     endlocal
  217.     exit /b 1
  218. )
  219. :: 检查是否包含卷影记录
  220. findstr /i "Shadow Copy ID 卷影副本 ID" "%rawfile%" >nul
  221. if %errorlevel% neq 0 (
  222.     endlocal
  223.     exit /b 1
  224. )

  225. set "count=0"
  226. set "table="
  227. set "cur_id="
  228. set "cur_vol="
  229. set "cur_dev="
  230. set "cur_time="

  231. for /f "usebackq tokens=1,* delims=:" %%a in (`findstr /n "^" "%rawfile%"`) do (
  232.     set "line=%%b"
  233.     if defined line (
  234.         set "line=!line:~1!"
  235.     ) else (
  236.         set "line="
  237.     )
  238.     :: 识别 ID 行(中英文)
  239.     echo !line! | findstr /i "Shadow Copy ID 卷影副本 ID" >nul
  240.     if !errorlevel! equ 0 (
  241.         if defined cur_id (
  242.             call :RECORD_SHADOW !count! "!cur_id!" "!cur_vol!" "!cur_dev!" "!cur_time!"
  243.             set /a count+=1
  244.         )
  245.         for /f "tokens=3 delims={}" %%i in ("!line!") do set "cur_id={%%i}"
  246.         set "cur_vol="
  247.         set "cur_dev="
  248.         set "cur_time="
  249.         goto :next
  250.     )
  251.     :: 识别原始卷行
  252.     echo !line! | findstr /i "Original Volume 原始卷" >nul
  253.     if !errorlevel! equ 0 (
  254.         for /f "tokens=2 delims=:" %%v in ("!line!") do set "cur_vol=%%v"
  255.         set "cur_vol=!cur_vol:~1!"
  256.         :: 提取类似 C:\ 的盘符
  257.         for /f "tokens=1 delims=\" %%d in ("!cur_vol!") do set "cur_vol=%%d"
  258.         goto :next
  259.     )
  260.     :: 识别设备路径行(卷影副本卷)
  261.     echo !line! | findstr /i "Shadow Copy Volume 卷影副本卷" >nul
  262.     if !errorlevel! equ 0 (
  263.         for /f "tokens=2 delims=:" %%d in ("!line!") do set "cur_dev=%%d"
  264.         set "cur_dev=!cur_dev:~1!"
  265.         :: 提取 GLOBALROOT 之后的部分
  266.         set "cur_dev=!cur_dev:*GLOBALROOT=!"
  267.         :: 去掉尾部可能的空格
  268.         set "cur_dev=!cur_dev: =!"
  269.         goto :next
  270.     )
  271.     :: 识别时间行
  272.     echo !line! | findstr /i "Creation Time 创建时间" >nul
  273.     if !errorlevel! equ 0 (
  274.         for /f "tokens=2* delims=:" %%t in ("!line!") do set "cur_time=%%t"
  275.         set "cur_time=!cur_time:~1!"
  276.         goto :next
  277.     )
  278.     :next
  279.     rem 空行或者不匹配行,跳过
  280. )
  281. :: 最后一组
  282. if defined cur_id (
  283.     call :RECORD_SHADOW !count! "!cur_id!" "!cur_vol!" "!cur_dev!" "!cur_time!"
  284.     set /a count+=1
  285. )

  286. endlocal & set "shadow_count=%count%" & ( if "%count%"=="0" ( exit /b 1 ) else ( type "%outfile%" >nul & exit /b 0 ) )
  287. exit /b

  288. :RECORD_SHADOW
  289. setlocal
  290. set "idx=%~1"
  291. set "sid=%~2"
  292. set "svol=%~3"
  293. set "sdev=%~4"
  294. set "stime=%~5"
  295. if "%svol%"=="" set "svol=未知"
  296. if "%sdev%"=="" set "sdev=未知"
  297. if "%stime%"=="" set "stime=未知"
  298. set "line= %idx%.  盘符: %svol%  时间: %stime%  设备: %sdev%"
  299. echo %line% >> "%TEMP_DIR%\shadow_table.txt"
  300. endlocal
  301. exit /b

  302. :GET_SHADOW_INFO
  303. :: 输入参数:索引(从0开始),返回全局变量 shadow_id, shadow_volume, shadow_device, shadow_time
  304. setlocal enabledelayedexpansion
  305. set "idx=%~1"
  306. set "file=%TEMP_DIR%\shadow_table.txt"
  307. if not exist "%file%" exit /b 1
  308. set "cur=0"
  309. for /f "tokens=1,2,3,4,5,6,* delims= " %%a in (%file%) do (
  310.     set "prefix=%%a"
  311.     if "!prefix:~-1!"=="." (
  312.         set /a cur=!prefix:~0,-1! 2>nul
  313.         if !cur! equ !idx! (
  314.             :: 提取盘符(第3个字段,如C:)
  315.             set "shadow_volume=%%c"
  316.             :: 提取时间(第5-6字段拼接)
  317.             set "shadow_time=%%e %%f"
  318.             :: 提取设备(第8字段开始)
  319.             set "shadow_device="
  320.             set "i=0"
  321.             for %%x in (%%a %%b %%c %%d %%e %%f %%g) do (
  322.                 if !i! geq 6 (
  323.                     if "!shadow_device!"=="" (set "shadow_device=%%x") else set "shadow_device=!shadow_device! %%x"
  324.                 )
  325.                 set /a i+=1
  326.             )
  327.             goto found
  328.         )
  329.     )
  330. )
  331. :found
  332. endlocal & set "shadow_id=%sid%" & set "shadow_volume=%shadow_volume%" & set "shadow_device=%shadow_device%" & set "shadow_time=%shadow_time%"
  333. exit /b

  334. :GET_FREE_DRIVES
  335. setlocal enabledelayedexpansion
  336. set "used="
  337. for /f "skip=1 tokens=1" %%d in ('wmic logicaldisk get deviceid 2^>nul') do (
  338.     set "used=!used! %%d"
  339. )
  340. set "free_list="
  341. for %%d in (G H I J K L M N O P Q R S T U V W X Y Z) do (
  342.     set "drv=%%d:"
  343.     if "!used:%%d: =!"=="!used!" (
  344.         set "free_list=!free_list! %%d:"
  345.     )
  346. )
  347. endlocal & set "free_drives=%free_list:~1%"
  348. exit /b
复制代码

回复

使用道具 举报

发表于 前天 13:27 | 显示全部楼层
for /f "delims=" %%i in ('powershell -Command "(Get-WmiObject -List Win32_ShadowCopy).Create('C:\', 'ClientAccessible') | ForEach-Object { $_.ShadowID }"') do set "ShadowID=%%i"
@echo 卷影副本ID:%ShadowID%
vssadmin List Shadows  /Shadow=%ShadowID%  > ret_tmp.log
for /f "eol=; tokens=2,3* delims=: " %%i in ('type ret_tmp.log ^| findstr "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy"') do (
        @echo 卷影副本卷名:%%i
        set vs=%%i\
)
mklink /D D:\C  %vs%   
创建连接 就可以 查看 备份了
如:Dism.exe /Capture-Image /ImageFile:WinOS.wim /CaptureDir:D:\C\  /Compress:fast /Name:Win-back
rmdir d:\c
)

点评

ShadowSpawn.EXE C:\ P: imagex /capture P:\ d:\data.wim "Drive c" 另一种卷影 备份。  详情 回复 发表于 昨天 16:13
回复

使用道具 举报

发表于 昨天 16:13 | 显示全部楼层
oym2016 发表于 2026-5-11 13:27
for /f "delims=" %%i in ('powershell -Command "(Get-WmiObject -List Win32_ShadowCopy).Create('C:\',  ...

ShadowSpawn.EXE C:\ P: imagex /capture P:\ d:\data.wim "Drive c"
另一种卷影 备份。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-5-13 07:11

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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