所以,自从我不得不在VB.NET中编码并且我真的生锈以来已经好几年了。我正在尝试将bcedit.exe的输出写入我打算稍后阅读的文件。这是在x64系统上,我需要以管理员身份运行该命令。除了没有写入文件外,工作正常。
这是我到目前为止的内容:
Private Sub BCDEdit(strWhich As String)' This sub runs the Windows bcdedit program, with a paramater, edit the boot.ini file.
Dim p As System.Diagnostics.Process
Dim pStartInfo As System.Diagnostics.ProcessStartInfo
pStartInfo = New System.Diagnostics.ProcessStartInfo()
With pStartInfo
.FileName = Environment.SystemDirectory.ToString() & "\bcdedit.exe"
.Verb = "runas"
.Arguments = strWhich
.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
.UseShellExecute = True
End With
p = System.Diagnostics.Process.Start(pStartInfo)
p.WaitForExit()
End Sub
我用:
来调用subBCDEdit("> " & Environment.GetEnvironmentVariable("TEMP") & "\DUMP.tmp".ToString())
似乎有一半的斗争与.UseShellExecute
的值有关,我需要将其设置为True
以便命令提示符保持隐藏状态,但是,如果我将其设置为{{ 1}}我可以稍微使用False
并将其读取到内存中(尽管我仍然没有得到输出的实际管道,但也没有。)
从提升的命令提示符执行.RedirectStandardOutput
工作正常,因此在翻译中丢失了一些东西。
任何?
答案 0 :(得分:2)
我怀疑重定向修饰符不会被识别为参数。您可能必须通过重定向捕获它并将其输出到文件的标准输出流来手动重定向输出。
此外,您似乎已将其向后移动,UseShellExecute
应该为false以使用System.Diagnostics.ProcessWindowStyle.Hidden
。根据{{3}}
这是一个简单的例子:
Dim newprocess As New Process()
With newprocess.StartInfo
.CreateNoWindow = True
.FileName = Environment.SystemDirectory.ToString() & "\bcdedit.exe"
.Verb = "runas"
.RedirectStandardOutput = True
.UseShellExecute = False
End With
'Change the False to True to append instead of overwrite
Dim sw As New IO.StreamWriter(Environment.GetEnvironmentVariable("TEMP") & "\DUMP.tmp", False)
newprocess.Start()
Dim sr As IO.StreamReader = newprocess.StandardOutput
While Not sr.EndOfStream
sw.WriteLine(sr.ReadLine)
End While
sw.Close()
sr.Close()
不确定为什么'runas'不能用于该应用程序,但我对此做了更多思考并找到了可行的解决方案:
Dim newprocess As New Process()
With newprocess.StartInfo
.CreateNoWindow = True
.Verb = "runas"
.FileName = "cmd"
.Arguments = "/c bcdedit > " & Environment.GetEnvironmentVariable("TEMP") & "\DUMP.tmp"
.UseShellExecute = True
End With
newprocess.Start()
基本上,它在管理员模式下使用命令处理器以标准输出修饰符('>')运行bcdedit。