我喜欢 F#,我想通过编写一些脚本来自动化一些烦人的任务来练习一下。
我如何与其他程序进行交互,就像我可以从 CMD 或 PowerShell(例如 RoboCopy 或 iisreset 或 net)一样?
我知道我可以自己做,System.Diagnostics.Process
但很难做对(返回码、标准流等)。
必须有一个图书馆,有什么建议吗?
我喜欢 F#,我想通过编写一些脚本来自动化一些烦人的任务来练习一下。
我如何与其他程序进行交互,就像我可以从 CMD 或 PowerShell(例如 RoboCopy 或 iisreset 或 net)一样?
我知道我可以自己做,System.Diagnostics.Process
但很难做对(返回码、标准流等)。
必须有一个图书馆,有什么建议吗?
您想使用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。
Fake有一个 ExecProcess 任务可能会有所帮助。您也可以查看 Fake 源以获得更多想法。
如果您使用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# 中使用应该很简单。