4

在安装了 GHC 的类 UNIX 系统上,我可以创建一个包含以下内容的文件

#!/usr/bin/env runhaskell
main = putStrLn "Hello, I am a UNIX script file."

使文件可执行,这将执行给定的 Haskell 代码。

如何在 Windows .bat 文件中执行等效操作?

最好不要创建额外的文件,不设置环境变量,如果使用 UNC 路径或包含空格的路径访问批处理文件,它也可以工作,Haskell 命名空间没有被污染,如果 Haskell 代码包含一个合理的行为结果错误。

4

2 回答 2

10

经过多次试验和错误,事实证明这是可能的。我设计了以下内容:

@(set /p =-- < nul & type "%~f0") | runhaskell & exit /b
main = putStrLn "Hello, I am a Windows batch file."

这种机制的唯一缺点是错误消息包含由 (something called by) 创建的临时文件的名称runhaskell

以下是有关其工作原理的完整说明:

  • set /p =-- < nul输出--(和两个不相关的空格)后面没有换行符。这像这样工作:
    • set /p ANSWER=Please enter answer:不带换行符打印Please enter answer:,等待用户输入,并将其放入环境变量中ANSWER
    • < nul就像用户没有输入任何东西一样。
    • 作为(未记录的?)特殊情况,可以省略环境变量名称,然后不设置环境变量。
  • "%~f0"是当前批处理文件的名称。
  • 因此set /p =-- < nul & type "%~f0"输出当前的批处理文件,但第一行被注释掉(当解释为 Haskell 代码时)。
  • 我们通过管道runhaskell将其输入 ,它(未记录?)将其标准输入解释为非文字(!)Haskell 代码。
    • 就像问题中的 UNIX 版本一样,这假设runhaskell在当前的PATH.
  • 最后,exit确保 Windows 批处理文件解释器看不到第一行之后的所有内容,并exit /b确保我们只退出这个脚本,而不是任何周围的cmd.exeshell。
  • 领导@确保echo在运行此脚本时不会编辑所有这些乱码。

(我还没有找到一种方法来对读写 Haskell 代码做同样的事情;但我目前不需要。)

于 2012-12-24T07:14:13.640 回答
4

只需在您的 PATH 下创建

C:\my-tools-path>copy con --.bat
runhaskell %1
^Z

要创建您的自动执行的 haskell 程序,请编写一些类似

-- "%~f0"
main = putStrLn "Merry Christmas!"

没有错误,没有临时文件,...

;)

(您可以添加您的程序参数更改

runhaskell %1 %2 ...

-- "%~f0" %1 %2 ...

)

于 2012-12-24T09:05:18.047 回答