Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Windows 批次檔啟動 Cygwin Shell 執行腳本:環境變數與指令衝突解決

編輯:系統常見問題解答

需在 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"

坑點 1:環境變數未傳遞導致指令找不到

現象:快捷方式啟動正常,批次檔啟動報 command not found: ls。

原因:快捷方式屬性中「開始位置」設為 Cygwin 目錄,且系統 PATH 已包含 D:\cygwin\bin;批次檔啟動的子進程若未繼承正確 PATH,無法找到核心工具。

解決:在批次檔中 明確展開 PATH (如上例 set "PATH=%PATH%;D:\cygwin\bin") 或預先將 Cygwin bin 加入系統/使用者環境變數 PATH。

坑點 2:Windows 內建 find.exe 覆蓋 Cygwin find

現象: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 等外部指令

若腳本呼叫 mysql、mysqldump 等,請確認對應二進制檔已在 Cygwin /usr/bin 或系統 PATH 中,或在腳本開頭 export PATH="/usr/local/mysql/bin:$PATH"。

Copyright © Windows教程網 All Rights Reserved