尝试使用以下F#代码捕获Windows命令提示符输出:
let cmd = new Process()
cmd.StartInfo.FileName <- "cmd.exe"
cmd.StartInfo.UseShellExecute <- false
cmd.StartInfo.CreateNoWindow <- true
cmd.StartInfo.RedirectStandardInput <- true
cmd.StartInfo.RedirectStandardOutput <- true
cmd.StartInfo.RedirectStandardError <- true
cmd.Start() |> ignore
let input = cmd.StandardInput
let output = cmd.StandardOutput
let err = cmd.StandardError
input.AutoFlush <- true
input.Write("dir" + Environment.NewLine)
input.Write("exit" + Environment.NewLine)
cmd.WaitForExit()
if not cmd.HasExited then cmd.Kill()
input.Flush()
let result = output.ReadToEnd()
let error = err.ReadToEnd()
printfn "RESULT\n%s\nERROR\n%s" result error
input.Close()
output.Close()
err.Close()
cmd.Dispose()
导致......
RESULT
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Users\{username}\AppData\Local\Temp>dir
C:\Users\{username}\AppData\Local\Temp>exit
ERROR
'dir' is not recognized as an internal or external command,
operable program or batch file.
实际上,对于每个其他命令(例如'{command}' is not recognized...
等),结果都是相同的(cd..
),否则这些命令在手动启动和键入的命令提示符下正常工作。
我做错了什么?
答案 0 :(得分:1)
虽然仍然不清楚为什么使用.StartInfo.Arguments
有效,但使用.StandardInput
执行命令却没有,例如
cmd.StartInfo.Arguments <- "/C dir"
解决难题。
答案 1 :(得分:0)
请查看我的Cronix项目。 也许你会在那里找到答案
https://github.com/aph5nt/cronix/blob/master/tests/Cronix.Tests/ServiceEnviroment.fs