2

我喜欢 F#,我想通过编写一些脚本来自动化一些烦人的任务来练习一下。

我如何与其他程序进行交互,就像我可以从 CMD 或 PowerShell(例如 RoboCopy 或 iisreset 或 net)一样?

我知道我可以自己做,System.Diagnostics.Process但很难做对(返回码、标准流等)。

必须有一个图书馆,有什么建议吗?

4

3 回答 3

6

您想使用System.Management.Automation命名空间。下面是从 F# 运行一些 cmdlet 的示例。

// C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0
open System.Management.Automation
open System.Management.Automation.Runspaces;

let runSpace = RunspaceFactory.CreateRunspace()
runSpace.Open()
let pipeline = runSpace.CreatePipeline()

let getProcess = new Command("Get-Process")
pipeline.Commands.Add(getProcess)

let sort = new Command("Sort-Object")
sort.Parameters.Add("Property", "VM")
pipeline.Commands.Add(sort)

// Identical to the following PowerShell command line:
// PS > Get-Process | Sort-Object -Property VM | select ProcessName

let output = pipeline.Invoke()
for psObject in output do
    psObject.Properties.Item("ProcessName").Value.ToString()
    |> printfn "%s"

您还可以使用 F# 构建 cmdlet 并使用 PowerShell 移动数据。查看Visual Studio F# 团队博客上的这篇文章。这是关于如何在 F# 中编写 Cmdlet 的一个很好的示例。您也可以将 F# 嵌入 PowerShell,但通常最好制作 Cmdlet。

Cmdlet MSDN 参考
使用 Windows PowerShell 编写脚本

于 2013-06-14T15:59:23.973 回答
3

Fake有一个 ExecProcess 任务可能会有所帮助。您也可以查看 Fake 源以获得更多想法。

于 2013-06-14T15:51:57.243 回答
2

如果您使用Developer Command Prompt for VS2012(在开始菜单 -> 程序 -> Microsoft Visual Studio 2012 -> Visual Studio 工具下可用fsi),则路径中已经包含 (F# Interactive)。例如:

C:\Program Files (x86)\Microsoft Visual Studio 11.0>fsi

Microsoft (R) F# Interactive version 11.0.60315.1
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> #quit;;

C:\Program Files (x86)\Microsoft Visual Studio 11.0>

您可以创建 F# 脚本文件——它们使用*.fsx文件扩展名——然后使用fsi. 在 OSX、FreeBSD 和 Linux 上的 Mono 下,您还可以向*.fsx文件添加“shebang”并像运行 Python、Perl 等脚本一样运行它们。

编辑:就运行外部程序而言,NuGet 上有一些库可以简化这一点—— cmd是我发现的第一个。它适用于 C#,但实现一些包装函数以使其更容易从 F# 中使用应该很简单。

于 2013-06-14T15:30:11.013 回答