Wie setze ich ein Kontrollkästchen über die msiexec-Befehlszeile auf „deaktiviert“?

StackOverflow https://stackoverflow.com/questions/2992006

  •  24-10-2019
  •  | 
  •  

Frage

Ich habe eine MSI (mit WIX erstellt), die über ein Kontrollkästchen verfügt, das an eine benutzerdefinierte Eigenschaft gebunden ist (nennen Sie es MY_PROPERTY).Ich möchte diese MSI über die Befehlszeile ausführen und für diese Eigenschaft 0 (nicht aktiviert) oder 1 (aktiviert) angeben.Mein Skript ermittelt den entsprechenden Wert (basierend auf der Umgebung) und fügt diesen Wert in die msiexec-Befehlszeile ein.Meine Befehlszeile sieht in etwa so aus:

msiexec /i my_installer.msi MY_PROPERTY=$value

Wobei $value je nach Umgebung 1 oder 0 ist.Das Problem besteht darin, dass das Kontrollkästchen immer aktiviert ist, egal welchen Wert ich für MY_PROPERTY in der Befehlszeile eingebe (und die Eigenschaft immer auf 1 gesetzt wird).Die einzige Möglichkeit, das Kontrollkästchen zu deaktivieren, besteht darin, die Eigenschaft nicht anzugeben (sie undefiniert zu lassen).Es ist zu beachten, dass dieses Verhalten unabhängig davon auftritt, ob die Benutzeroberfläche angezeigt wird oder nicht (das Hinzufügen von „/quiet“ zur obigen Befehlszeile ändert dieses Verhalten nicht).

Dieser MSDN-Beitrag scheint darauf hinzudeuten, dass dies ein bekannter „Fehler“ im Windows Installer ist (oder genauer gesagt, welches Autorensystem auch immer die MSI geschrieben hat).Als Lösung wird ein Post-Build-MSI-Hack vorgeschlagen.Ich frage mich, ob jemand auf dieses Problem gestoßen ist und eine bessere Problemumgehung/Lösung gefunden hat.Danke!

Aktualisieren

Ich sehe drei Lösungen für dieses Problem:

  1. Von @Damien: Lassen Sie das Wrapper-Skript die Eigenschaft nicht an msiexec übergeben, wenn ihr Wert 0 ist.Dies macht das Skript komplexer und würde mich wahrscheinlich daran hindern, den Wert eines Kontrollkästchens zu überschreiben, das standardmäßig auf „aktiviert“ gesetzt ist.
  2. Fügen Sie von @Michael Urman eine benutzerdefinierte Aktion hinzu, die die Eigenschaft löscht, wenn ihr Wert Null ist.Dadurch wird die MSI komplexer und ich müsste für jedes Kontrollkästchen in der Benutzeroberfläche eine solche benutzerdefinierte Aktion hinzufügen.
  3. Eine andere Idee besteht darin, die Verwendung von Kontrollkästchen in unseren MSI-Installationsprogrammen einfach zu verbieten und stattdessen Optionsfelder oder Dropdowns für „Wahr/Falsch“-Fragen zu verwenden.Dies schränkt zwar die UI-Optionen für unsere Installationsprogramme ein, ermöglicht aber, dass die Wrapper-Skripte einfach bleiben und keine benutzerdefinierten Aktionen zum „Hacken“ der Eigenschaften erforderlich sind.

Ich tendiere derzeit zu Option 3, obwohl Option 1 wahrscheinlich die beste Antwort auf meine ursprüngliche Frage ist.Irgendwelche Gedanken?

War es hilfreich?

Lösung

So „sollte“ es funktionieren – im Grunde existiert die Eigenschaft erst, wenn ein Benutzer das Kontrollkästchen aktiviert, dann wird sie „gesetzt“ (existiert).Wenn Sie also eine benutzerdefinierte Aktion ausführen möchten, wenn ein Kontrollkästchen aktiviert ist, testen Sie, ob die Eigenschaft als Bedingung für die Ausführung der benutzerdefinierten Aktion vorhanden ist, anstatt nach dem Wert zu suchen, auf den die benutzerdefinierte Requisite festgelegt ist.

Ich denke, der beste Weg, dies über die Befehlszeile zu handhaben, ist das, was Sie bereits erwähnt haben:Wenn Sie möchten, dass das Kontrollkästchen aktiviert ist, geben Sie die benutzerdefinierte Requisite in der Befehlszeile an. Andernfalls wird das Kontrollkästchen nicht aktiviert.

Andere Tipps

Wie Sie festgestellt haben, sind Kontrollkästchen „true“ (aktiviert), wenn die Eigenschaft definiert (nicht leer) ist, und „false“ (deaktiviert), wenn die Eigenschaft nicht definiert (leer) ist.Es hört sich so an, als müssten Sie eine Umgebungszeichenfolge 1 oder 0 in ein Kontrollkästchen „true/false“ konvertieren, wobei die 1 oder 0 in der Befehlszeile übergeben wird.Versuchen Sie es mit einer benutzerdefinierten Aktion zum Festlegen einer Eigenschaft, die Ihre Eigenschaft auf festlegt {} (leer) mit der Bedingung, wann die Eigenschaft bereits vorhanden ist "0".Planen Sie es frühzeitig sowohl in der Install UI- als auch in der Install Execute-Sequenz.

Spätes Update: Bezüglich der Notwendigkeit mehrerer benutzerdefinierter Aktionen, um dies für mehrere Kontrollkästchen zu handhaben, haben Sie die Wahl.Sie können entweder mehrere Set-Property-Aktionen erstellen (Vorteil:leicht zu sagen, was sie tun;kosten:viele von ihnen), oder Sie können eine einzelne codebasierte benutzerdefinierte Aktion erstellen, die dies durchführt Checkbox Tisch für eine Liste der Eigenschaften, aus denen konvertiert werden soll 0 leeren (Vorteil:eine Aktion;kosten:schlecht dokumentierter, benutzerdefinierter Code).Ein zweiter Vorteil des letztgenannten Ansatzes besteht darin, dass Sie mit Ungewöhnlichem umgehen können Value Einstellungen, z. B. ein Kontrollkästchen, das die Eigenschaft festlegen soll 0 wenn überprüft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top