Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在批处理文件中嵌入Haskell(适用于Windows的Haskell)?_Windows_Batch File_Haskell_Cmd_Shebang - Fatal编程技术网

如何在批处理文件中嵌入Haskell(适用于Windows的Haskell)?

如何在批处理文件中嵌入Haskell(适用于Windows的Haskell)?,windows,batch-file,haskell,cmd,shebang,Windows,Batch File,Haskell,Cmd,Shebang,在安装了GHC的类UNIX系统上,我可以创建一个包含以下内容的文件 #!/usr/bin/env runhaskell main = putStrLn "Hello, I am a UNIX script file." 使文件可执行,然后执行给定的Haskell代码 如何在Windows.bat文件中执行等效操作 最好不要创建额外的文件,不要设置环境变量,如果使用UNC路径或包含空格的路径访问批处理文件,Haskell名称空间不会受到污染,并且如果Haskell代码包含错误,则会产生合理的行为

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

#!/usr/bin/env runhaskell
main = putStrLn "Hello, I am a UNIX script file."
使文件可执行,然后执行给定的Haskell代码

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


最好不要创建额外的文件,不要设置环境变量,如果使用UNC路径或包含空格的路径访问批处理文件,Haskell名称空间不会受到污染,并且如果Haskell代码包含错误,则会产生合理的行为。

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

@(set /p =-- < nul & type "%~f0") | runhaskell & exit /b
main = putStrLn "Hello, I am a Windows batch file."
@(set/p=--
此机制的唯一缺点是错误消息包含由(被称为)runhaskell创建的临时文件的名称

以下是对其工作原理的完整解释:

  • set/p=--
    输出
    -->
    (和两个不相关的空格),后面没有换行符。其工作原理如下:
    • set/p ANSWER=请输入答案:
      打印
      请输入答案:
      不换行,等待用户输入,并将其放入环境变量
      ANSWER
    • 的行为就像用户没有输入任何内容一样
    • 作为(未记录的?)特例,可以省略环境变量名称,然后不设置环境变量
  • “%~f0”
    是当前批处理文件的名称
  • 因此,
    set/p=--
    输出当前批处理文件,但第一行被注释掉(当解释为Haskell代码时)
  • 我们将其导入
    runhaskell
    ,后者(非文档化?)将其stdin解释为非文本(!)Haskell代码。
    • 与问题中的UNIX版本一样,这假设
      runhaskell
      位于当前的
      路径上
  • 最后,
    exit
    确保Windows批处理文件解释器看不到第一行之后的所有内容,
    exit/b
    确保我们只退出此脚本,而不退出任何周围的
    cmd.exe
    shell
  • 在运行这个脚本时,前面的
    @
    确保所有这些胡言乱语都不会被
    echo
    ed

(我还没有找到一种方法可以对识字的Haskell代码执行同样的操作;但我目前不需要这样做。)

只需在您的路径下创建即可

C:\my-tools-path>copy con --.bat
runhaskell %1
^Z
要创建自动可执行的haskell程序,请编写如下代码

-- "%~f0"
main = putStrLn "Merry Christmas!"
没有错误,没有临时文件

)()

(您可以添加您的程序参数。)

runhaskell %1 %2 ...


)

+1非常好的主意,但是我会接受我自己的答案,因为我想要一个单一的文件解决方案,所以没有额外的
--.bat
文件。
-- "%~f0" %1 %2 ...