执行 F# 脚本

15

我试着用F#编写小的控制台脚本来练习,而不是像往常一样编写shell脚本/批处理文件。我目前使用"fsi script.fsx [args]"来运行它们。有没有办法将这些fsx文件与fsi关联起来,以便可以直接运行它们,例如"script.fsx [args]"?


3
虽然编写简单的脚本文件并运行它们肯定是一种选择,但我认为如果您使用Visual Studio中的F# Interactive,则学习F#会更容易。您可以通过创建新的“F#脚本”(文件->新建->文件...)开始编写一些代码(以杂乱的顺序)。然后,您可以选择代码的某些部分,通过按[Alt]+[Enter]在F# Interactive窗口中进行评估。 - Tomas Petricek
4
@Tomas - 我认为他的意思是他正在编写这些脚本,作为练习编写真正执行实际任务的代码的方式,同时满足自己的需求(似乎他写了很多脚本)。 - Luke Schafer
Tomas:从你的描述中还有一件事情不太清楚:你仍然需要手动打开F#交互窗口才能使用Alt-Enter技巧。但这真是个好技巧!谢谢! - itowlson
Tomas是对的,使用Visual Studio。F#没有Express版本,但您可以下载Shell,并在其上安装F#。 - Benjol
你看过这个吗?https://stackoverflow.com/questions/27003963/how-to-get-f-scripts-files-and-other-script-languages-to-work-like-exe-cmd - Metal10k
5个回答

12

是的,这是可能的。

这里有两个关键点:

  1. 你需要绑定应用程序来执行“.fsx”扩展名的文件。如何做到这一点可能在操作系统版本之间略有不同(我过去只是直接编辑注册表来完成这个操作,所以我无法提供通用的解决方案);确保要执行的命令包括脚本参数(如%*),使绑定的注册表项中的shell\open\command条目看起来像这样:

    "c:\Program Files\FSharp-1.9.9.9\bin\fsi.exe" "@%1" %*

    更多细节请参见Gradbot的回答。

  2. 你可能想要将扩展名“.fsx”添加到PATHEXT环境变量中,以便CMD.exe即使没有指定脚本的扩展名也可以找到该脚本。警告:如果你关心系统的安全性,请重新考虑此步骤 - 在默认的Windows XP和旧版系统中,VBScripts已经注册以提供类似的功能,这曾经被病毒制作者利用过(我不知道这在Vista或Windows 7上是否仍然存在)。

3
在命令行中(至少在我尝试过的所有Windows版本中),您也可以使用“ftype”和“assoc”命令来完成第一步。 - brianary

4
由于目前还没有答案,我会尝试将我的早期评论转化为一个带有更多细节的答案。
我刚刚尝试创建了一个标准的Windows关联,以便自动在fsi.exe中打开*.fsx文件,并且它可以正常工作 - 当您打开fsx文件时,它会运行F# Interactive,并自动评估文件的内容。这相当于运行以下命令:
> fsi.exe test.fsx

然而,我认为使用Visual Studio中的F# Interactive学习F#要容易得多。即使您没有许可证,也可以使用带有免费F#插件的Visual Studio Shell。我认为SharpDevelop也提供类似的集成(但可能存在一些限制)。
最简单的方法是创建一个新的“F#脚本”(文件 -> 新建 -> 文件...),然后以任意顺序编写一些代码。然后,您可以选择代码的某个部分,并通过按下[Alt] + [Enter]在F# Interactive窗口中评估它。您首先需要打开F# Interactive窗口,可以使用[Ctrl] + [Alt] + [F]完成,或者您可以在视图 -> 其他窗口菜单项中找到它。

我认为大多数 F# 的网络讲座都使用 F# 交互式,因此如果您查看其中一些讲座,您应该能够很好地了解如何使用它。例如,可以在www.fsharp.netHow Do I?视频或Channel 9 的 F# 视频中查看。


1
我认为他正试图用F#脚本替换批处理文件(这就是他问是否有一种方法只需指向一个fsx文件)。感谢您的答复。 - Amir

3
我知道这很老套,但是......虽然我完全赞同每个人都建议采用基于REPL的开发方式,但如果你发现自己编写了一个不错的可重用脚本,那么在Linux和MacOS上,以下方法效果很好。将*.fsx脚本放入您的~/bin文件夹或其他地方,并像对待其他脚本一样使用惯例的shebang技巧:
首先制作你的脚本。
#!/usr/bin/env dotnet fsi
    
printfn $"1 + 1 = {1 + 1}"

将其设置为可执行并运行

chmod 755 foo.fsx
$ ./foo.fsx 
1 + 1 = 2

1
仅作一笔记录,在我的 Debian 机器上,我需要使用 #!/usr/bin/env -S dotnet fsi。 (“‘-S’选项指示‘env’将单个字符串拆分为多个参数。”) - Redark

2

如果你搜索“在Ubuntu上执行F#脚本”,那么你就来到了这里。

要在Mac/Linux上执行 .fsx 脚本,输入 fsharpi yourScript.fsx,对于Windows用户,请输入:fsi yourScript.fsx


1

这里有一篇关于在Windows 7中设置文件关联的教程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接