2

我遇到了 Windows 更新静默安装的小问题。为什么我需要它?我有用于重新安装 win7 的系统磁盘的位副本(利用 .net 框架、Visual Studio、Java 和 50 多个其他应用程序一次安装)。然后我需要安装一些重要的更新。我在 c# 中编写了小型实用程序,工作正常,除了安装即使使用 startInfo.Arguments = "/quiet/norestart/passive";. 不沉默:我的意思是至少有两个窗口询问我是否需要安装或重新启动选项。

问题在另一个论坛中发言人们如何部署 HOTFIXES .msu 文件? 但解决方案对我来说有点不清楚。有人知道如何解决它吗?再次,startInfo.Arguments = "/quiet/norestart/passive"; 或者startInfo.Arguments = @"/qb!"+ "REBOOT=ReallySuppress"+ @"/qn"; 不工作,并且在链接中解释了原因。 textBox1.Text是一个目录中所有修补程序和更新的位置。

{

        string[] filePaths = Directory.GetFiles(textBox1.Text);
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.CreateNoWindow = true;
        startInfo.UseShellExecute = true;
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        //startInfo.Arguments = "/quiet/norestart/passive";

        for (int i = 0; i < filePaths.Length; i++)
        {
            label1.Text = "Working";
            startInfo.FileName = filePaths[i];
            startInfo.Arguments = @"/qb!"+ "REBOOT=ReallySuppress"+ @"/qn";

            try
            {
                Process.Start(startInfo.FileName).WaitForExit(); 

            }
               catch (Exception exc)
            {
                MessageBox.Show(exc.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
        label1.Text = " Done ";

        }
4

2 回答 2

1

首先,您只是将没有空格的参数链接在一起,因此只传递了一个可能不起作用的参数。尝试

startInfo.Arguments = "/qb! REBOOT=ReallySuppress /qn"
于 2012-05-31T07:19:25.043 回答
0

最后我使用纯 CMD 行绕过它。除例外情况外,无 Windows 的静默安装。

private void button1_Click(object sender, EventArgs e)
    {
        string[] filePaths = Directory.GetFiles(textBox1.Text);
        Process process = new Process();
        process.StartInfo.FileName = "cmd.exe";
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.UseShellExecute = false;
        process.EnableRaisingEvents = false;

        for (int i = 0; i < filePaths.Length; i++)
        {
            if (i == 0) { label1.Text = "Working On first task"; }
            process.StartInfo.Arguments = "/C " + "@" + "\"" + filePaths[i] + "\"" + " /quiet /norestart";
            process.Start();
            process.WaitForExit();
            label1.Text = (100 * i / filePaths.Length).ToString() + " % is done"; 

        }
        label1.Text = "Done";

    }
于 2012-06-02T14:46:01.040 回答