Laden...

Wie in einer Installationroutine für einen PC "Process.WaitForExit(...)" behandeln?

Erstellt von CaptainAndre vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.916 Views
C
CaptainAndre Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren
Wie in einer Installationroutine für einen PC "Process.WaitForExit(...)" behandeln?

Hallo zusammen,

ich bin blutiger Anfänger und versuche mir eine Installationsroutine für einen speziellen PC zu basteln. Das scheint auch fast zu funktionieren. Aber in dem Code gibt es fast am Ende einen Punkt der sich "Process.WaitForExit()" nennt und den ich benötige um die Programme sauber abzuarbeiten, aber nicht aktiv einsetzen kann. Ich finde den Fehler nicht. Wer hat einen Tipp für mich was ich falsch mache?

Hier der Code:

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace CCX_Installation
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> Dateiname = new List<string>();
            //FileName.Add(@"G:\AWehner Backup\netscan.exe");
            Dateiname.Add(@"C:\Daten\Software\Crystal-Report\CRRuntime_64bit_13_0_12.msi");
            Dateiname.Add(@"C:\Daten\Software\DataLogic\Aladdin 1.12.0.0_Build_151030.1351\Aladdin 1.12.0.0_Build_151030.1351__Official\aladdin_setup_1.12.0.0_151030.1351_jre.exe");
            Dateiname.Add(@"C:\Daten\Software\DataLogic\USB COM Driver 6.3.0\USBCOMInstaller.msi");
            Dateiname.Add(@"dism");
            Dateiname.Add(@"C:\Daten\Software\Frauenhofer\0_PreSetup\vcredist_x64.exe");
            Dateiname.Add(@"C:\Daten\Software\Frauenhofer\0_PreSetup\\vcredist_x64_8.0.50727.6195.exe");
            Dateiname.Add(@"C:\Daten\Software\vcredist_2013_x64.exe");
            Dateiname.Add(@"C:\Daten\Software\Magnatek\setup.exe");
            Dateiname.Add(@"C:\Daten\Software\MetaPace L-42DT\Windows Driver(Euro Plus)\Drivers\Metapace-L-X_V5.1.07.exe");
            Dateiname.Add(@"C:\Daten\Software\SQLEXPRWT_x64_ENU_2014\setup.exe");
            Dateiname.Add(@"C:\Daten\Software\SQLServer2014Patch\setup.exe");
            Dateiname.Add(@"C:\Daten\Software\npp.7.3.1.Installer.x64.exe");
            Dateiname.Add(@"powershell");

            List<string> Argument = new List<string>();
            Argument.Add("/quiet /passive");
            Argument.Add("/MSI /S /norestart");
            Argument.Add("/passive /norestart");
            Argument.Add("/online /enable-feature /featurename:netfx3 /all /source:C:\\Daten\\Framework /limitaccess");
            Argument.Add("/Passive");
            Argument.Add("/Q");
            Argument.Add("/Install /Passive /norestart");
            Argument.Add("/passive /norestart");
            Argument.Add("/MSI /S /norestart");
            Argument.Add("/Action=Install /IAcceptSQLServerLicenseTerms /Role=AllFeatures_WithDefaults /InstanceName=SQLEXPRESS /QS /SecurityMode=SQL /SAPWD=H!Ida!");
            Argument.Add("/Action=Patch /AllInstances /IACCEPTSQLSERVERLICENSETERMS /QS");
            Argument.Add("/S");
            Argument.Add("Set-ExecutionPolicy unrestricted");

            try
            {
                ProcessStartInfo P = new ProcessStartInfo();
                
                foreach (string InstFile in Dateiname)
                {
                    P.FileName = InstFile;
                    //Install.StartInfo.FileName = InstFile;
                }

                foreach (string Command in Argument)
                {
                    P.Arguments = Command;
                }
                //Install.Verb = "runas";
                Process.Start(P);
                Process.WaitForExit(P);
            }

            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }
}

Vielen Dank schon mal für eure Hilfe.

André

M
33 Beiträge seit 2012
vor 6 Jahren

Öhm.....

vll. stehe ich ja aufm Schlauch aber wenn das dein Code ist startest du
genau einen Prozess und zwar die "powershell" mit
dem argument "Set-ExecutionPolicy unrestricted"

Oder hast du den Code fürs Forum verändert ?!?

mfg

Mr.Wasabi

Falls fallend du vom Dach verschwandest, brems bevor du Unten landest.

C
CaptainAndre Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

*hust*

Nein, da habe ich nichts geändert. Jetzt wird es interessant.
Ich meine, wenn ich mir die Liste "List<string> Argument spare, kann ich die Programme der Reihe nach aufrufen und WaitForExit einsetzen. Ich kann das nur gerade nicht überprüfen.
Muss vielleicht der Punkt "ProcessStartInfo" in die ForEach-Schleife rein?

5.657 Beiträge seit 2006
vor 6 Jahren

Hi CaptainAndre,

was genau bedeutet "kann ich nicht aktiv einsetzen"?

Ansonsten solltest du mal mit dem Debugger durch deinen Code gehen, so wie es ist, kann es nicht wie gewünscht funktionieren. Siehe [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Weeks of programming can save you hours of planning

C
CaptainAndre Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

Du sagst, es kann nicht funktionieren. Hast du auch einen Vorschlag wie ich es zum Funktionieren bringe?

M
33 Beiträge seit 2012
vor 6 Jahren

Hey CaptainAndre,

wenn man dein Programm auf das kürzt was wirklich im Moment wirklich macht,
sähe es so aus

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace CCX_Installation
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ProcessStartInfo P = new ProcessStartInfo();
                P.FileName = "powershell";
                P.Arguments = "Set-ExecutionPolicy unrestricted";
                Process.Start(P);
                Process.WaitForExit(P);
            }

            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }
}

Du hast zwar eine Liste mit allen Programmen die du ausführen willst und
auch eine Liste mit allen Argumenten die du zum Start angeben willst benutz aber nur
jeweils das letzte Element in den Listen weil du die Properties "FileName" und
"Arguments" immer wieder überschreibst.

Wenn du direkt vor "Process.Start(P);" mal


Console.WriteLine(P.FileName);
Console.WriteLine(P.Arguments);

einfügst wirst du sehen was ich oben beschrieben habe.

Versuch dein Installations-Programm doch mal ohne Listen umzusetzen, denn deren
Arbeitsweise & Verwendung solltest du dir nochmal ansehen !

ich bin blutiger Anfänger und versuche mir eine Installationsroutine für einen speziellen PC zu basteln

Auch wenn der Zugang zu C# einfach scheint sollte man sich vor Augen führen das
es eine Programmiersprache ist und nichts mit Basteln zu tun hat.

Bitte lies dich in die Grundlagen der Sprache ein !

mfg

MrWasabi

Falls fallend du vom Dach verschwandest, brems bevor du Unten landest.

771 Beiträge seit 2009
vor 6 Jahren

Hi,

warum liest du nicht einfach eine Batch-Datei per File.ReadAllText() ein?
Alternativ die Datei als Text-Resource ins Projekt einfügen und daraus lesen.
Aber die einzelnen Zeilen per List.Add() einzufügen ist wirklich die schlechteste Wahl.

D
985 Beiträge seit 2014
vor 6 Jahren

Eines der Kernprobleme ist schon mal die getrennte Speicherung von Dateiname und Argument. Das ist nicht nur umständlich für die Wartung sondern provoziert auch noch solche Blüten mit den beiden foreach Schleifen.

Das kann man mit einer kleinen Klasse (Filename, Argument als Eigenschaften) wunderbar lösen.

Absolute Pfade sind auch immer ein Quell des Übels.

Wenn ich mir das insgesamt ansehe, dann wäre dies Problem mit einer simplen Batch-Datei besser gelöst.

Ansonsten gibt es auch Setup-Generatoren die das wesentlich besser machen (z.B. InnoSetup um nur mal eins zu nennen).

F
10.010 Beiträge seit 2004
vor 6 Jahren

Oder gleich chocolatey nehmen