2018年10月23日 星期二

備份快壞掉的 SD card

最近手機上的 SD card 發生了問題,說要重新格式化,上面一堆照片怎能格式化,於是拿到電腦上用讀卡機搶救,幸好還可以讀,想說趕快 copy 出來,一開始整個資料夾備份,但讀沒幾個檔就出現錯誤 0x80070022 或 0x80070057 說 SD 有問題,需要重插拔才會好



後來發現一個一個檔用剪下貼上的,可以多備份幾個檔,但整張卡檔案有好幾百個阿,一個一個剪下貼上不知要到何時,所以寫了以下批次檔來幫我做:


@echo off
if "%1" == "" goto endbackup
if "%2" == "" goto endbackup

setlocal enabledelayedexpansion

:start
for /f "delims=" %%i in ('dir /s /b /on %1\*.*') do (
  if exist %%~i\ (
     echo md %2%%~pni
     md %2%%~pni
  ) else (
    echo mov %%i %2%%~pi
    if not exist %2%%~pnxi (
       move /-Y %%i %2%%~pi || goto resetusb
    )
  )
)

:endbackup

有了上面那個批次檔以後可以不用一個一個檔  copy 了,但還是會發生 SD 錯誤,要重插拔才會好,插了幾次之後,除了怕要重插上百次以外也怕 USB port 壞掉,想說以前 linux 有個 usbreset 的工具可以重置 usb 裝置,想說 windows 會不會也有,後來找到  devcon.exe 可以用(32bit & 64bit OS 有分,要注意一下不然會不能控制裝置),因此批次檔改為下面那個內容,其中 devcon restart 有時會失敗,叫我要重開機,所以等了一下再重試一次,若一直出現 requires reboot,就試著加大重試等待時間。



@echo off
if "%1" == "" goto endbackup
if "%2" == "" goto endbackup

setlocal enabledelayedexpansion

:start
for /f "delims=" %%i in ('dir /s /b /on %1\*.*') do (
  if exist %%~i\ (
    echo md %2%%~pni
    md %2%%~pni
  ) else (
    echo mov %%i %2%%~pi
    if not exist %2%%~pnxi (
      move /-Y %%i %2%%~pi || goto resetusb
    )
  )
)
goto endbackup

:resetusb
devcon restart "@USB\VID_14CD&PID_125A\812520090519" 
if not "%errorlevel%" == "0" (
  timeout /t 30
  goto resetusb
)
timeout /t 30
goto start

:endbackup

這下終於可以放著不管它了 😃


使用方法:

backup.bat 來源資料夾 目的資料夾 (資料夾後面不可加 "\")
如: backup.bat h:\DCIM d:\backup

參考資料: http://delphintipz.blogspot.com/2012/07/disable-failed-no-devices-disabled.html

2 則留言:

匿名 提到...

不好意思,本身不懂CMD的用法所以看不太懂使用方式,可以另外解說一下用法嗎?~感謝!!

小人物 提到...

請問哪裡看不懂? 你知道cmd, 應該知道怎叫出來吧,cmd叫出來後,執行 backup.bat h:\DCIM d:\backup 之類的應該就可以跑了