2025年7月4日 星期五

Using GNU awk in windows to get the files size , take times, copy write speed

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


沒有留言: