3

我每隔几秒钟运行一个批处理文件,以使用以下代码与服务器进行时间同步:

Process process = new Process();

process.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);

process.StartInfo.FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "cmd.exe");
process.StartInfo.Arguments = @"/C C:\TimeSync.bat";
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UserName = "username";

SecureString pwd = new SecureString();

Char[] pwdCharacters = "password".ToCharArray();
foreach (char t in pwdCharacters)
{
    pwd.AppendChar(t);
}

process.StartInfo.Password = pwd;

process.Start();
string output = process.StandardOutput.ReadToEnd();

问题是它会在屏幕上闪烁我不想要的命令窗口。我怎样才能防止这种情况?

我见过的一种行为是,如果我运行相同的代码UseShellExecute = true并且不提供用户名和密码,那么命令窗口不会闪烁。

所以基本上我想使用 c# 代码作为不同的用户静默运行 .bat 文件。

4

4 回答 4

1

因为您传递的是用户名和密码,所以不考虑 CreateNoWindow 参数。这是 Windows 中的一个功能(即错误)。这是五年前的连接详细信息:

http://connect.microsoft.com/VisualStudio/feedback/details/98476/cmd-windows-shows-using-process-with-createnowindow-when-using-username-password-option

Process.Start() 在用户提供用户名和密码的情况下调用 advapi32.dll 的 CreateProcessWithLogonW,并且 CreateProcessWithLogonW 总是打开一个新窗口。不幸的是,这种行为没有解决方法

此处提供了对不创建窗口选项的出色概述:http: //blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx ,它还指出了有关此主题的 msdn 文档中的错误.

在这个 stackoverflow 答案中有一个很好的概述: 如何在运行批处理文件时隐藏 cmd 窗口?

最后,我认为你想创建一个单独的小应用程序,你只调用一次,它作为升级用户一直运行。然后,它可以按照您想要的频率执行时间同步,方式与上述相同,但无需指定用户名和密码。因此,在应用程序的整个持续时间内,控制台窗口只会“闪烁”一次。

希望这有助于磅

于 2011-01-23T11:25:03.720 回答
1

更改您的线路:

process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;

 process.StartInfo.WindowStyle =
 ProcessWindowStyle.Hidden;

这将隐藏窗口并且从不显示它。

希望有帮助!

菲尔

于 2011-03-09T10:33:02.527 回答
0

您是否尝试仅指定:

process.StartInfo.CreateNoWindow=true;

?

于 2011-01-10T19:44:28.987 回答
0

你可以使用模拟。我已经编写了一个模拟类,它实现了IDisposable接口并且使用起来相当简单,我希望如此。

于 2011-01-10T19:45:02.453 回答