我喜欢F#,我想通过编写一些脚本来练习一些烦人任务的自动化。
我如何以与CMD或PowerShell相同的方式与其他程序进行交互 例如RoboCopy或iisreset或net?
我知道我可以用System.Diagnostics.Process
自己做,但很难做到正确(返回代码,标准流等)。
必须有一个图书馆,有什么建议吗?
答案 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。
答案 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等脚本一样运行它们。