需在 Windows 排程工作中定時執行 Shell 腳本,透過批次檔啟動 Cygwin 環境是常見做法。但直接啟動 mintty.exe 或 bash.exe 常遇到「找不到 ls/find/mkdir」與「Windows find 指令衝突」兩大坑。
@echo off
d:
cd /d D:\cygwin\bin
rem 關鍵:將 Cygwin bin 目錄加入 PATH (當前進程有效)
set "PATH=%PATH%;D:\cygwin\bin"
mintty.exe -e /bin/bash --login -c "/home/scripts/webFunc.sh"
現象:快捷方式啟動正常,批次檔啟動報 command not found: ls。
原因:快捷方式屬性中「開始位置」設為 Cygwin 目錄,且系統 PATH 已包含 D:\cygwin\bin;批次檔啟動的子進程若未繼承正確 PATH,無法找到核心工具。
解決:在批次檔中 明確展開 PATH (如上例 set "PATH=%PATH%;D:\cygwin\bin") 或預先將 Cygwin bin 加入系統/使用者環境變數 PATH。
現象:Shell 腳本中使用 find 參數格式與 Windows find.exe 不符,報「參數錯誤」。
解決:腳本中使用完整路徑 /usr/bin/find,或調整 PATH 讓 Cygwin bin 優先順序高於 %SystemRoot%\System32 (不建議,可能影響系統指令)。
@echo off
setlocal
set "CYGWIN_ROOT=D:\cygwin"
set "SCRIPT_PATH=/home/scripts/webFunc.sh"
rem 確保 Cygwin 指令優先
set "PATH=%CYGWIN_ROOT%\bin;%PATH%"
rem 以 login shell 執行腳本,載入完整環境
"%CYGWIN_ROOT%\bin\mintty.exe" -e /bin/bash --login -c "%SCRIPT_PATH%"
endlocal
若腳本呼叫 mysql、mysqldump 等,請確認對應二進制檔已在 Cygwin /usr/bin 或系統 PATH 中,或在腳本開頭 export PATH="/usr/local/mysql/bin:$PATH"。