GNU awk
https://gnuwin32.sourceforge.net/packages/gawk.htm
透過awk取得 robocopy 檔案大小、操作時間、測試速度
Using awk in windows, get the files size , take times, copy write speed
以下為robocopy_getSpeed.bat
@echo off
setlocal enabledelayedexpansion
:: 檢查是否有傳入速度限制參數
if "%~1"=="" (
echo 請傳入速度限制(MB/s)作為參數,例如:robocopy_getSpeed.bat 10
exit /b 99
)
set "limit=%~1"
if "%~2"=="" (
set "logfile=robocopy_log.txt"
) else (
set "logfile=%~2"
)
if not exist "!logfile!" (
echo [%DATE% %TIME%] !logfile! 不存在
exit /b 3
)
:: 取得 Bytes(MB)
for /f %%A in ('findstr "Bytes[^/]" %logfile% ^| awk "{ print $3 }"') do (
set "bytes=%%A"
)
:: 取得 Time(秒)支援 HH:MM:SS 或 MM:SS
for /f %%A in ('findstr "Times" %logfile% ^| awk "{ n=split($3,t,\":\"); if (n==3) print t[1]*3600 + t[2]*60 + t[3]; else if (n==2) print t[1]*60 + t[2]; else print 0 }"') do (
set "seconds=%%A"
)
if "!bytes!"=="" (
exit /b 2
)
if "!seconds!"=="" (
exit /b 2
)
:: 使用 PowerShell 計算速度(MB/s)
for /f %%S in ('powershell -command "[math]::Round(%bytes% / %seconds%, 2)"') do (
set "speed=%%S"
)
echo Bytes: %bytes% MB
echo Time: %seconds% 秒
echo 速度: %speed% MB/s
echo 限速: %limit% MB/s
:: 比較速度與限制
powershell -command "if (%speed% -lt %limit%) { exit 2 } else { exit 1 }"
以下為 偵測磁碟並透過 robocopy 複製檔案 disk_test_copy.bat
@echo off
setlocal EnableDelayedExpansion
:: 設定來源資料夾、記錄檔案和日誌檔案
set "SOURCE_DIR=F:\NKG\__ProjectBackup\2025\RPA\AutoDoIt\bin\Debug\app\Script\test"
set "DRIVE_FILE=drive.txt"
set "LOG_FILE=copy_log.txt"
set "LIMIT_SPEED=10"
set "COUNT_FILE=count.txt"
:: 初始化日誌
echo [%DATE% %TIME%] 腳本開始 >> "%LOG_FILE%"
:: 檢查來源資料夾是否存在
if not exist "%SOURCE_DIR%\" (
echo 錯誤:來源資料夾不存在!
echo [%DATE% %TIME%] 錯誤:來源資料夾不存在 >> "%LOG_FILE%"
pause
exit /b 1
)
:: 檢查是否已有磁碟機記錄檔案
if exist "%DRIVE_FILE%" (
set /p NEW_DRIVE=<%DRIVE_FILE%
if exist "!NEW_DRIVE!:\" (
echo 讀取磁碟機:!NEW_DRIVE!
echo [%DATE% %TIME%] 讀取磁碟機:!NEW_DRIVE! >> "%LOG_FILE%"
goto :process
) else (
echo 錯誤:磁碟機 !NEW_DRIVE! 不存在,重新檢測...
echo [%DATE% %TIME%] 錯誤:磁碟機 !NEW_DRIVE! 不存在 >> "%LOG_FILE%"
del "%DRIVE_FILE%"
)
)
:: 儲存初始磁碟機列表
set "PREV_DRIVES="
for %%D in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
if exist %%D:\ (
set "PREV_DRIVES=!PREV_DRIVES! %%D"
)
)
:: 主迴圈:監控新磁碟插入
echo 監控新磁碟...
echo [%DATE% %TIME%] 監控新磁碟 >> "%LOG_FILE%"
:loop
set "CURRENT_DRIVES="
for %%D in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
if exist %%D:\ (
set "CURRENT_DRIVES=!CURRENT_DRIVES! %%D"
)
)
set "NEW_DRIVE="
for %%D in (%CURRENT_DRIVES%) do (
echo %PREV_DRIVES% | find /i "%%D" >nul
if !errorlevel! neq 0 (
set "NEW_DRIVE=%%D"
goto :found
)
)
set "PREV_DRIVES=%CURRENT_DRIVES%"
timeout /t 2 /nobreak >nul
goto loop
:found
echo 檢測到新磁碟:!NEW_DRIVE!
echo [%DATE% %TIME%] 檢測到新磁碟:!NEW_DRIVE! >> "%LOG_FILE%"
echo !NEW_DRIVE!>%DRIVE_FILE%
echo 儲存磁碟機到 drive.txt
echo [%DATE% %TIME%] 儲存磁碟機到 drive.txt >> "%LOG_FILE%"
:process
set "TARGET_DIR=!NEW_DRIVE!:\Backup\test"
echo [%DATE% %TIME%] 檢查磁碟 !NEW_DRIVE! 是否可寫 >> "%LOG_FILE%"
echo test>%TEMP%\test.txt
copy "%TEMP%\test.txt" "!NEW_DRIVE!:\" >nul 2>&1
if !errorlevel! neq 0 (
echo 錯誤:無法寫入磁碟 !NEW_DRIVE!
echo [%DATE% %TIME%] 錯誤:無法寫入磁碟 !NEW_DRIVE! >> "%LOG_FILE%"
pause
exit /b 1
)
::del "!NEW_DRIVE!:\test.txt" >nul 2>&1
echo Will del "!TARGET_DIR!"
pause
del /f /s /q "!TARGET_DIR!" >nul 2>&1
if not exist "!TARGET_DIR!\" (
mkdir "!TARGET_DIR!"
echo [%DATE% %TIME%] 創建目標資料夾 >> "%LOG_FILE%"
)
echo 正在複製資料...
echo [%DATE% %TIME%] 開始複製 >> "%LOG_FILE%"
::set "TEMP_COPY_LOG=%TEMP%\robocopy_copy_%RANDOM%.txt"
set "TEMP_COPY_LOG=robocopy_log.txt"
robocopy "%SOURCE_DIR%" "!TARGET_DIR!" /MIR /COPY:DAT /IS /R:3 /W:5 /LOG:"!TEMP_COPY_LOG!" /NP
if !errorlevel! geq 8 (
echo 錯誤:複製失敗!錯誤碼:!errorlevel!
echo [%DATE% %TIME%] 錯誤:複製失敗,錯誤碼:!errorlevel! >> "%LOG_FILE%"
type "!TEMP_COPY_LOG!" >> "%LOG_FILE%"
del "!TEMP_COPY_LOG!" >nul 2>&1
pause
exit /b 1
)
echo [%DATE% %TIME%] 複製完成 >> "%LOG_FILE%"
::copy "!TEMP_COPY_LOG!" "robocopy_log.txt"
type "!TEMP_COPY_LOG!" >> "%LOG_FILE%"
echo 正在比對檔案...
echo [%DATE% %TIME%] 開始比對 >> "%LOG_FILE%"
set "TEMP_FILE=%TEMP%\robocopy_diff_%RANDOM%.txt"
robocopy "%SOURCE_DIR%" "!TARGET_DIR!" /MIR /COPY:DAT /L /XJ /R:3 /W:5 /LOG:"!TEMP_FILE!" /NP >nul
if !errorlevel! geq 8 (
echo 錯誤:比對失敗!錯誤碼:!errorlevel!
echo [%DATE% %TIME%] 錯誤:比對失敗,錯誤碼:!errorlevel! >> "%LOG_FILE%"
if exist "!TEMP_FILE!" (
echo [%DATE% %TIME%] robocopy 比對輸出: >> "%LOG_FILE%"
type "!TEMP_FILE!" >> "%LOG_FILE%"
)
del "!TEMP_FILE!" >nul 2>&1
pause
exit /b 1
)
set "DIFF_COUNT=0"
if exist "!TEMP_FILE!" (
for /f "tokens=*" %%F in ('findstr /b /c:" New File " /c:" Extra " "!TEMP_FILE!"') do (
echo [%DATE% %TIME%] 差異檔案:%%F >> "%LOG_FILE%"
set /a DIFF_COUNT+=1
)
)
del "!TEMP_FILE!" >nul 2>&1
if !DIFF_COUNT! neq 0 (
echo 錯誤:檔案清單不一致!差異數:!DIFF_COUNT!
echo [%DATE% %TIME%] 錯誤:檔案清單不一致,差異數:!DIFF_COUNT! >> "%LOG_FILE%"
pause
exit /b 1
)
set "CONTENT_DIFF=0"
for %%F in ("%SOURCE_DIR%\*.*") do (
fc /b "%%F" "!TARGET_DIR!\%%~nxF" >nul 2>&1
if !errorlevel! neq 0 (
echo 錯誤:檔案內容不同:%%~nxF
echo [%DATE% %TIME%] 錯誤:檔案內容不同:%%~nxF >> "%LOG_FILE%"
set /a CONTENT_DIFF+=1
)
)
if !CONTENT_DIFF! neq 0 (
echo 錯誤:有 !CONTENT_DIFF! 個檔案內容不同!
echo [%DATE% %TIME%] 錯誤:有 !CONTENT_DIFF! 個檔案內容不同 >> "%LOG_FILE%"
pause
exit /b 1
)
echo 複製成功,檔案內容一致!
echo [%DATE% %TIME%] 複製成功,檔案內容一致 >> "%LOG_FILE%"
:: 處理取得速度值 >> "%LOG_FILE%"
robocopy_getSpeed.bat !LIMIT_SPEED!
del "!TEMP_COPY_LOG!" >nul 2>&1
:: 處理執行次數
set "EXEC_COUNT=0"
if exist "%COUNT_FILE%" (
set /p EXEC_COUNT=<%COUNT_FILE%
set /a EXEC_COUNT+=1
) else (
set "EXEC_COUNT=1"
)
echo !EXEC_COUNT!>"%COUNT_FILE%"
echo 執行次數:!EXEC_COUNT!
echo [%DATE% %TIME%] 執行次數:!EXEC_COUNT! >> "%LOG_FILE%"
echo [%DATE% %TIME%] 腳本結束 >> "%LOG_FILE%"
exit /b 0
以下為 robocopy_log.txt
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Friday, July 4, 2025 12:57:13 PM
Source : F:\test\
Dest = G:\Backup\
Files : *.*
Options : *.* /V /TEE /S /E /DCOPY:T /COPY:DAT /R:0 /W:0
------------------------------------------------------------------------------
1 F:\Script\test\
*EXTRA Dir -1 G:\Backup\test\
same 76.7 m sbom-tool-win-x64.exe
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 1 0 1 0 0 1
Files : 1 0 1 0 0 0
Bytes : 76.78 m 0 76.78 m 0 0 0
Times : 1:01:05 1:01:05 0:00:00 0:00:00
Ended : Friday, July 4, 2025 12:57:13 PM