F#执行Shell

F#执行Shell

在F#中,可以使用System.Diagnostics.Process命名空间来执行Shell命令。以下是几种执行Shell命令的方式。

使用System.Diagnostics.Process.Start方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
open System.Diagnostics

let executeCommand (command: string) =
let processStartInfo = new ProcessStartInfo("cmd.exe", sprintf "/C %s" command)
processStartInfo.RedirectStandardOutput <- true
processStartInfo.UseShellExecute <- false
processStartInfo.CreateNoWindow <- true

let process = Process.Start(processStartInfo)
let output = process.StandardOutput.ReadToEnd()

process.WaitForExit()
output

let result = executeCommand "dir"
printfn "%s" result

使用System.Diagnostics.Process.Start方法

获取标准输出和错误输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
open System.Diagnostics

let executeCommand (command: string) =
let processStartInfo = new ProcessStartInfo("cmd.exe", sprintf "/C %s" command)
processStartInfo.RedirectStandardOutput <- true
processStartInfo.RedirectStandardError <- true
processStartInfo.UseShellExecute <- false
processStartInfo.CreateNoWindow <- true

let process = Process.Start(processStartInfo)
let output = process.StandardOutput.ReadToEnd()
let error = process.StandardError.ReadToEnd()

process.WaitForExit()
(output, error)

let (output, error) = executeCommand "dir"
printfn "Output:\n%s" output
printfn "Error:\n%s" error

使用System.Diagnostics.Process

直接执行命令并获取输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
open System.Diagnostics

let executeCommand (command: string) =
let process = new Process()
process.StartInfo.FileName <- "cmd.exe"
process.StartInfo.Arguments <- sprintf "/C %s" command
process.StartInfo.UseShellExecute <- false
process.StartInfo.RedirectStandardOutput <- true

process.Start()
let output = process.StandardOutput.ReadToEnd()
process.WaitForExit()
output

let result = executeCommand "dir"
printfn "%s" result

使用FSharp.SystemCommand

1
2
3
4
5
6
7
8
9
open FSharp.SystemCommand

let executeCommand (command: string) =
Command.create command
|> Command.run
|> Command.output

let result = executeCommand "dir"
printfn "%s" result

请确保已将FSharp.SystemCommand库添加到项目引用中。

使用Suave.Process

1
2
3
4
5
6
7
8
9
open Suave.Process

let executeCommand (command: string) =
command
|> Shell.exec
|> Shell.stdout

let result = executeCommand "dir"
printfn "%s" result

请确保已将Suave.Process库添加到项目引用中。

使用外部命令包装器

Fake

1
2
3
4
5
6
7
8
open Fake

Target "ExecuteCommand" (fun _ ->
let result = Shell.ExecRead "dir" |> String.concat "\n"
printfn "%s" result
)

RunTargetOrDefault "ExecuteCommand"

Paket.CommandRunners

在F#脚本中引入Paket.CommandRunners命名空间,并使用相关函数来执行Shell命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
open System
open System.IO
open Paket.CommandRunners

let executeCommand (command: string) =
let runner = CommandRunners.createProcessRunner()
let output, exitCode = runner.RunCommand(command, "")

match exitCode with
| 0 -> output
| _ -> sprintf "Command failed with exit code %d:\n%s" exitCode output

let result = executeCommand "dir"
printfn "%s" result

在上述示例中,我们创建了一个CommandRunners.createProcessRunner()来创建一个进程托管器。然后使用RunCommand方法执行Shell命令,并获取输出和退出码。

请注意,Paket.CommandRunners会自动下载所需的依赖项,并将其复制到正确的位置。

这是使用Paket.CommandRunners在F#中执行Shell命令的方式。你可以根据实际需求进行调整,并使用适当的参数和选项来定制命令执行过程。


F#执行Shell
https://blog.qingyi-studio.top/2023/09/10/F-Sharp执行Shell/
作者
Grey-Wind
发布于
2023年9月10日
更新于
2024年8月27日
许可协议