Board logo

标题: [文件操作] 【已解决】批处理查找C盘游戏存档并复制到d盘 [打印本页]

作者: xiaoyao202    时间: 2022-4-17 12:48     标题: 【已解决】批处理查找C盘游戏存档并复制到d盘

本帖最后由 xiaoyao202 于 2022-4-20 21:11 编辑

求助大佬。
游戏存档后缀.sav 例如存档文件在C:\Users\Administrator\AppData\Local\SniperElite4\PC_ProfileSaves\76561197993333907下面或者C:\ProgramData\Tom Clancy's Ghost Recon Wildlands\UserData下面。我需要复制SniperElite4文件夹或Tom Clancy's Ghost Recon Wildlands文件夹到其他盘,并输出txt、
谢谢!!
作者: Batcher    时间: 2022-4-17 13:06

回复 1# xiaoyao202
  1. @echo off
  2. cd /d "%~dp0"
  3. REM 设置备份到哪个文件夹
  4. set "DstFolder=D:\Test"
  5. if exist "C:\Users\Administrator\AppData\Local\SniperElite4\PC_ProfileSaves\76561197993333907\*.sav" (
  6.     xcopy /e /y "C:\Users\Administrator\AppData\Local\SniperElite4" "%DstFolder%\SniperElite4\"
  7. )
  8. if exist "C:\ProgramData\Tom Clancy's Ghost Recon Wildlands\UserData\*.sav" (
  9.     xcopy /e /y "C:\ProgramData\Tom Clancy's Ghost Recon Wildlands" "%DstFolder%\Tom Clancy's Ghost Recon Wildlands\"
  10. )
复制代码

作者: xiaoyao202    时间: 2022-4-17 13:28

本帖最后由 xiaoyao202 于 2022-4-17 13:29 编辑

回复 2# Batcher


        谢谢。但是我是举个例子。主要是查找sav后缀的文件来判断游戏存档获取路径,然后截取路径C:\Users\Administrator\AppData\Local\SniperElite4复制SniperElite4这个文件夹。因为好多游戏存档。需要输出txt是来判断文件夹在那个位置。重装系统后可以存档复制过去
作者: Batcher    时间: 2022-4-17 17:20

回复 3# xiaoyao202
  1. @echo off
  2. cd /d "%~dp0"
  3. REM 设置备份到哪个文件夹
  4. set "DstFolder=D:\Test"
  5. REM 设置写入哪个文件
  6. set "DstFile=D:\1.txt"
  7. if exist "C:\Users\Administrator\AppData\Local\SniperElite4\PC_ProfileSaves\76561197993333907\*.sav" (
  8.     xcopy /e /y "C:\Users\Administrator\AppData\Local\SniperElite4" "%DstFolder%\SniperElite4\"
  9.     >"%DstFile%" echo C:\Users\Administrator\AppData\Local\SniperElite4
  10. )
  11. if exist "C:\ProgramData\Tom Clancy's Ghost Recon Wildlands\UserData\*.sav" (
  12.     xcopy /e /y "C:\ProgramData\Tom Clancy's Ghost Recon Wildlands" "%DstFolder%\Tom Clancy's Ghost Recon Wildlands\"
  13.     >"%DstFile%" echo C:\ProgramData\Tom Clancy's Ghost Recon Wildlands
  14. )
复制代码

作者: xiaoyao202    时间: 2022-4-17 19:12

回复 4# Batcher


       谢谢大佬。可能我表达的还是不清楚。我的意思搜索C盘后缀sav的文件,然后获取文件路径。知道sav的文件是在SniperElite4这个文件夹三层目录中。我需要的是复制SniperElite4这个文件夹。C盘有很多存档文件像在SniperElite4文件夹下的。我只是举这个例子。
图片没法上传可能等级不够。
作者: Batcher    时间: 2022-4-17 19:48

回复 5# xiaoyao202


如需上传截图,请用图床:
http://bbs.bathome.net/thread-60985-1-1.html

如需上传附件,请用阿里云盘或百度网盘。
作者: xiaoyao202    时间: 2022-4-17 23:10

回复 6# Batcher


    谢谢知道了
作者: xiaoyao202    时间: 2022-4-17 23:10

本帖最后由 xiaoyao202 于 2022-4-17 23:20 编辑


希望批处理查找C盘sav文件。然后判断文件全部路径。复制红框的文件夹到D盘。同时输出txt知道sav文件属于那个位置
作者: yakeyun    时间: 2022-4-18 00:41

回复 8# xiaoyao202
代码保存为ANSI格式
  1. @echo off&setlocal enabledelayedexpansion
  2. cd /d "%~dp0"
  3. if not exist D:\存档\ (md D:\存档)
  4. if not exist D:\存档\数据\ (md D:\存档\数据)
  5. for /f "tokens=* delims=, " %%a in ('dir /a /s /b %ALLUSERSPROFILE%\*.sav') do set sav1=%%a
  6.     for /f "tokens=* delims=, " %%b in ('dir /a /s /b %LOCALAPPDATA%\*.sav') do set sav2=%%b
  7. echo !sav1! >>D:\存档\游戏存档.log
  8. xcopy /e /y "!sav1!" "D:\存档\数据\"
  9. echo !sav2! >>D:\存档\游戏存档.log
  10. xcopy /e /y "!sav2!" "D:\存档\数据\"
  11. )
  12. )
  13. cls
  14. echo 游戏存档已经备份完毕,5秒后本窗口将自动关闭!
  15. timeout -t 5 >nul
  16. exit
复制代码

作者: xiaoyao202    时间: 2022-4-18 01:43

本帖最后由 xiaoyao202 于 2022-4-18 01:48 编辑

回复 9# yakeyun
谢谢大佬。我试了不是我要的结果。
图片中红框这几个文件夹里面都有sav文件。需要复制红框里面的文件夹到D盘。输出的文本只显示截图这样就行不知道这样要求是否能实现。再次谢谢各位大佬了
作者: Batcher    时间: 2022-4-18 22:45

回复 8# xiaoyao202


电脑是比较笨的,你得把规律总结出来才能写代码。
例如你需要复制的文件夹是:
.sav文件的上级文件夹?
.sav文件的上上级文件夹?
.sav文件的上上上级文件夹?

如果完全没规律的话,脚本也不知道到底该复制哪一级文件夹。
作者: tz_being    时间: 2022-4-19 08:46

按我的理解,楼主是想把%ALLUSERSPROFILE%和%LOCALAPPDATA%下面一级包含*.sav的文件夹复制到其它文件夹,如d:\存档,同时将复制的sav文件完整路径输出到d:\存档的txt文件中。

如C:\Users\Administrator\AppData\Local\SniperElite4\PC_ProfileSaves\76561197993333907\11.sav 复制到d:\存档 的结果就变成这样:
d:\存档\SniperElite4\PC_ProfileSaves\76561197993333907\11.sav

%LOCALAPPDATA%下面含*.sav的文件夹可能是三层,也可能是两层

输出到txt文件是这样:
C:\Users\Administrator\AppData\Local\SniperElite4\PC_ProfileSaves\76561197993333907\11.sav
作者: xiaoyao202    时间: 2022-4-19 20:14

本帖最后由 xiaoyao202 于 2022-4-19 20:27 编辑

回复 12# tz_being

是这个意思。输出到txt文件
C:\Users\Administrator\AppData\Local\SniperElite4这样就可以了。
SniperElite4这个是游戏的名字
游戏存档一般都在%ALLUSERSPROFILE%和%LOCALAPPDATA%这下面
作者: xiaoyao202    时间: 2022-4-19 20:20

回复 11# Batcher
可以先查找sav或save文件获取路径写入txt然后再读取txt截取路径。例子截取的路径C:\Users\Administrator\AppData\Local\SniperElite4(括号里面是完整路径
C:\Users\Administrator\AppData\Local\SniperElite4\PC_ProfileSaves\76561197993333907\11.sav)复制SniperElite4文件夹到D盘存档
这样的思路不知道行不行。截取这部分不会。
作者: Batcher    时间: 2022-4-19 21:27

回复 12# tz_being


    不全面吧,你看8楼的截图,Tom Clancy's Ghost Recon Wildlands就不在那两个目录下
作者: xiaoyao202    时间: 2022-4-19 21:46

回复 14# xiaoyao202

游戏存档路径
C:\Users\Administrator\AppData\Roaming
C:\Users\Administrator\AppData\Local
C:\ProgramData
C:\Users\Administrator\Documents这个可以改D盘
作者: tz_being    时间: 2022-4-19 23:00

回复 15# Batcher

Tom Clancy's Ghost Recon Wildlands 就在%ALLUSERSPROFILE%(即C:\ProgramData)下面啊
作者: Batcher    时间: 2022-4-19 23:22

回复 14# xiaoyao202


就按照你的思路,先完成第一步,你看看获取到txt文本内容是否正确:
  1. @echo off
  2. cd /d "%~dp0"
  3. set "Folder_1=%userprofile%\AppData\Roaming"
  4. set "Folder_2=%userprofile%\AppData\Local"
  5. set "Folder_3=%allusersprofile%"
  6. set "Folder_4=%userprofile%\Documents"
  7. set "LogFile=D:\1.txt"
  8. type nul >"%LogFile%"
  9. for %%a in ("%Folder_1%","%Folder_2%","%Folder_3%","%Folder_4%") do (
  10.     echo 正在处理文件夹 %%a
  11.     for /f "delims=" %%b in ('dir /b /s /a-d "%%a\*.sav"') do (
  12.         >>"%LogFile%" echo %%b
  13.     )
  14. )
复制代码
然后下一步再继续讨论到底获取哪一级文件夹
作者: yakeyun    时间: 2022-4-20 00:52

本帖最后由 yakeyun 于 2022-4-20 00:57 编辑

回复 10# xiaoyao202
  1. @echo off&setlocal enabledelayedexpansion
  2. if not exist D:\存档\ (md D:\存档)
  3. if not exist D:\存档\数据\ (md D:\存档\数据)
  4. for /f "delims=" %%a in ('dir /a /s /b "C:\ProgramData\*.sav" ') do (
  5. set savkz1=%%~xa
  6. set sav1=%%~dpa
  7. echo !sav1!
  8. if !savkz1!==.sav (
  9. echo !sav1! >>D:\存档\游戏存档.log
  10. copy /y "!sav1!" "D:\存档\数据\"
  11. )
  12. )
  13. for /f "delims=" %%b in ('dir /a /s /b "C:\Users\Administrator\AppData\Local\*.sav" ') do (
  14. set savkz2=%%~xb
  15. set sav2=%%~dpb
  16. echo !sav2!
  17. if !savkz2!==.sav (
  18. echo !sav2! >>D:\存档\游戏存档.log
  19. copy /y "!sav2!" "D:\存档\数据\"
  20. )
  21. )
  22. echo 游戏存档已经备份完毕,3秒后本窗口将自动关闭!
  23. timeout -t 3 >nul
  24. exit
复制代码

作者: yakeyun    时间: 2022-4-20 01:00

回复 18# Batcher


19楼已经用if过滤了非.sav的文件项目,但是拷贝会多一些其它扩展名文件。


作者: xiaoyao202    时间: 2022-4-20 02:24

本帖最后由 xiaoyao202 于 2022-4-20 02:42 编辑

回复 18# Batcher


    测试了没问题。下一步读取sav文件路径然后截取
也就是需要复制roaming和local后面的文件夹
作者: xiaoyao202    时间: 2022-4-20 02:34

回复 20# yakeyun


    谢谢大佬。但是需要的这种不是sav文件。文件夹是存档游戏的名字。sav文件在这些文件夹的子目录里面
作者: Batcher    时间: 2022-4-20 09:02

回复 21# xiaoyao202


    请把这个txt文件上传到网盘我试试
作者: xiaoyao202    时间: 2022-4-20 12:24

回复 23# Batcher
https://wwi.lanzoup.com/i5g1J03hiqvg
蓝奏盘
作者: Batcher    时间: 2022-4-20 12:54

回复 24# xiaoyao202


把你的1.txt和下面这个test_2.bat放在同一个目录下
test_2.bat 保存为UTF-8编码(为了跟1.txt保持一致):
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
  1. @echo off
  2. chcp 65001
  3. REM 设置备份到哪个文件夹
  4. set "DstFolder=D:\Test"
  5. cd /d "%~dp0"
  6. setlocal enabledelayedexpansion
  7. for /f "delims=" %%i in ('type "1.txt"') do (
  8.     set "File=%%i"
  9.     if "!File:%userprofile%\AppData\=!" neq "%%i" (
  10.         for /f "tokens=1-6 delims=\" %%a in ("%%i") do (
  11.             if not defined %%a\%%b\%%c\%%d\%%e\%%f (
  12.                 xcopy /e /y "%%a\%%b\%%c\%%d\%%e\%%f" "%DstFolder%\%%f\"
  13.                 set "%%a\%%b\%%c\%%d\%%e\%%f=1"
  14.             )
  15.         )
  16.     ) else if "!File:%allusersprofile%\=!" neq "%%i" (
  17.         for /f "tokens=1-3 delims=\" %%a in ("%%i") do (
  18.             if not defined %%a\%%b\%%c (
  19.                 xcopy /e /y "%%a\%%b\%%c" "%DstFolder%\%%c\"
  20.                 set "%%a\%%b\%%c=1"
  21.             )
  22.         )
  23.     ) else if "!File:%userprofile%\Documents\=!" neq "%%i" (
  24.         for /f "tokens=1-5 delims=\" %%a in ("%%i") do (
  25.             if not defined %%a\%%b\%%c\%%d\%%e (
  26.                 xcopy /e /y "%%a\%%b\%%c\%%d\%%e" "%DstFolder%\%%e\"
  27.                 set "%%a\%%b\%%c\%%d\%%e=1"
  28.             )
  29.         )
  30.     )
  31. )
  32. endlocal
复制代码

作者: xiaoyao202    时间: 2022-4-20 17:48

本帖最后由 xiaoyao202 于 2022-4-20 17:50 编辑

回复 25# Batcher
谢谢大佬。测试没问题。但是2个批处理能合并一起吗。读取完1.txt然后删除。输出游戏存档路径的txt。也就是截取后的路径
作者: Batcher    时间: 2022-4-20 19:22

回复 26# xiaoyao202


test_3.bat 另存为UTF-8编码
  1. @echo off
  2. chcp 65001
  3. REM 设置备份到哪个文件夹
  4. set "DstFolder=D:\Test"
  5. REM 设置游戏存档路径
  6. set "Folder_1=%userprofile%\AppData\Roaming"
  7. set "Folder_2=%userprofile%\AppData\Local"
  8. set "Folder_3=%allusersprofile%"
  9. set "Folder_4=%userprofile%\Documents"
  10. set "LogFile=%temp%\GameFolder.txt"
  11. type nul >"%LogFile%"
  12. for %%a in ("%Folder_1%","%Folder_2%","%Folder_3%","%Folder_4%") do (
  13.     echo 正在处理文件夹 %%a
  14.     for /f "delims=" %%b in ('dir /b /s /a-d "%%a\*.sav"') do (
  15.         >>"%LogFile%" echo %%b
  16.     )
  17. )
  18. setlocal enabledelayedexpansion
  19. for /f "delims=" %%i in ('type "%LogFile%"') do (
  20.     set "File=%%i"
  21.     if "!File:%userprofile%\AppData\=!" neq "%%i" (
  22.         for /f "tokens=1-6 delims=\" %%a in ("%%i") do (
  23.             if not defined %%a\%%b\%%c\%%d\%%e\%%f (
  24.                 xcopy /e /y "%%a\%%b\%%c\%%d\%%e\%%f" "%DstFolder%\%%f\"
  25.                 set "%%a\%%b\%%c\%%d\%%e\%%f=1"
  26.             )
  27.         )
  28.     ) else if "!File:%allusersprofile%\=!" neq "%%i" (
  29.         for /f "tokens=1-3 delims=\" %%a in ("%%i") do (
  30.             if not defined %%a\%%b\%%c (
  31.                 xcopy /e /y "%%a\%%b\%%c" "%DstFolder%\%%c\"
  32.                 set "%%a\%%b\%%c=1"
  33.             )
  34.         )
  35.     ) else if "!File:%userprofile%\Documents\=!" neq "%%i" (
  36.         for /f "tokens=1-5 delims=\" %%a in ("%%i") do (
  37.             if not defined %%a\%%b\%%c\%%d\%%e (
  38.                 xcopy /e /y "%%a\%%b\%%c\%%d\%%e" "%DstFolder%\%%e\"
  39.                 set "%%a\%%b\%%c\%%d\%%e=1"
  40.             )
  41.         )
  42.     )
  43. )
  44. endlocal
复制代码

作者: xiaoyao202    时间: 2022-4-20 20:57

本帖最后由 xiaoyao202 于 2022-4-20 21:02 编辑

回复 27# Batcher


    谢谢大佬。测试可以用。能不能输出截取路径后的txt。不然不知道文件夹属于那个位置
作者: Batcher    时间: 2022-4-20 21:03

回复 28# xiaoyao202
  1. @echo off
  2. chcp 65001
  3. REM 设置备份到哪个文件夹
  4. set "DstFolder=D:\Test"
  5. REM 设置截取路径后的游戏目录列表
  6. set "LogOutput=D:\Test\GameList.txt"
  7. REM 设置游戏存档路径
  8. set "Folder_1=%userprofile%\AppData\Roaming"
  9. set "Folder_2=%userprofile%\AppData\Local"
  10. set "Folder_3=%allusersprofile%"
  11. set "Folder_4=%userprofile%\Documents"
  12. set "LogTemp=%temp%\GameFolder.txt"
  13. type nul >"%LogTemp%"
  14. type nul >"%LogOutput%"
  15. for %%a in ("%Folder_1%","%Folder_2%","%Folder_3%","%Folder_4%") do (
  16.     echo 正在处理文件夹 %%a
  17.     for /f "delims=" %%b in ('dir /b /s /a-d "%%a\*.sav"') do (
  18.         >>"%LogTemp%" echo %%b
  19.     )
  20. )
  21. setlocal enabledelayedexpansion
  22. for /f "delims=" %%i in ('type "%LogTemp%"') do (
  23.     set "File=%%i"
  24.     if "!File:%userprofile%\AppData\=!" neq "%%i" (
  25.         for /f "tokens=1-6 delims=\" %%a in ("%%i") do (
  26.             if not defined %%a\%%b\%%c\%%d\%%e\%%f (
  27.                 >>%LogOutput% echo %%a\%%b\%%c\%%d\%%e\%%f
  28.                 xcopy /e /y "%%a\%%b\%%c\%%d\%%e\%%f" "%DstFolder%\%%f\"
  29.                 set "%%a\%%b\%%c\%%d\%%e\%%f=1"
  30.             )
  31.         )
  32.     ) else if "!File:%allusersprofile%\=!" neq "%%i" (
  33.         for /f "tokens=1-3 delims=\" %%a in ("%%i") do (
  34.             if not defined %%a\%%b\%%c (
  35.                 >>%LogOutput% echo %%a\%%b\%%c
  36.                 xcopy /e /y "%%a\%%b\%%c" "%DstFolder%\%%c\"
  37.                 set "%%a\%%b\%%c=1"
  38.             )
  39.         )
  40.     ) else if "!File:%userprofile%\Documents\=!" neq "%%i" (
  41.         for /f "tokens=1-5 delims=\" %%a in ("%%i") do (
  42.             if not defined %%a\%%b\%%c\%%d\%%e (
  43.                 >>%LogOutput% echo %%a\%%b\%%c\%%d\%%e
  44.                 xcopy /e /y "%%a\%%b\%%c\%%d\%%e" "%DstFolder%\%%e\"
  45.                 set "%%a\%%b\%%c\%%d\%%e=1"
  46.             )
  47.         )
  48.     )
  49. )
  50. endlocal
复制代码

作者: xiaoyao202    时间: 2022-4-20 21:09

回复 29# Batcher


    非常感谢大佬




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2