【问题标题】:F# environment integration (for scripting)F# 环境集成(用于脚本)
【发布时间】:2013-06-14 15:08:03
【问题描述】:

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

我如何与其他程序进行交互,就像在 CMD 或 PowerShell 中一样 例如 RoboCopy 或 iisreset 或 net?

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

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

【问题讨论】:

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


    【解决方案1】:

    您想使用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

    【讨论】:

    • 没有。我不想使用 PowerShell。我想反过来,使用 F# 中的 powerShell 东西。
    • @AK_ 我添加了一个使用 F# 中的 cmdlet 的示例。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您使用 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 下,您还可以将“shebang”添加到 *.fsx 文件并像运行 Python、Perl 等脚本一样运行它们。

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

      【讨论】:

      • 是的。我知道。问题是,我如何在 F# 脚本中使用例如 Robocopy
      • @AK_ 查看我的编辑。我认为你最好的选择是在 NuGet 上找到一些东西——AFAIK,没有人为此创建一个 F# 特定的库。在我不得不实现代码来运行外部进程的几次中,我直接使用了Process
      • @AK_ 我刚刚看到你对 gradbot 的回答的评论——如果你特别想从 F# 调用 PowerShell cmdlet,你应该能够在 F# 中托管一个 PowerShell 进程并很容易地操作/调用 cmdlet . IIRC 在 PowerShell 2.0 SDK 中有一个示例项目(在 C# 中)。
      • 这不是我真正想要的......但这将是一个好的开始......谢谢
      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2020-04-05
      • 1970-01-01
      相关资源
      最近更新 更多