当作为.NET进程启动时,CMD不起作用

时间:2015-03-22 15:47:30

标签: .net process cmd f# command-prompt

尝试使用以下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..),否则这些命令在手动启动和键入的命令提示符下正常工作。

我做错了什么?

2 个答案:

答案 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