前言
本文將說明如何透過 Windows 標準的批次檔(.bat)或 PowerShell(.ps1),自動刪除 MT5(MetaTrader 5)中「操作日誌(Logs/Journal)」、「專家顧問(MQL5\Logs/Experts)」和「回測(Tester\logs)」的“舊 .log 檔案”,以防止磁碟空間被佔用。此內容適用於希望自動化執行相關文章(MT5日誌檔案過大問題解決方案|刪除操作日誌、專家和回測日誌以減輕負載)的讀者。
自動刪除的考量(先決條件)
- MT5 日誌以日期格式
YYYYMMDD.log儲存。 - 基本的刪除條件是「早於某個日期的檔案」(例如:30 天前)。
- 目標資料夾主要有
Logs、MQL5\Logs和Tester\logs這三個。 - 註冊到 Windows「任務排程器」後,即可實現每日/每週的自動執行。
目標資料夾和路徑的確認方法
在 MT5 上方選單中點選「檔案 → 開啟資料夾」,開啟檔案總管,並確認以下子資料夾:
…\Terminal\<長 ID>\Logs(操作日誌)…\Terminal\<長 ID>\MQL5\Logs(專家顧問/指標)…\Terminal\<長 ID>\Tester\logs(回測)
使用多個終端機(多個 ID)時,每個 ID 下都會有同名的日誌資料夾。便攜版 MT5 的 MQL5 和 Tester 則位於實際資料夾的根目錄。
保留天數(操作策略建議)
- 實際操作(包括 VPS):保留 14〜30 天
- 開發・驗證:7〜14 天(由於輸出量較大,建議較短)
- 回測專用:配合測試週期,每週或每日刪除
建議從 30 天等較長天數開始,如果沒有問題,再逐漸縮短。
方法 A:使用批次檔(.bat)自動刪除
A-1 建議:使用 DRYRUN 旗標切換(支援多個終端機)
為防止誤刪,此版本使用 DRYRUN 旗標實現「僅列出」⇔「實際刪除」的一鍵切換。它會自動掃描 %APPDATA%\MetaQuotes\Terminal 下所有 ID(終端機)。
當您在一台電腦或 VPS 上執行多個 MT5 時非常方便。
@echo off
REM ===== MT5 日誌自動刪除(批次檔版/多個終端機&一鍵切換) =====
REM 建議以管理員權限執行。請根據需要修改 DAYS/DRYRUN。
setlocal enabledelayedexpansion
set "DAYS=30" REM 目標檔案的保留天數(例如:30)
set "DRYRUN=1" REM 1=僅列出(不刪除), 0=實際刪除
set "DATA_ROOT=%APPDATA%\MetaQuotes\Terminal"
echo [INFO] MT5 logs cleanup target: files older than %DAYS% days
echo [MODE] DRYRUN=%DRYRUN% (1=list only, 0=delete)
echo [ROOT] %DATA_ROOT%
echo.
for /D %%T in ("%DATA_ROOT%\*") do (
for %%F in ("%%T\Logs" "%%T\MQL5\Logs" "%%T\Tester\logs") do (
if exist "%%~F" (
echo [CLEAN] %%~F
if "!DRYRUN!"=="1" (
REM 僅列出(不刪除)
forfiles /p "%%~F" /m *.log /d -%DAYS% /c "cmd /c echo @path"
) else (
REM 實際刪除(靜默刪除/抑制錯誤)
forfiles /p "%%~F" /m *.log /d -%DAYS% /c "cmd /c del /f /q @path" 2>nul
)
)
)
)
echo.
echo [DONE] Completed log cleanup.
endlocal
切換方法:驗證時請使用 DRYRUN=1(僅列出)。執行刪除時,請將其變更為 DRYRUN=0 並重新儲存。您不需要取消/新增行註釋。
A-2 指定固定 ID 路徑(單一終端機)
此為針對特定終端機 ID(單一環境)的簡潔版本。請將 xxxxxxx 替換為您的 ID。
@echo off
REM ===== MT5 日誌自動刪除(批次檔版/固定 ID&一鍵切換) =====
setlocal enabledelayedexpansion
set "DAYS=30"
set "DRYRUN=1" REM 1=僅列出, 0=刪除
REM 指定 MT5 資料夾中的日誌資料夾(替換 ID)
set "LOGS_PATH=C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs"
set "EXPERTS_LOGS=C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs"
set "TESTER_LOGS=C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"
echo [INFO] DAYS=%DAYS% / DRYRUN=%DRYRUN%
for %%F in ("%LOGS_PATH%" "%EXPERTS_LOGS%" "%TESTER_LOGS%") do (
if exist "%%~F" (
echo [CLEAN] %%~F
if "%DRYRUN%"=="1" (
forfiles /p "%%~F" /s /m *.log /d -%DAYS% /c "cmd /c echo @path"
) else (
forfiles /p "%%~F" /s /m *.log /d -%DAYS% /c "cmd /c del /f /q @path" 2>nul
)
)
)
echo [DONE] Completed log cleanup.
endlocal
A-3 最小設定(無 DRYRUN・立即刪除)
立即刪除的最小範例(未經驗證)。請小心誤刪。
@echo off
REM 指定 MT5 資料夾中的日誌資料夾
set LOGS_PATH="C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs"
set EXPERTS_LOGS="C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs"
set TESTER_LOGS="C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"
REM 刪除早於 30 天的檔案
forfiles /p %LOGS_PATH% /s /m *.log /d -30 /c "cmd /c del @file"
forfiles /p %EXPERTS_LOGS% /s /m *.log /d -30 /c "cmd /c del @file"
forfiles /p %TESTER_LOGS% /s /m *.log /d -30 /c "cmd /c del @file"
方法 B:使用 PowerShell(.ps1)自動刪除
B-1 建議:使用 $DryRun 旗標切換(支援多個終端機)
PowerShell 可以使用 -WhatIf 安全地執行模擬執行(Dry Run)。只需將 $DryRun 切換為 $true/$false 即可操作。
# ===== MT5 日誌自動刪除(PowerShell 版/多個終端機&一鍵切換) =====
# 建議以管理員權限執行。請根據需要調整 $Days / $DryRun。
$Days = 30
$DryRun = $true # $true=僅列出(不刪除), $false=實際刪除
$cutoff = (Get-Date).AddDays(-$Days)
$dataRoot = Join-Path $env:APPDATA 'MetaQuotes\Terminal'
Write-Host "[INFO] Delete logs older than $Days days"
Write-Host "[MODE] DryRun=$DryRun"
Write-Host "[ROOT] $dataRoot`n"
$terminals = Get-ChildItem -Path $dataRoot -Directory -ErrorAction SilentlyContinue
foreach ($t in $terminals) {
$folders = @(
Join-Path $t.FullName 'Logs'
Join-Path $t.FullName 'MQL5\Logs'
Join-Path $t.FullName 'Tester\logs'
)
foreach ($folder in $folders) {
if (Test-Path $folder) {
Write-Host "[CLEAN] $folder"
$targets = Get-ChildItem -LiteralPath $folder -Filter *.log -File -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -lt $cutoff }
if ($DryRun) {
$targets | ForEach-Object { Write-Host $_.FullName }
} else {
$targets | Remove-Item -Force -ErrorAction SilentlyContinue
}
}
}
}
Write-Host "`n[DONE] Completed log cleanup."
B-2 指定固定 ID 路徑(單一終端機)
此版本僅針對特定 ID。請將 xxxxxxx 替換為您的 ID。
# ===== MT5 日誌自動刪除(PowerShell 版/固定 ID&一鍵切換) =====
$Days = 30
$DryRun = $true
$limit = (Get-Date).AddDays(-$Days)
$folders = @(
"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs",
"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs",
"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"
)
Write-Host "[INFO] DAYS=$Days / DryRun=$DryRun"
foreach ($folder in $folders) {
if (Test-Path $folder) {
Write-Host "[CLEAN] $folder"
$targets = Get-ChildItem -Path $folder -Filter *.log -File -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -lt $limit }
if ($DryRun) {
$targets | ForEach-Object { Write-Host $_.FullName }
} else {
$targets | Remove-Item -Force -ErrorAction SilentlyContinue
}
}
}
Write-Host "[DONE] Completed log cleanup."
B-3 最小設定(立即刪除)
立即刪除的最小範例(未經驗證)。請小心誤刪。
$days = 30
$limit = (Get-Date).AddDays(-$days)
$folders = @(
"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Logs",
"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\MQL5\Logs",
"C:\Users\Administrator\AppData\Roaming\MetaQuotes\Terminal\xxxxxxx\Tester\logs"
)
foreach ($folder in $folders) {
Get-ChildItem -Path $folder -Filter *.log | Where-Object { $_.LastWriteTime -lt $limit } | Remove-Item -Force
}
使用任務排程器定期執行
步驟
- 開啟 Windows「任務排程器」。
- 「建立基本任務」→ 輸入名稱(例如:MT5日誌自動刪除)。
- 選擇觸發器(每日/每週。建議在深夜等負載較低時段)。
- 操作=「啟動程式」。
- 批次檔版:程式/指令碼:
cmd.exe
新增引數:/c "C:\scripts\DeleteMT5Logs.bat" - PowerShell 版:程式/指令碼:
powershell.exe
新增引數:-ExecutionPolicy Bypass -File "C:\scripts\DeleteMT5Logs.ps1"
- 批次檔版:程式/指令碼:
- 如有需要,啟用「不論使用者是否登入都要執行」和「使用最高權限執行」(VPS 上建議啟用)。
- 在「條件」中停用與「電源」相關的限制(適用於 VPS 或全天候運作的電腦)。
- 啟用「工作記錄」並確認成功與否(
0x0表示成功)。
安全操作檢查清單
- 刪除目標僅限
.log檔案(不可刪除Bases、History、Profiles等)。 - 首次務必執行模擬執行(Dry Run):批次檔設
DRYRUN=1,PowerShell 設$DryRun=$true。 - 保留天數先設長一點 → 確認無誤後再縮短。
- 使用多個實例(Instance)時,請將所有 ID 下的資料夾都設為目標(本文的指令碼已自動支援)。
- 注意權限不足或路徑錯誤(請使用從「開啟資料夾」複製的實際路徑)。
疑難排解
- 被執行原則封鎖:PowerShell 啟動時請加上
-ExecutionPolicy Bypass。 - 存取被拒:以管理員權限執行/在任務中賦予「最高權限」。
- 找不到目標:再次確認便攜版路徑、多個 ID 下的資料夾、資料夾名稱拼寫。
- 排程未啟動:檢查「上次執行結果(
0x0為成功)」、啟動使用者/條件設定/記錄。
常見問題(FAQ)
- Q. 我應該刪除哪個資料夾中的什麼檔案?
- A. 僅限
Logs、MQL5\Logs和Tester\logs中的.log檔案。請勿刪除Bases、History、Profiles等。 - Q. 保留多少天是安全的?
- A. 建議先從 30 天左右開始,如果沒有問題,可以縮短到 14 天或 7 天。實際操作建議 14〜30 天,開發・驗證建議 7〜14 天。
- Q. 我使用多個 MT5 實例(多個 ID)。可以全部設為目標嗎?
- A. 本文提供的範例會自動掃描
%APPDATA%\MetaQuotes\Terminal\下的所有 ID 資料夾。 - Q. 刪除會影響 EA 或回測結果嗎?
- A. 只會刪除過去的輸出記錄(日誌),不會影響 EA 邏輯或測試結果。
- Q. 我想先確認哪些檔案會被刪除,而不實際刪除,可以嗎?
- A. 您可以將批次檔設為
DRYRUN=1,PowerShell 設為$DryRun=$true,執行後即可僅列出目標檔案。 - Q. 便攜版 MT5 也可以使用嗎?
- A. 可以。請在指令碼中指定便攜版資料夾根目錄下的
Logs/MQL5\Logs/Tester\logs的絕對路徑。
