經過多次試驗和錯誤,結果證明這是可能的。我設計了以下內容:
@(set /p =-- < nul & type "%~f0") | runhaskell & exit /b
main = putStrLn "Hello, I am a Windows batch file."
這個機制的唯一缺點是錯誤消息包含通過創建一個臨時文件(用的東西叫)runhaskell
的名稱。
這裏是如何工作的完整說明:
set /p =-- < nul
輸出--
(和兩個不相干的空格)不能跟着一個換行符。這是這樣工作的:
set /p ANSWER=Please enter answer:
打印Please enter answer:
沒有換行符,等待用戶輸入,並將其放入環境變量ANSWER
。
< nul
就好像用戶沒有輸入任何東西一樣。
- 作爲一個(未公開的?)特殊情況,可以省略環境變量名稱,然後不設置環境變量。
"%~f0"
是當前批處理文件的名稱。
- 因此
set /p =-- < nul & type "%~f0"
輸出當前批處理文件,但第一行註釋掉(解釋爲Haskell代碼時)。
- 我們將其編碼爲
runhaskell
,它(無法解釋?)將其stdin解釋爲非文字(!)Haskell代碼。
- 就像問題中的UNIX版本一樣,這裏假設
runhaskell
位於當前的PATH
。
- 最後,
exit
可以確保第一線後一切都沒有由Windows批處理文件解釋看出,和exit /b
可以確保我們只退出這個腳本,沒有任何周邊cmd.exe
殼。
- 而領先的
@
確保在運行此腳本時所有這些亂碼不是echo
。
(我還沒有找到一種方法來爲文字Haskell代碼做同樣的事情;但是我目前沒有這種需要。)
+1了很不錯的想法,但我會接受我自己的答案,因爲我希望有一個單一的文件解決方案,因此沒有額外的' - 。bat'文件。 –