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é
Ö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.
*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?
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
Du sagst, es kann nicht funktionieren. Hast du auch einen Vorschlag wie ich es zum Funktionieren bringe?
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.
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.
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).