2013-06-14 3 views
1

Мне нравится F #, и я хочу немного попрактиковаться, написав несколько сценариев для автоматизации некоторой раздражающей задачи.Интеграция среды F # (для скриптов)

Как я могу взаимодействовать с другими программами так же, как я могу делать с CMD или PowerShell , например RoboCopy или iisreset или net?

Я знаю, что могу сделать это сам с System.Diagnostics.Process, но это сложно сделать правильно (коды возврата, стандартные потоки и т. Д.).

Должна быть библиотека для этого, любые предложения?

ответ

5

Вы хотите использовать пространство имен System.Management.Automation. Вот пример запуска некоторых командлетов из F #.

// 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 # и использовать PowerShell для перемещения данных. Проверьте this post в блоге Team Visual Visual F #. Это хороший пример того, как написать командлет в F #. Вы можете также embed F# into PowerShell, но в целом лучше сделать Командлеты.

Cmdlet MSDN reference
Scripting with Windows PowerShell

+0

нет. Я не хочу использовать PowerShell. Я хочу по-другому, использовать материал PowerShell, от F #. –

+0

@AK_ Я добавил пример использования командлетов из F #. – gradbot

+0

+1 это интересное направление ... –

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. В Mono на OSX, FreeBSD и Linux вы также можете добавить «shebang» в файлы *.fsx и запустить их так же, как и скрипт Python, Perl и т. Д.

EDIT: Для запуска внешних программ для NuGet есть несколько библиотек, которые упрощают это: cmd - это первое, что я нашел. Это для C#, но должно быть просто реализовать некоторые функции-обертки, чтобы было проще использовать F #.

+0

да. я знаю. Вопрос в том, как я могу использовать, например, Robocopy из скрипта F # –

+0

@AK_ См. Мое редактирование. Я думаю, ваш лучший выбор - найти что-то на NuGet - AFAIK, для этого никто не создал библиотеку F #. Я использовал 'Process' непосредственно несколько раз, когда мне приходилось внедрять код для запуска внешнего процесса. –

+1

@AK_ Я только что видел ваш комментарий к ответу gradbot - если вы специально хотите вызвать командлеты PowerShell из F #, вы должны иметь возможность размещать процесс PowerShell внутри F # и легко манипулировать/вызывать командлеты. IIRC был пример проекта для этого (в C#) в PowerShell 2.0 SDK. –

3

Fake имеет задачу ExecProcess, которая может помочь. Также вы можете посмотреть источник Fake для получения дополнительных идей.

Смежные вопросы