F#环境集成(用于脚本)

时间:2013-06-14 15:08:03

标签: .net powershell f# cmd f#-scripting

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

我如何以与CMD或PowerShell相同的方式与其他程序进行交互 例如RoboCopy或iisreset或net?

我知道我可以用System.Diagnostics.Process自己做,但很难做到正确(返回代码,标准流等)。

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

3 个答案:

答案 0 :(得分:5)

您想使用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#团队博客上查看this post。这是如何在F#中编写Cmdlet的一个很好的例子。你也可以embed F# into PowerShell,但一般来说最好制作Cmdlet。

Cmdlet MSDN reference
Scripting with Windows PowerShell

答案 1 :(得分:3)

Fake有一个可能有帮助的ExecProcess任务。你也可以查看假源以获得更多想法。

答案 2 :(得分: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#。