1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Mira_Belle

Beiträge von Mira_Belle

  • Mehrzeilige Tableiste für aktuelle Firefox-Versionen

    • Mira_Belle
    • 21. Mai 2026 um 09:01

    GermanFreme82 Schau Dir doch mal Merci chao's Skript an.
    Beachte mal die Clips, gerade jene mit den angepinnten Tabs.

    Multi Tab Rows
    The best multi-row tabs experience for Firefox. Maximized space usage, intuitive drag & drop, polished interactions, pinned tabs grid, and automatic update…
    merci-chao.github.io


    Er pflegt es z.Z. noch und entwickelt es auch weiter!

    Und wenn es Dir gefällt, also von den Funktionen her, aber Dir das Design nicht so zusagt,
    wir sind hier, und ich denke, da lässt sich mit Sicherheit dann was machen.

  • Profilmanager

    • Mira_Belle
    • 20. Mai 2026 um 22:36

    Mag jemand testen?
    Funktioniert das Skript auch aus einer installierten Nightly oder Beta?
    Und was wichtiger ist, funktioniert es aus einer Portable?

    JavaScript
    // FirefoxQuickStarter.uc.js
    // Das Script erstellt einen Button, der ein Menü zur Auswahl weiterer Instanzen öffnet.
    
    // Source file https://www.camp-firefox.de/forum/thema/xxx
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
      if (!window.gBrowser || !CustomizableUI) return;
    
      const
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
               id = 'aboutprofiles-Start', // Id des Buttons
            label = 'Profil zusätzlich starten', // Bezeichnung des Buttons
      tooltiptext = 'Firefox Profile starten (Auswahl)',
      // Icon-------------------------------------------------------
             icon = 'profile.svg', // [Name.Dateiendung] des Symbols
         iconPath = 'file:///C:/FoxIcons/'; // Pfad zum Ordner der die Icons beinhaltet
    
      /*
    	Vor Verwendung, Pfad auf eigene Umgebung ändern(\ wird durch \\ ersetzt):
    	C:\\Program Files\\Mozilla Firefox\\firefox.exe oder C:\\Program Files\\Firefox Nightly\\firefox.exe
      */
    
      // Standard-Firefox-Profile
      const standardProfiles = [
        {
          name: "Mira",
          exe: "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
          profile: "C:\\Users\\Mira\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\Mira",
          icon: "Finale.svg"
        },
        {
          name: "Testprofil",
          exe: "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
          profile: "C:\\Users\\Mira\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\Testprofil",
          icon: "Finale.svg"
        },
        {
          name: "TEST_24-03-29",
          exe: "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
          profile: "C:\\Users\\Mira\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\yd7mkrc6.TEST_24-03-29",
          icon: "Finale.svg"
        },
        {
          name: "Nightly",
          exe: "C:\\Program Files\\Firefox Nightly\\firefox.exe",
          profile: "C:\\Users\\Mira\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\umilg7ve.Nightly",
          icon: "Nightly.svg"
        }
      ];
    
      // Portable Firefox-Pfade
      const portableProfiles = [
        {
          name: "Portable Version 53.0 💛",
          exe: "C:\\Portable-Firefox\\Firefox_53.0\\Firefox\\firefox.exe",
          profile: "C:\\Portable-Firefox\\Firefox_53.0\\Profilordner",
          icon: "Finale.svg"
        },
        {
          name: "Portable Beta 💙",
          exe: "C:\\Portable-Firefox\\Beta\\Firefox\\firefox.exe",
          profile: "C:\\Portable-Firefox\\Beta\\Profilordner",
          icon: "Beta.svg"
        },
        {
          name: "Portable Nightly 💜",
          exe: "C:\\Portable-Firefox\\Nightly\\Firefox\\firefox.exe",
          profile: "C:\\Portable-Firefox\\Nightly\\Profilordner",
          icon: "Nightly.svg"
        }
      ];
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
      // Alle Profile zusammenführen
      const allProfiles = [...standardProfiles, ...portableProfiles];
    
      // SVG-Kontext-Eigenschaften aktivieren
      if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') === false) {
        Services.prefs.setBoolPref('svg.context-properties.content.enabled', true);
      }
    
      // Button erstellen
      try {
        CustomizableUI.createWidget({
          id: id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: label,
          tooltiptext: tooltiptext,
          onCreated: (button) => {
            button.style.MozContextProperties = 'fill, stroke, fill-opacity';
            button.style.listStyleImage = `url("${iconPath}${icon}")`;
            button.style.minWidth = 'fit-content';
            button.style.color = '#EE3939';
    
            // Menü nach dem Erstellen des Buttons aufbauen
            buildMenu(button);
          }
        });
      } catch (e) {
        console.error("Fehler beim Erstellen des Buttons:", e);
      }
    
      // Funktion zum Aufbau des Menüs
      function buildMenu(button) {
        if (!button || button.querySelector("menupopup")) return;
    
        const menu = document.createElementNS(
          "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
          "menupopup"
        );
        menu.id = `${id}-menu`;
    
        // Für jedes Profil einen Menüeintrag erstellen
        allProfiles.forEach((item) => {
          const menuItem = document.createElementNS(
            "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
            "menuitem"
          );
          menuItem.setAttribute("label", item.name);
          menuItem.setAttribute("class", "menuitem-iconic");
          menuItem.setAttribute("image", `${iconPath}${item.icon}`);
          menuItem.style.listStyleImage = `url("${iconPath}${item.icon}")`;
    
          menuItem.addEventListener("command", () => {
            launch(item);
          });
    
          menu.appendChild(menuItem);
        });
    
        button.appendChild(menu);
    
        // Menü beim Klick auf den Button öffnen
        button.addEventListener("click", (event) => {
          menu.openPopup(button, "after_start", 0, 0, false, false, event);
        });
      }
    
      // Funktion zum Starten des Browsers mit dem ausgewählten Profil
      function launch(item) {
        try {
          const file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          file.initWithPath(item.exe);
    
          const process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
          process.init(file);
    
          let args = [];
          const isFirefox = item.exe.toLowerCase().includes("firefox.exe");
          const isProfilePath = item.profile && (item.profile.includes("\\") || item.profile.includes("/"));
    
          if (isFirefox && isProfilePath) {
            args = ["-profile", item.profile, "-foreground"];
          } else if (isFirefox) {
            args = ["-P", item.profile.split("\\").pop(), "-foreground"];
          }
    
          process.run(false, args, args.length);
        } catch (e) {
          console.error("[FoxStarter]", e);
        }
      }
    })();
    Alles anzeigen

    FoxIcons.zip

  • Profilmanager

    • Mira_Belle
    • 15. Mai 2026 um 12:40

    .DeJaVu

    Kannst Du Autoit?

    Aber Ps kannst Du, da bin ich mir sicher.

    Schreibe doch mal einen neuen FFloader.

    Oder, wenn Du Zugriff auf den Code von Cashy's Loader hast, korrigiere diesen.

    Das Autoitskript könnte ich auch in eine EXE wandeln.

  • Profilmanager

    • Mira_Belle
    • 15. Mai 2026 um 12:08

    Ja, auf diese Idee war ich auch schon gekommen.

    Werde mal schauen, ob Code aus diesem Skript für das Projekt verwertbar ist.

  • Profilmanager

    • Mira_Belle
    • 14. Mai 2026 um 21:37

    Obacht!
    Die portablen Firefoxversionen unterscheiden sich erheblich!
    Beispiel:
    Jene nach der Methode von 2002Andreas

    Code
    C:\Portable-Firefox\Beta
    Darin befindet sich der "Starter"!
    Entweder "FirefoxStarter.exe" oder der "bessere" "MultipleFirefoxLoader.exe".
    Letztere funktioniert auch per aufruf aus dem Skript!
    Ein Danke an @Endor 
    Dann noch die "Installation", also die Programmdateien.
    C:\Portable-Firefox\Nightly\Firefox
    und das Profil, welches beim ersten aufruf des Programms erstellt wird.
    C:\Portable-Firefox\Nightly\Profilordner

    Und jetzt zum Vergleich FuchsFan 's Portable.

    Code
    C:\Portable-Firefox\Portable.Firefox.Updater.v1.3.5.0
    Darin enhalten sind,
    "Firefox Beta x64 Launcher.exe", "Firefox ESR x64 Launcher.exe", "Firefox Nightly x64 Launcher.exe" und
    "Firefox Stable x64 Launcher.exe"!
    Und dann wären da dann nur noch die Ordner "Firefox Beta x64", "Firefox ESR x64", "Firefox Nightly x64"
    und "Firefox Stable x64" ‼
    
    In diesen Ordner befinden sich jeweils die entsprechenden Versionen des Firefox.
    Also die Programmdateien.
    Und ...
    der Profilordner!
    Beispiel:
    C:\Portable-Firefox\Portable.Firefox.Updater.v1.3.5.0\Firefox Beta x64\profile
    Alles anzeigen

    Aber auch die Programmdateien unterscheiden sich von denen, wo einfach nur die Setupdatei entpackt wurde. ;)

    Wie ich schon erwähnte, werde ich ab nächster Woche etwas genauer
    a. mit den verschiedenen Portablen auseinandersetzen.
    b. schauen, ob und wie auch aus einer Portablen per Skript eine andere Version gestartet werden kann.

    Aber testet ruhig weiter, achtet aber darauf, welche Art von Portable ihr nutzt.
    Das ist wichtig!
    Und auch welchen "Loader" ihr nutzt.
    Am besten ersetzt Ihr Cashy's "Loader (FirefoxStarter.exe) durch den "MultipleFirefoxLoader.exe".
    Dann funktioniert auch der "Aufruf" aus dem Skript.

    Und hier der Zwischenstand.
    Das Skript funktioniert z.Z. nur aus einer installierten Version:!:

    Code
    // Das Script erstellt einen Button, der den Profilmanager zur Auswahl einer weiteren Instanz öffnet.
    
    // Source file https://www.camp-firefox.de/forum/thema/xxx
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
      if (!window.gBrowser) return;
    
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      const id = 'aboutprofiles-Start'; // Id des Buttons
      const label = 'Profil zusätzlich starten'; // Bezeichnung des Buttons
      const tooltiptext = 'Zusätzliche Firefox-Profile starten';
    
      // Icon-Einstellungen
      const icon = 'profile.svg';  // [Name.Dateiendung] des Symbols
      const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet
    
      // Portable Firefox-Pfade
      const portableProfiles = [
        {
          name: "Portable Version 53.0 💛",
          profileName: "profile",
        //  exePath: "C:\\Portable-Firefox\\Firefox_53.0\\Firefox Stable x32 Launcher.exe",
          exePath: "C:\\Portable-Firefox\\Firefox_53.0\\MultipleFirefoxLoader.exe",
          iconPath: "file:///C:/FoxIcons/Nightly.png"
        },
        {
          name: "Portable Beta 💙",
          profileName: "profile",
          exePath: "C:\\Portable-Firefox\\Beta\\MultipleFirefoxLoader.exe",
          iconPath: "file:///C:/FoxIcons/Nightly.png"
        },
        {
          name: "Portable Nigly 💜",
          profileName: "profile",
          exePath: "C:\\Portable-Firefox\\Nightly\\MultipleFirefoxLoader.exe",
          iconPath: "file:///C:/FoxIcons/Nightly.png"
        }
      ];
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    
      const popup_id = id + '-popup';
      const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
    
      // Basispfad für profiles.ini
      const basePath = PathUtils.normalize(PathUtils.parent(PathUtils.parent(PathUtils.profileDir)));
      const INI_PATH = basePath + "\\profiles.ini";
    
      // BUTTON
      try {
        CustomizableUI.createWidget({
          id: id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: label,
          tooltiptext: tooltiptext,
          onCreated: (button) => {
            button.style.MozContextProperties = 'fill, stroke, fill-opacity';
            button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
            button.style.minWidth = 'fit-content';
            button.style.color = '#ff5a79';
          }
        });
      } catch(e) {}
    
      // EXE-Pfad aus compatibility.ini eines Profils lesen
      function getFirefoxExeForProfile(profilePath) {
        try {
          const compatPath = profilePath + "\\compatibility.ini";
          let compatFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          compatFile.initWithPath(compatPath);
    
          if (!compatFile.exists()) return null;
    
          const parser = Cc["@mozilla.org/xpcom/ini-parser-factory;1"]
            .getService(Ci.nsIINIParserFactory)
            .createINIParser(compatFile);
          const platformDir = parser.getString("Compatibility", "LastPlatformDir");
          if (platformDir) return platformDir + "\\firefox.exe";
        } catch(e) {
          console.error("compatibility.ini Fehler für", profilePath, e);
        }
        return null;
      }
    
      // Absoluten Profilpfad aus profiles.ini berechnen
      function getAbsoluteProfilePath(iniParser, section) {
        const rawPath = iniParser.getString(section, "Path");
        let isRelative;
        try {
          isRelative = iniParser.getString(section, "IsRelative");
        } catch(e) {
          isRelative = "1";
        }
        if (!rawPath) return null;
        if (isRelative === "1") {
          return PathUtils.normalize(basePath + "\\" + rawPath.replace(/\//g, "\\"));
        }
        return PathUtils.normalize(rawPath);
      }
    
      /* Zum Testen deaktiviert!
      // Profil starten
      function startProfile(profileName, exePath) {
        // Falls exePath auf "Launcher.exe" endet, starte die EXE ohne Parameter
        if (exePath && exePath.toLowerCase().includes("launcher.exe")) {
          let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          file.initWithPath(exePath);
    
          if (!file.exists()) {
            console.error("Firefox EXE nicht gefunden:", exePath);
            return;
          }
    
          let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
          process.init(file);
          process.run(false, [], 0); // Keine Parameter für Portable-Launcher
          return;
        }
    
        // Standard-Firefox-EXE mit -P-Parameter starten
        if (!exePath) {
          const curDir = Services.dirsvc.get("GreBinD", Ci.nsIFile);
          exePath = curDir.path + "\\firefox.exe";
        }
    
        let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        file.initWithPath(exePath);
    
        if (!file.exists()) {
          console.error("Firefox EXE nicht gefunden:", exePath);
          return;
        }
    
        let args = ["-no-remote", "-P", profileName || ""];
        let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, args, args.length);
      }
      */
    
    /*
    function startProfile(profileName, exePath) {
      console.log("startProfile aufgerufen mit:", { profileName, exePath }); // Debug-Ausgabe
    
      // Falls exePath auf "launcher.exe" endet (unabhängig von Groß-/Kleinschreibung)
      if (exePath && exePath.toLowerCase().endsWith("launcher.exe")) {
        console.log("Starte Portable-Launcher:", exePath); // Debug-Ausgabe
        let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        file.initWithPath(exePath);
    
        if (!file.exists()) {
          console.error("Datei nicht gefunden:", exePath); // Debug-Ausgabe
          return;
        }
    
        let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, [], 0);
        return;
      }
    
      // Standard-Firefox-EXE mit -P-Parameter starten
      console.log("Starte Standard-Firefox:", exePath); // Debug-Ausgabe
      if (!exePath) {
        const curDir = Services.dirsvc.get("GreBinD", Ci.nsIFile);
        exePath = curDir.path + "\\firefox.exe";
      }
    
      let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
      file.initWithPath(exePath);
    
      if (!file.exists()) {
        console.error("Firefox EXE nicht gefunden:", exePath);
        return;
      }
    
      let args = ["-no-remote", "-P", profileName || ""];
      let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      process.init(file);
      process.run(false, args, args.length);
    }
    */
      // NEU
    
    function startProfile(profileName, exePath) {
      console.log("startProfile aufgerufen mit:", { profileName, exePath });
    
      // Falls exePath auf "launcher.exe" endet
      if (exePath && exePath.toLowerCase().endsWith("launcher.exe")) {
        console.log("Starte Portable-Launcher:", exePath);
    
        // Pfad in Anführungszeichen setzen, falls Leerzeichen enthalten sind
        const quotedExePath = exePath.includes(" ") ? `"${exePath}"` : exePath;
    
        let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        file.initWithPath(exePath); // Hier bleibt der Pfad ohne Anführungszeichen
    
        if (!file.exists()) {
          console.error("Datei nicht gefunden:", exePath);
          return;
        }
    
        let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
    
        // WICHTIG: Leere Argumentenliste, aber Pfad mit Anführungszeichen
        // Da nsIProcess den Pfad intern verarbeitet, reichen leere Argumente
        process.run(false, [], 0);
        return;
      }
    
      // Standard-Firefox-EXE mit -P-Parameter starten
      console.log("Starte Standard-Firefox:", exePath);
      if (!exePath) {
        const curDir = Services.dirsvc.get("GreBinD", Ci.nsIFile);
        exePath = curDir.path + "\\firefox.exe";
      }
    
      let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
      file.initWithPath(exePath);
    
      if (!file.exists()) {
        console.error("Firefox EXE nicht gefunden:", exePath);
        return;
      }
    
      let args = ["-no-remote", "-P", profileName || ""];
      let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      process.init(file);
      process.run(false, args, args.length);
    }
    
    /*
    function startProfile(profileName, exePath) {
      console.log("startProfile aufgerufen mit:", { profileName, exePath });
    
      // Falls exePath auf "launcher.exe" endet
      if (exePath && exePath.toLowerCase().endsWith("launcher.exe")) {
        console.log("Starte Portable-Launcher:", exePath);
    
        // Pfad in Anführungszeichen setzen, falls Leerzeichen enthalten sind
        const commandLine = `"${exePath}"`;
    
        let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.initWithCommandLine(commandLine); // Verwende initWithCommandLine
        process.run(false, [], 0);
        return;
      }
    
      // Standard-Firefox-EXE mit -P-Parameter starten
      console.log("Starte Standard-Firefox:", exePath);
      if (!exePath) {
        const curDir = Services.dirsvc.get("GreBinD", Ci.nsIFile);
        exePath = curDir.path + "\\firefox.exe";
      }
    
      // Pfad in Anführungszeichen setzen, falls Leerzeichen enthalten sind
      const commandLine = `"${exePath}" -no-remote -P "${profileName || ""}"`;
    
      let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      process.initWithCommandLine(commandLine);
      process.run(false, [], 0);
    }
    */
    
      /* Zum Testen deaktiviert
      // Menüeintrag erstellen
      function addProfileItem(aDocument, menupopup, label, profileName, exePath, iconPath = null) {
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let item = aDocument.createElementNS(xulNS, "menuitem");
        item.setAttribute("label", label);
    
        if (profileName !== undefined) {
          item.setAttribute("tooltiptext", exePath || "Standard-EXE");
          item.addEventListener("command", () => startProfile(profileName, exePath));
        }
    
        if (iconPath) {
          item.style.listStyleImage = `url("${iconPath}")`;
          item.style.minWidth = 'fit-content';
        }
    
        menupopup.appendChild(item);
      }
      */
    function addProfileItem(aDocument, menupopup, label, profileName, exePath, iconPath = null) {
      const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
      let item = aDocument.createElementNS(xulNS, "menuitem");
      item.setAttribute("label", label);
    
      if (profileName !== undefined) {
        item.setAttribute("tooltiptext", exePath || "Standard-EXE");
        // Debug: Gib den exePath in der Konsole aus, wenn der Menüeintrag erstellt wird
        console.log("Menüeintrag erstellt:", { label, profileName, exePath });
        item.addEventListener("command", () => startProfile(profileName, exePath));
      }
    
      if (iconPath) {
        item.style.listStyleImage = `url("${iconPath}")`;
        item.style.minWidth = 'fit-content';
      }
    
      menupopup.appendChild(item);
    }
    
    
      // Profile aus profiles.ini laden + Portable-Profile hinzufügen
      function loadProfilesWithNiceNames(aDocument, menupopup) {
        try {
          let iniFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          iniFile.initWithPath(INI_PATH);
    
          if (!iniFile.exists()) {
            addProfileItem(aDocument, menupopup, "⚠️ profiles.ini fehlt");
            return;
          }
    
          const iniParser = Cc["@mozilla.org/xpcom/ini-parser-factory;1"]
            .getService(Ci.nsIINIParserFactory)
            .createINIParser(iniFile);
    
          // Standard-Profile aus profiles.ini laden
          for (let section of iniParser.getSections()) {
            if (!section.startsWith("Profile")) continue;
            let profileName;
            try {
              profileName = iniParser.getString(section, "Name");
            } catch(e) {
              profileName = section.replace("Profile", "");
            }
            const profilePath = getAbsoluteProfilePath(iniParser, section);
            let exePath = null;
            if (profilePath) {
              exePath = getFirefoxExeForProfile(profilePath);
            }
            let displayLabel = profileName;
            if (exePath) {
              const parts = exePath.replace(/\\firefox\.exe$/i, "").split("\\");
              const folder = parts[parts.length - 1];
              displayLabel += "  →  " + folder;
            }
            addProfileItem(aDocument, menupopup, displayLabel, profileName, exePath);
          }
    
          // Portable-Profile aus der Konfiguration hinzufügen
          for (let portable of portableProfiles) {
            addProfileItem(
              aDocument,
              menupopup,
              portable.name,
              portable.profileName,
              portable.exePath,
              portable.iconPath
            );
          }
        } catch(e) {
          console.error("Fehler beim Laden der Profile:", e);
          addProfileItem(aDocument, menupopup, "⚠️ Fehler beim Laden der Profile");
        }
      }
    
      // Popup erstellen oder aktualisieren
      function buildPopupIfNeeded() {
        const button = document.getElementById(id);
        if (!button) return null;
    
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let popup = document.getElementById(popup_id);
    
        if (!popup) {
          popup = document.createElementNS(xulNS, "menupopup");
          popup.setAttribute("id", popup_id);
          button.appendChild(popup);
        } else {
          popup.textContent = "";
        }
    
        loadProfilesWithNiceNames(document, popup);
        button.setAttribute("profiles-menu-built", "true");
        return popup;
      }
    
      // Button-Klick behandeln (nur Linksklick)
      function click_button() {
        const button = document.getElementById(id);
        if (!button) return;
    
        // Kontextmenü unterdrücken
        button.addEventListener("contextmenu", event => event.preventDefault());
    
        // Event-Listener für Linksklick registrieren
        button.addEventListener("mousedown", function handleClick(event) {
          if (event.button !== 0) return; // Nur Linksklick
          event.preventDefault();
          event.stopPropagation();
    
          const popup = buildPopupIfNeeded();
          if (!popup) return;
    
          try {
            popup.hidePopup();
          } catch(e) {}
    
          popup.openPopup(button, "after_start", 0, 0, false, false);
        });
      }
    
      // Initialisierung
      function initForWindow() {
        const init = () => click_button();
        if (document.readyState !== "loading") {
          init();
        } else {
          window.addEventListener("DOMContentLoaded", init);
        }
      }
    
      // Initialisierung + nach Toolbar-Anpassung
      initForWindow();
      window.addEventListener('aftercustomization', () => setTimeout(click_button, 100));
    })();
    Alles anzeigen

    :saint: Sorry, da ist noch auskommentierter Code vorhanden, aber das Skript ist ja auch noch in der "Pubertät". :D

  • Profilmanager

    • Mira_Belle
    • 14. Mai 2026 um 15:21
    Zitat von FuchsFan

    Mira_Belle Den Link hast du gesehen?

    Keine Antwort, ...

    Oh, Sorry!!
    Doch, doch.
    Und gesichert und ausprobiert habe ich diese portable Versionen auch schon.

    Danke, vielen, vielen Dank dafür!
    Entschuldige.
    Bin schon halb in Berlin, zumindest mit den Gedanken.

    Zitat von 2002Andreas

    Dann viel Spaß bei egal was :thumbup:

    Schiller.

  • Profilmanager

    • Mira_Belle
    • 14. Mai 2026 um 14:53

    Danke an alle Beteiligten.
    Bin dann ab morgen in Berlin.
    Deshalb ist jetzt an dieser Stelle erst einmal Schluss.

    Und dann, nächste Woche, habe ich dann viel zu tun und auszuprobieren,
    bevor es mit dem Skript weiter geht.

  • Profilmanager

    • Mira_Belle
    • 14. Mai 2026 um 12:53

    FuchsFan Danke für den Link.

    Zitat von FuchsFan

    Übrigens,das erste Script, welches ich gezeigt habe, funktioniert in jeder Version, installiert oder portable.

    Es lag am "Loader", dass die Anwendungen auch nicht mit Deinem Skript funktionierten.
    Jetzt schaue ich mal, was ich die nächsten Tage aus den vielen Möglichkeiten mache.

    Hättest Du die PNG's für mich?

    Zitat von 2002Andreas

    Ich habe die zwar auch, aber mit anderen Namen

    Na, das sollte doch nicht wirklich ein Problem sein.

  • Profilmanager

    • Mira_Belle
    • 14. Mai 2026 um 12:16

    Ich habe in Fuchsfan's Skript das mal eingetragen, schaut so aus:

    Code
        // Portable Profile 
        addProfileItem(document, popup,
          "Portable Version 53.0 💛", "profile",
          "C:\\Portable-Firefox\\Firefox_53.0\\FirefoxStarter.exe",
          "file:///C:/FoxIcons/Finale.png"
        );
        addProfileItem(document, popup,
          "Portable Beta 💚", "profile",
          "C:\\Portable-Firefox\\Beta\\FirefoxStarter.exe",
          "file:///C:/FoxIcons/Beta.png"
        );
        addProfileItem(document, popup,
          "Portable Nigly 💜", "profile",
          "C:\\Portable-Firefox\\Nightly\\FirefoxStarter.exe",
          "file:///C:/FoxIcons/Nightly.png"
        );
    Alles anzeigen

    Funktioniert nicht!

    Auch wenn ich einen andere "Starter" verwenden will, funktioniert das nicht.
    Kann doch nicht am Pfad liegen? :/

    2002Andreas
    Hast Du die PNG's für mich?


    Danke Endor
    Das mit dem "Loader" war der entscheidend Tip!
    Nutze ich den "MultipleFirefoxLoader.exe", starten auch die Portablen:!:

    Ist das AutoIt?

    Bene - Pastebin.com
    Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
    pastebin.com


    Dann würde ich den für eventuell mich "neu" machen, mit neuem Symbol.

  • Profilmanager

    • Mira_Belle
    • 14. Mai 2026 um 11:05

    FuchsFan Wie hast Du die portablen Versionen erstellt?
    Warum hast Du verschiedene Launcher.exe?

    Kannst Du mir mal eine komplette portable Version von Dir zukommen lassen?

    Ich habe zwar von 2002Andreas verschiedene Möglichkeiten bekommen,
    eine portable Version zu erstellen, aber diese lassen sich ums verrecken nicht aus "meinem",
    aber auch nicht aus "Deinem" Skript heraus starten!

    Um das Problem, dass das Skript z.Z. nicht in einer Protablen funktioniert, werde ich mir dann,
    bei Gelegenheit auch mal anschauen.

      2002Andreas Das werde ich berücksichtigen und mir auch bei Gelegenheit anschauen.
    Z.Z. nutze ich solche "unechten" Profile nicht. (Dient nur zur Unterscheidung!!)

  • Profilmanager

    • Mira_Belle
    • 14. Mai 2026 um 00:19

    Erste Etappe geschafft!

    Das Skript erstellt einen Button, der es ermöglicht alle Profile aller installierten Firefox Versionen,
    sei es eine Standardinstallation, eine Beta oder auch eine Nightly, zu starten.
    Für das erzeugte Menü wird die profiles.ini ausgelesen.
    Für die Zuordnung der EXE wird die compatibility.ini in den Profilen ausgelesen
    und dem Profil zugewiesen.

    JavaScript
    // QuickProfilesChangesButton.uc.js
    // Das Script erstellt einen Button, der den Profilmanager zur Auswahl einer weiteren Instanz öffnet.
    
    // Source file https://www.camp-firefox.de/forum/xxx
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
    
      if (!window.gBrowser)
        return;
    
      const
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
               id = 'aboutprofiles-Start', // Id des Buttons
            label = 'Profil zusätzlich starten', // Bezeichnung des Buttons
      tooltiptext = 'Zusätzliche Firefox-Profile starten',
      // Icon-------------------------------------------------------
             icon = 'profile.svg',  // [Name.Dateiendung] des Symbols
         iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
         popup_id = id + '-popup',
       curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)),
    
      // ── Basispfad für profiles.ini
         basePath = PathUtils.normalize(PathUtils.parent(PathUtils.parent(PathUtils.profileDir))),
         INI_PATH = basePath + "\\profiles.ini";
    
      //BUTTON
      try {
        CustomizableUI.createWidget({
          id: id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: label,
          tooltiptext: tooltiptext,
    
          onCreated: (button) => {
            button.style.MozContextProperties = 'fill, stroke, fill-opacity';
            button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
            button.style.minWidth = 'fit-content';
            button.style.color = '#ff5a79'; // Farbe für das SVG-Icon setzen   
          }
        });
    	} catch(e) {};
    
      // EXE-Pfad aus compatibility.ini eines Profils lesen
      function getFirefoxExeForProfile(profilePath) {
        try {
          const compatPath = profilePath + "\\compatibility.ini";
          let compatFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          compatFile.initWithPath(compatPath);
    
          if (!compatFile.exists()) return null;
    
          const parser = Cc["@mozilla.org/xpcom/ini-parser-factory;1"]
            .getService(Ci.nsIINIParserFactory)
            .createINIParser(compatFile);
          // Beispiel:
          // C:\Program Files\Firefox Nightly
          const platformDir = parser.getString("Compatibility", "LastPlatformDir");
    
          if (platformDir) return platformDir + "\\firefox.exe";
    
        } catch(e) {
          console.error("compatibility.ini Fehler für", profilePath, e
          );
        }
        return null;
      }
    
      // Absoluten Profilpfad aus profiles.ini berechnen
      function getAbsoluteProfilePath(iniParser, section) {
    
        const rawPath = iniParser.getString(section, "Path");
        let isRelative;
    
        try {
          isRelative = iniParser.getString(section, "IsRelative");
        } catch(e) {
          isRelative = "1";
        }
    
        if (!rawPath) return null;
        // Relativer Pfad
        if (isRelative === "1") {
          return PathUtils.normalize(basePath + "\\" + rawPath.replace(/\//g, "\\"));
        }
        // Absoluter Pfad
        return PathUtils.normalize(rawPath);
      }
    
      // Profil starten
      function startProfile(profileName, exePath) {
    
        // Fallback:
        // aktuell laufende Firefox-Installation
        if (!exePath) {
    
          const curDir = Services.dirsvc.get("GreBinD", Ci.nsIFile);
          exePath = curDir.path + "\\firefox.exe";
        }
    
        let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        file.initWithPath(exePath);
    
        if (!file.exists()) {
    
          console.error("Firefox EXE nicht gefunden:", exePath);
          return;
        }
    
        let args = ["-no-remote", "-P", profileName || ""];
        let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, args, args.length);
      }
    
      // Menüeintrag erstellen
      function addProfileItem(aDocument, menupopup, label, profileName, exePath) {
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let item = aDocument.createElementNS(xulNS, "menuitem");
        item.setAttribute("label", label);
    
        if (profileName !== undefined) {
          // Tooltip zeigt EXE
          item.setAttribute("tooltiptext",exePath || "Standard-EXE");
          item.addEventListener("command", () => startProfile(profileName, exePath));
        }
        menupopup.appendChild(item);
      }
    
      // Profile aus profiles.ini laden
      function loadProfilesWithNiceNames(aDocument, menupopup) {
    
        try {
          let iniFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          iniFile.initWithPath(INI_PATH);
    
          if (!iniFile.exists()) {
            addProfileItem(aDocument, menupopup, "⚠️ profiles.ini fehlt");
            return;
          }
    
          const iniParser = Cc["@mozilla.org/xpcom/ini-parser-factory;1"]
            .getService(Ci.nsIINIParserFactory)
            .createINIParser(iniFile);
    
          for (let section of iniParser.getSections()) {
            if (!section.startsWith("Profile")) continue;
            let profileName;
    
            try {
              profileName = iniParser.getString(section, "Name");
            } catch(e) {
              profileName = section.replace("Profile", "");
            }
            // Profilpfad
            const profilePath = getAbsoluteProfilePath(iniParser,section);
            // EXE aus compatibility.ini
            let exePath = null;
    
            if (profilePath) {
              exePath = getFirefoxExeForProfile(profilePath);
            }
            // Anzeigename
            let displayLabel = profileName;
    
            if (exePath) {
              const parts = exePath
                  .replace(/\\firefox\.exe$/i, "")
                  .split("\\");
    
              const folder = parts[parts.length - 1]; displayLabel += "  →  " + folder;
            }
            addProfileItem(aDocument, menupopup, displayLabel, profileName, exePath);
          }
        } catch(e) {
          console.error("Fehler beim Laden der Profile:", e);
          addProfileItem(aDocument, menupopup, "⚠️ Fehler beim Laden der Profile");
        }
      }
    
      // Popup erstellen oder aktualisieren
      function buildPopupIfNeeded() {
        const button = document.getElementById(id);
        if (!button) return null;
    
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let popup = document.getElementById(popup_id);
    
        if (!popup) {
          popup = document.createElementNS(xulNS, "menupopup");
          popup.setAttribute("id", popup_id);
          button.appendChild(popup);
        } else {
          // Vorherige Inhalte löschen
          popup.textContent = "";
        }
    
        loadProfilesWithNiceNames(document, popup);
        return popup;
      }
    
      // Button-Klick behandeln (nur Linksklick)
      function click_button() {
        const button = document.getElementById(id);
        if (!button) return;
        // Nur EINMAL Listener registrieren
        if (button.hasAttribute("listener-added")) return;
        button.setAttribute("listener-added", "true");
        // Kontextmenü unterdrücken
        button.addEventListener("contextmenu", event => event.preventDefault());
        button.addEventListener("mousedown", event => {
          if (event.button !== 0) return; // Nur Linksklick (button 0 = linker Mausknopf)
          event.preventDefault();
          event.stopPropagation();
          const popup = buildPopupIfNeeded();
    
          if (!popup) return;
          // Hängende Popups verhindern
          try {
            popup.hidePopup();
          } catch(e) {}
    
          popup.openPopup(button, "after_start", 0, 0, false, false);
        });
      }
    
      // Stellt sicher, dass der Button und sein Event-Listener (click_button) so früh wie möglich im Fenster initialisiert werden.
      // Unabhängig davon, ob das Fenster bereits vollständig geladen ist oder nicht!
      function initForWindow() {
        const init = () => setTimeout(click_button, 300);
        if (document.readyState !== "loading") {
          init();
        } else {
          window.addEventListener("DOMContentLoaded", init);
        }
      }
    
      // Initialisierung
      initForWindow();
      // Nach Toolbar-Anpassung erneut aktivieren
      window.addEventListener('aftercustomization', () => setTimeout(click_button, 100));
    
    })();
    Alles anzeigen
  • Profilmanager

    • Mira_Belle
    • 13. Mai 2026 um 20:29

    .DeJaVu Ich nehme an, Du hast nicht alles gelesen.

    Zitat von .DeJaVu

    Was ist denn so schwer daran, firefox -p <profilname" aufzurufen und dennoch profiles.ini und installs.ini zu nutzen?

    Eigentlich nichts!
    Nur müsste ich ja dann für jedes Profil eine eigene Verknüpfung anlegen, wo auch immer!
    So mache ich es z.Z. mit der Nightly.

    Das Ziel, welches ich mir gesteckt habe ist, nicht nur ein X-belibiges Profil zusätzlich zustarten,
    was ja mit dem Skript schon prima funktioniert,
    sondern eben auch die Nightly, die ach eventuell mehrere Profile hat.
    Angemerkt sei noch, dass die Nightly installiert ist.

    Sicher könnte ich das auch "hardcoden", aber das ist doch langweilig.
    Das wäre dann z.B. so ein Aufruf => "C:\Program Files\Firefox Nightly\firefox.exe" -P "Nightly" (oder so ähnlich).
    Aber dann müssten andere, die eventuell auch das Skript nutzen wollen, es erst einmal für sich anpassen.

    Ok, in erster Linie mache ich es ja für mich, aber es soll dann in der Anwendung einfach sein, es zu nutzen.

  • Profilmanager

    • Mira_Belle
    • 13. Mai 2026 um 20:08

    Danke.
    Habe mir so einige Versionen nach Anleitung portabel gemacht.

    Die sind ja nur zum Testen!

    Mein erstes Problem ist, die installierte Nichtly zum Laufen zubekommen.
    Und zwar per Skript!

    Meine Idee, die compatibility.ini im Profilordner auslesen und eben das richtige Programm zu starten!

    Wenn ich das irgendwann geschafft habe, geht es an portable Versionen.
    Aber das wird noch dauern.

  • Profilmanager

    • Mira_Belle
    • 13. Mai 2026 um 19:13

    Ok, ich bedanke mich dann erst einmal für diese Informationen!

    Wo kann ich denn portable Firefoxversionen herbekommen?

    Ich hätte da ganz gerne einen sehr alten Fuchs, die derzeitige Beta, die Nightly
    und eventuell noch eine Version so z.B. die 140.

  • Profilmanager

    • Mira_Belle
    • 13. Mai 2026 um 18:44

    Und die Portablen erstellen da kein Profil?

    Die Nightly ist bei Dir auch eine Portable?

  • Profilmanager

    • Mira_Belle
    • 13. Mai 2026 um 18:15

    Es gibt nun einen "Zwischenstand"!
    Der die Ausgangsbasis für ein neues Skript "Profil Changer" bilden wird.

    Code
    (function() {
    
      if (!window.gBrowser)
        return;
    
      const
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
               id = 'aboutprofiles-Start', // Id des Buttons
            label = 'Profil zusätzlich starten', // Bezeichnung des Buttons
      tooltiptext = 'Zusätzliche Firefox-Profile starten',
      // Icon-------------------------------------------------------
             icon = 'default-browser-red.svg',  // [Name.Dateiendung] des Symbols
         iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
         popup_id = id + '-popup',
       curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
    
     // const POPUP_ID = id + '-popup'; popup-id
    
      //BUTTON
      try {
        CustomizableUI.createWidget({
          id: id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: label,
          tooltiptext: tooltiptext,
    
          onCreated: (button) => {
            button.style.MozContextProperties = 'fill, stroke, fill-opacity';
            button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
            button.style.minWidth = 'fit-content';
          //  button.style.color = '#ff5a79'; // Farbe für das SVG-Icon setzen   
          }
        });
    	} catch(e) {};
    
      // Profil starten
      function startProfile(profileName) {
        let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
        let args = ["-no-remote", "-P", profileName || "", "-foreground"];
        file.initWithPath("C:\\Program Files\\Mozilla Firefox\\firefox.exe"); // 64-Bit
    
        let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, args, args.length);
      }
    
      // Menüeintrag erstellen
      function addProfileItem(aDocument, menupopup, label, profileName) {
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let item = aDocument.createElementNS(xulNS, "menuitem");
        item.setAttribute("label", label);
        item.addEventListener("command", () => startProfile(profileName));
        menupopup.appendChild(item);
      }
    
      // Profile aus profiles.ini laden
      function loadProfilesWithNiceNames(aDocument, menupopup) {
        const pfad = PathUtils.normalize(PathUtils.parent(PathUtils.parent(PathUtils.profileDir)));
        const INI_PATH = pfad + "\\profiles.ini";
    
        try {
          let iniFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          iniFile.initWithPath(INI_PATH);
    
          if (!iniFile.exists()) {
            addProfileItem(aDocument, menupopup, "❌ profiles.ini fehlt");
            return;
          }
    
          const iniParser = Cc["@mozilla.org/xpcom/ini-parser-factory;1"]
            .getService(Ci.nsIINIParserFactory)
            .createINIParser(iniFile);
    
          for (let section of iniParser.getSections()) {
            if (!section.startsWith("Profile")) continue;
            let profileNameRaw = iniParser.getString(section, "Name") || section.replace("Profile", "");
            addProfileItem(aDocument, menupopup, profileNameRaw, profileNameRaw);
          }
        } catch (e) {
        addProfileItem(aDocument, menupopup, "❌ Fehler beim Laden der Profile");
        }
      }
    
      // Popup erstellen oder aktualisieren
      function buildPopupIfNeeded() {
        const button = document.getElementById(id);
        if (!button) return null;
    
        const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        let popup = document.getElementById(popup_id);
    
        if (!popup) {
          popup = document.createElementNS(xulNS, "menupopup");
          popup.setAttribute("id", popup_id);
          button.appendChild(popup);
        } else {
          popup.textContent = "";
        }
    
        loadProfilesWithNiceNames(document, popup);
        return popup;
      }
    
      // Button-Klick behandeln (nur Linksklick)
      function click_button() {
        const button = document.getElementById(id);
        if (!button) return;
        if (button.hasAttribute("listener-added")) return;
        button.setAttribute("listener-added", "true");
        // Kontextmenü unterdrücken
        button.addEventListener("contextmenu", event => event.preventDefault());
        button.addEventListener("click", event => {
          if (event.button !== 0) return; // Nur Linksklick (button 0 = linker Mausknopf)
          event.preventDefault();
          event.stopPropagation();
          const popup = buildPopupIfNeeded();
          if (popup) popup.openPopup(button, "after_start", 0, 0, false, false);
        });
      }
    
      // Stellt sicher, dass der Button und sein Event-Listener (click_button) so früh wie möglich im Fenster initialisiert werden.
      // Unabhängig davon, ob das Fenster bereits vollständig geladen ist oder nicht!
      function initForWindow() {
        const init = () => setTimeout(click_button, 300);
        if (document.readyState !== "loading") {
          init();
        } else {
          window.addEventListener("DOMContentLoaded", init);
        }
      }
    
      // Initialisierung
      initForWindow();
      window.addEventListener('aftercustomization', () => setTimeout(click_button, 100));
    
    })();
    Alles anzeigen


    2002Andreas Aber ich brauche nun weitere Informationen!
    Du nutzt doch noch weitere Firefox Installationen?
    Oder nur weitere Portable?
    Laegen all diese Füchse unter "%APPDATA%\Mozilla\Firefox\Profiles"
    "eigene" Profile an?

    Wenn ja, kannst Du mal schauen, ob sich in den jeweiligen Profilen eine compatibility.ini befindet.
    Steht da immer der passende Pfad zum "richtigen" Fuchs drinnen?

    Also in meinem Standardprofil steht da z.B.

    Code
    [Compatibility]
    LastVersion=150.0.3_20260511200624/20260511200624
    LastOSABI=WINNT_x86_64-msvc
    LastPlatformDir=C:\Program Files\Mozilla Firefox
    LastAppDir=C:\Program Files\Mozilla Firefox\browser

    Im Profil für die Nighty:

    Code
    [Compatibility]
    LastVersion=152.0a1_20260512090214/20260512090214
    LastOSABI=WINNT_x86_64-msvc
    LastPlatformDir=C:\Program Files\Firefox Nightly
    LastAppDir=C:\Program Files\Firefox Nightly\browser


    Wenn dem so ist, ließe sich diese Datei auslesen und die Profile dann dementsprechend mit dem dazugehörenden
    Fuchs starten.

    Wenn es so ist, wie ich vermute, mache ich einen neuen Thread auf, für das neue Skript.

  • Profilmanager

    • Mira_Belle
    • 12. Mai 2026 um 22:15
    Zitat von FuchsFan

    Wie ich oben angab, die installierten Versionen werden über die profiles.ini automatisch ausgelesen und übernommen.

    Habe ich auch schon gemerkt.
    Und da liegt auch "mein" Problem,
    denn das Profil der Nightly wird ja auch angezeigt und ist dann eben nicht nutzbar, da nicht mit der Nightly verknüpft.

    Bin aber gerade dabei das (Dein Skript) zu zerpflücken.
    Noch ist mir nicht alles klar.

  • Profilmanager

    • Mira_Belle
    • 12. Mai 2026 um 20:56

    FuchsFan Du hast mich auf eine Idee gebracht! Danke.

    Da das alles ja nicht mehr so einfach mit dem Profilmanager funktioniert,
    wird es ein neues Skript geben.

    Die Idee, Button öffnet ein Auswahlmenü.
    Angeklickt wird einfach "nur" das "Profil"!
    Im Script wird aber dann für die Nightly so etwas "C:\\Program Files\\Firefox Nightly\\firefox.exe -P Nightly -foreground", aufgerufen.
    Werd ich noch testen wie das genau funktioniert!

  • Profilmanager

    • Mira_Belle
    • 12. Mai 2026 um 18:59

    2002Andreas Aber wenn ich da "C:\Program Files\Firefox Nightly\firefox.exe" -P "umilg7ve.Nightly" eintrage,
    startet der Profilmanager von der Nightly!

    Es muss schon "C:\Program Files\Firefox Nightly\firefox.exe" --profile "%APPDATA%\Mozilla\Firefox\Profiles\umilg7ve.Nightly"
    sein!


    Zitat von milupo

    Du willst das gleiche Profil mit dem finalen Firefox und dem Nightly nutzen. Das wird standardmäßig verhindert, deswegen kommt die Meldung. Du musst da unterschiedliche Profile verwenden.

    Äh, nein, eigentlich nicht!
    Mit dem Skript wird der Profilmanager geöffnet.
    Wenn ich dort nun ein anderes Profil auswähle, wird eine neue Instanz gestartet, also ein neues Fenster,
    aber eben mit dem ausgewählten Profil!
    Bis Version 149, bzw. ich glaube Nightly 151, war das überhaupt kein Problem.
    Es scheint, als dass Mozilla da etwas an den Profilmanagern geändert hat!

    Überhaupt ist da so einiges "NEU"!
    Die Nightly hat seit neuestem einen Launcher auf dem Desctop abgelegt!
    Habe ich durch eine Verknüpfung ersetzt!
    Nun kann ich eben im Nightly per Script komischerweise auch die "normalen" Profile nutzen,
    ohne dass die mir zerschossen werden!

    Hier mal das Skript, dass so in der Standardkonfiguration aber auch im Nightly genutzt wird (werden soll).

    Code
    // QuickProfilesChangesButton.uc.js
    // Das Script erstellt einen Button, der den Profilmanager zur Auswahl einer weiteren Instans öffnet.
    
    // Source file https://www.camp-firefox.de/forum/thema/140072/?postID=1282691#post1282691
    
    /* ----------------------------------------------------------------------------------- */
    /*     Zu beachten ist, dass die Grafiken sich im richtigen Ordner befinden müssen     */
    /*            %appdata%\Mozilla\Firefox\Profiles\"Profilname"\chrome\icons             */
    /* ----------------------------------------------------------------------------------- */
    
    (function() {
    
      if (location.href !== 'chrome://browser/content/browser.xhtml')
        return;
    
      const
      // ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
               id = 'profileschange-button', // Id des Buttons
            label = 'Profil zusätzlich starten', // Bezeichnung des Buttons
      tooltiptext = 'Profile Changer',
      // Icon-------------------------------------------------------
             icon = 'profile.svg',  // [Name.Dateiendung] des Symbols
         iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
      // ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
    
    	if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
    		Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
    	}
      //BUTTON
    	try {
        CustomizableUI.createWidget({
          id: id,
          defaultArea: CustomizableUI.AREA_NAVBAR,
          label: label,
          tooltiptext: tooltiptext,
    
          onCreated: (button) => {
            button.style.MozContextProperties = 'fill, stroke, fill-opacity';
            button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
            button.style.minWidth = 'fit-content';
            button.style.color = '#E0E0E0'; // Farbe für das SVG-Icon setzen
          }
        });
    	} catch(e) {};
    
    // click
      (function click_button() {
        const button = document.getElementById(id);
    
        if (button) {
          button.addEventListener('click', (event) => {
            if (event.button != 0) {
              return;
            }
            let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            // let args = ["-no-remote", "-P", "Neu", "-foreground"]; // Profil wird ausgewählt
            let args = ["-no-remote", "-P", "-foreground"]; // Profilmanager aufrufen
            file.initWithPath("C:\\Program Files\\Mozilla Firefox\\firefox.exe"); // 64‑bit
            // file.initWithPath("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); // 32‑bit
            // file.initWithPath("/Applications/Firefox.app/Contents/MacOS/firefox"); // macOS
            let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
            process.init(file);
            process.run(false, args, args.length);
          });
        } else {
          setTimeout(click_button, 100);
        }
      })();
    
    })();
    Alles anzeigen
  • Profilmanager

    • Mira_Belle
    • 12. Mai 2026 um 18:27

    Sören Hentzschel Also, die Meldung erscheint,
    wenn ich aus dem Standardbrowser versuche das Nightlyprofil zu starten.
    Ok, ist wohl jetzt so!
    Ich müsse im Skript irgendwie etwas einbauen, dass dann eben die Nightly gestartet wird.
    Denke, das bekomme ich noch irgendwann hin.

    Wenn ich aus der Nightly "versehendlich" ein "normales" Profil gestartet habe,
    wird irgendetwas darin geändert!
    Es "läuft" in der Nightly erst einmal ganz normal!
    Starte ich aber den Standardbrowser und wähle dann das besagte Profil, bekomme ich dann auch diese Meldung!
    D.h. war es mein Standardprofil, ist es dahin!
    Ich kann es ja nicht mehr im Standardbrowser benutzen.

    Achja, für meine Desctopverknüpfung habe ich nun eine Lösung gefunden"

    "C:\Program Files\Firefox Nightly\firefox.exe" --profile "%APPDATA%\Mozilla\Firefox\Profiles\umilg7ve.Nightly" -no-remote"
    Im Eigenschaftsfenster unter Ziel eingetragen, startet die Nightly mit dem dazugehörenden Profil,
    ohne das der Profilmanager gestartet wird.

Unterstütze uns!

Jährlich (2026)

69,4 %

69,4% (538,17 von 775 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon