Bitte erleuchtet mich.
Wenn Ihr mit einem Unterordner Skripte arbeitet,
warum dann noch die Zeile userChrome.import("*", "UChrm"); ?
Wäre für mich eine zusätzliche, potentielle Fehlerquelle...
Bitte erleuchtet mich.
Wenn Ihr mit einem Unterordner Skripte arbeitet,
warum dann noch die Zeile userChrome.import("*", "UChrm"); ?
Wäre für mich eine zusätzliche, potentielle Fehlerquelle...
warum dann noch die Zeile
Ich habe meine Skripte alle im Ordner chrome.
Nur für den Test habe ich 2 im Ordner Skripte.
Wenn alle im Ordner Skripte sind, dann braucht es diese Zeile nicht mehr.
Habt ihr geprüft, dass die Scripts deswegen nicht doppelt ausgeführt werden? Das müsste theoretisch ja durch console.log() und einen Blick in die Konsole prüfbar sein. Denn das wäre in der Tat eine potentielle Problemquelle. Ich kann's hier leider nicht prüfen.
dass die Scripts deswegen nicht doppelt ausgeführt werden?
Hallo Sören.
Ich habe mal alle Skripte aus dem Ordner chrome entfernt.
In der userChrome.js steht nur:
Im Ordner Skripte sind diese 3 Skripte vorhanden:
Sie funktionieren auch:
Und so sieht das in der Konsole dann aus:
Es sind nur die 3 Skripte vorhanden.
Bitte erleuchtet mich.
Wenn Ihr mit einem Unterordner Skripte arbeitet,
warum dann noch die Zeile userChrome.import("*", "UChrm"); ?
Wäre für mich eine zusätzliche, potentielle Fehlerquelle...
Also, ich habe alle JavaScripte in das Verzeichnis scripts geschoben.
Der Eintrag userChrome.import("*", "UChrm") verweilt nur deshalb noch in der userChrome.js,
weil ich neu Scripte, an denen ich noch bastele direkt in chrome erst ein mal ablege.
So ist das "Bastelscript" für mich "schneller" auffindbar.
Äh, und Danke 2002Andreas dafür, dass Du nochmals den Inhalt Deiner userChrome.js gezeigt hast.
Jetzt weiß ich auch, was ich andauernd falsch gemacht habe!
userChrome.import("scripts/*", "UChrm");
oder
userChrome.import("/scripts/*", "UChrm");
aber auch
userChrome.import("./scripts/*", "UChrm");
Alles ausprobiert, aber einfach mal nur "scripts" zu probieren, nee, darauf bin ich nicht gekommen,
und keiner hat es gesehen.
Egal, jetzt klappt es ja.
So ist das "Bastelscript" für mich "schneller" auffindbar.
Warum erstellst du dir nicht einfach ein weiteres Profil nur zum Testen
Und wenn das Skript fertig ist und funktioniert, dann fügst du es in dein Hauptprofil ein.
Zumindest ist dann das Risiko gering, dass du dir das Profil wieder zerlegst
So ist das "Bastelscript" für mich "schneller" auffindbar.
Warum erstellst du dir nicht einfach ein weiteres Profil nur zum Testen
Und wenn das Skript fertig ist und funktioniert, dann fügst du es in dein Hauptprofil ein.
Zumindest ist dann das Risiko gering, dass du dir das Profil wieder zerlegst
Stimmt, darüber sollte ich mal nachdenken.
Das aktuelle Profil clonen, damit ich auch gleich sehe, ob sich da irgendetwas ins Gehege kommt.
Aber z.Z. sichere ich wie dolle.
Aber z.Z. sichere ich wie dolle.
Das aktuelle Profil clonen
Ich nutze ein fast neues Profil ohne jegliche Änderung.
Dann ein weiteres mit div. Änderungen und Anpassungen.
Und dann mein Hauptprofil.
Und nur was in den beiden ersten funktioniert, kommt dann ins Hauptprofil.
Aber z.Z. sichere ich wie dolle.
Auch dafür gibts ein Script
// ==UserScript==
// @name BackupProfile.uc.js
// @namespace BackupProfile.github.com
// @description Schaltfläche zum Sichern des Firefoxprofils
// @charset UTF-8
// @author ywzhaiqi、defpt
// @version v2018.01.10
// @note Vorlage Script von ywzhaiqi (+ Mischung aus diversen Varianten aus dem Fuchsforum 1.11.21)
// @note Sicherungsdatei enthaelt auch Profilname
// @reviewURL http://bbs.kafan.cn/thread-1758785-1-1.html
(function () {
Components.utils.import("resource:///modules/CustomizableUI.jsm");
CustomizableUI.createWidget({
id : "Backup-button",
defaultArea : CustomizableUI.AREA_NAVBAR,
label : "Profilsicherung",
tooltiptext : "Sichern der aktuellen Konfiguration",
onClick: function(){
// Speicherort - Ordner festlegen - Sichern funktioniert nur wenn Speicherort- bzw. Ordner vorhanden ist!!
var path = "G:\\Martin\\Sicherungen\\Firefox\\Firefox Sicherung\\Nightly\\";
// var path = "";
// Ausschlussliste
var excludes = 'bookmarkbackups *cache* crashes fftmp *healthreport* minidumps safebrowsing *webapps* saved-telemetry-pings *thumbnails* *session* *Telemetry* *hotfix* *.sqlite-shm *.sqlite-wal *.bak parent.lock blocklist.xml content-prefs.sqlite directoryLinks.json mimeTypes.rdf compatibility.ini parent.lock formhistory.sqlite';
if (!path) {
var nsIFilePicker = Ci.nsIFilePicker;
var FP = Cc['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
FP.init(window, 'Sicherungspfad wählen', nsIFilePicker.modeGetFolder);
if (FP.show() == nsIFilePicker.returnOK) {
path = FP.file.path;
} else {
return false;
}
}
excludes = excludes.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\s+/g, '|');
excludes = new RegExp(excludes, 'i');
var zw = Cc['@mozilla.org/zipwriter;1'].createInstance(Ci.nsIZipWriter);
var pr = {PR_RDONLY: 0x01, PR_WRONLY: 0x02, PR_RDWR: 0x04, PR_CREATE_FILE: 0x08, PR_APPEND: 0x10, PR_TRUNCATE: 0x20, PR_SYNC: 0x40, PR_EXCL: 0x80};
var fu = Cu.import('resource://gre/modules/FileUtils.jsm').FileUtils;
var dir = fu.getFile('ProfD', []);
let d = new Date();
d = d.getDate() + '.' + (d.getMonth() + 1).toString().padStart(2, '0') + '.' + d.getFullYear().toString().padStart(2, '0') + ' ' + d.getHours().toString().padStart(2, '0') + '\uA789' + d.getMinutes().toString().padStart(2, '0') + '\uA789' + d.getSeconds().toString().padStart(2, '0');
// Die folgende Zeile formt den Archivnamen
var archiveName = 'Profil Nightly ' + ' ' + d + '.zip'; /* 'd' ersetzt 'localnow' */
var xpi = fu.File(path + '\\' + archiveName);
zw.open(xpi, pr.PR_RDWR | pr.PR_CREATE_FILE | pr.PR_TRUNCATE);
var dirArr = [dir];
for (var i=0; i<dirArr.length; i++) {
var dirEntries = dirArr[i].directoryEntries;
while (dirEntries.hasMoreElements()) {
var entry = dirEntries.getNext().QueryInterface(Ci.nsIFile);
if (entry.path == xpi.path) {
continue;
}
if (entry.isDirectory()) {
dirArr.push(entry);
}
var relPath = entry.path.replace(dirArr[0].path, '');
if (relPath.match(excludes)) {
continue;
}
var saveInZipAs = relPath.substr(1);
saveInZipAs = saveInZipAs.replace(/\\/g,'/');
// Konfigurationsdateien können gesperrt werden
try {
zw.addEntryFile(saveInZipAs, Ci.nsIZipWriter.COMPRESSION_FASTEST, entry, false);
} catch (e) {}
}
}
zw.close();
alert('Die aktuelle Konfiguration wurde als:\n'+ archiveName +'\ngesichert in:\n' + path);
function alert(aString, aTitle) {
Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService).showAlertNotification("", aTitle, aString, false, "", null);
}
function bupgetCurrentProfileName(){
function readFile(aFile){
var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); stream.init(aFile, 0x01, 0, 0);
var cvstream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
cvstream.init(stream, "UTF-8", 1024, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
var content = "", data = {};
while (cvstream.readString(4096, data)) {
content += data.value;
}
cvstream.close();
return content.replace(/\r\n?/g, "\n");
}
var PrefD = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("PrefD", Components.interfaces.nsIFile);
var ini = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("AppRegD", Components.interfaces.nsIFile);
ini.append("profiles.ini");
var ini = readFile(ini);
var profiles = ini.match(/Name=.+/g);
var profilesD = ini.match(/Path=.+/g);
for ( var i = 0; i < profiles.length;i++) {
if ((profilesD[i]+"$").indexOf(PrefD.leafName+"$") >= 0) {
profiles[i].match(/Name=(.+)$/);
return RegExp.$1;
}
}
return null;
}
},
});
var cssStr = '@-moz-document url("chrome://browser/content/browser.xhtml"){'
+ '#Backup-button .toolbarbutton-icon {'
+ 'list-style-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1%2B%2FAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNC8xMS8wOGGVBZQAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABxklEQVQ4ja2UMUgbURjHfxeSFBzuBEuCkkAgIA5JDdzWohVnQe3UpRDE2UXpKKXdWro4ixlcdNJAydxiyHZkCIKIOEnLpZQSRFFz%2Bjqk73nvuDtb2j883nv%2F73u%2F%2B%2B69ewf%2FWUZgbgEFYDgiPw18B86An8DtQw%2BYdF1XRLVGoyGEEKJara4Bj0MKIhGYDxuGQVSTqtVqH0ql0uzvNzLigCQSicjmeZ7K63Q6u5VKZRoYigXGVWhZlpbbbrfrwKjfS4ZVGKVCoUCz2aTX65FOp6WdA04igf69CsqyLMrlctAWsRXGAf9EavXyFELEZT4A2TwYsLQKF%2BYXAJhb3VPep4%2BLzK3uqd7vS9Xr%2B2qsAW9u4eyoxcZSFoCVLZfTwxaA6v2xjaUsuYmnWrU60IOr%2FmD8etvl%2Fausikl%2FZcsFULEbD02hwPUdl7cvs1qiBAb9eOCdwdjEM2AABdh88wJA%2BbK%2FX6MDtVPmHyRPOfjRPfc87%2FPfgJLJ5AzwRc0BbNseB8a63e6TuKsXpnw%2BP5nJZAzgq%2BM4x3IPzwFM07woFovv%2Bv3%2BUDTiXqlU6tI0zQs%2FI%2FSe2bYt%2FyCPgJFA%2BAdwDeA4zrfg2l%2BwUqCoC1F3YQAAAABJRU5ErkJggg%3D%3D)'
+ '}}';
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
sss.loadAndRegisterSheet(ios.newURI("data:text/css;base64," + btoa(cssStr), null, null), sss.USER_SHEET);
})();
Alles anzeigen
Pfade und Beschriftungen sind anzupassen....
Ich habe mal alle Skripte aus dem Ordner chrome entfernt.
Damit gibt es ja nicht mehr das zu testen, worum es mir ging. Es ging mir darum, ob dieser Code hier:
… die Scripts doppelt einbindet oder ob der Script-Loader garantiert, dass das nicht passiert. Sollten die Scripts doppelt eingebunden werden, würde ich davon abraten, den Universal-Import via Stern und gleichzeitig noch Einzel-Importe zu verwenden.
die Scripts doppelt einbindet
Die unteren 3 Skripte sind im Ordner Skripte, die anderen im Ordner chrome.
So sieht das aus:
Sie sind nur 1x vorhanden im Log.
Ich weiß nicht, ob Firefox mehrfach versucht, die Option zu schreiben, wenn das Script mehrfach geladen wird. Ich würde, um sicher zu gehen, in jedes Script ein console.log('name des scripts') einbauen und prüfen, ob das für irgendein Script mehrfach geloggt wird. Wenn nicht, scheint mir alles gut zu sein.
Ich würde, um sicher zu gehen, in jedes Script ein console.log('name des scripts') einbauen und prüfen, ob das für irgendein Script mehrfach geloggt wird. Wenn nicht, scheint mir alles gut zu sein.
Das mehrfache Laden eines Skripts passiert auch mit dem Standard-Aufruf (meist 2x).
Deshalb sollte in jedem Skript auch ganz am Anfang so was wie:
if (location != 'chrome://browser/content/browser.xhtml') return;
oder
if (!window.gBrowser){ return; }
stehen, was bei mehrfachem Aufruf das Skript beendet...
Den genauen Grund weiß ich nicht. Hatte mal gedacht, es hängt mit der Anzahl der Fenster zusammen, aber auch bei nur einem Fenster wird das Skript mehrfach aufgerufen. Vielleicht weiß ja aborix mehr darüber, der hat ja, soweit ich weiß, am Loader mitgearbeitet...
Also, ich habe alle JavaScripte in das Verzeichnis scripts geschoben.
Der Eintrag userChrome.import("*", "UChrm") verweilt nur deshalb noch in der userChrome.js,
weil ich neu Scripte, an denen ich noch bastele direkt in chrome erst ein mal ablege.
So ist das "Bastelscript" für mich "schneller" auffindbar.
Faule Socke
Aber das ist für mich nachvollziehbar.
Genauso wie die Vorgehensweise von 2002Andreas .
Auch die Einwürfe von Sören Hentzschel sind wieder sehr interessant.
Danke, meinereiner fühlt sich erleuchtet.
Auch dafür gibts ein Script
JavaScript Alles anzeigen// ==UserScript== // @name BackupProfile.uc.js // @namespace BackupProfile.github.com // @description Schaltfläche zum Sichern des Firefoxprofils // @charset UTF-8 // @author ywzhaiqi、defpt // @version v2018.01.10 // @note Vorlage Script von ywzhaiqi (+ Mischung aus diversen Varianten aus dem Fuchsforum 1.11.21) // @note Sicherungsdatei enthaelt auch Profilname // @reviewURL http://bbs.kafan.cn/thread-1758785-1-1.html (function () { Components.utils.import("resource:///modules/CustomizableUI.jsm"); CustomizableUI.createWidget({ id : "Backup-button", defaultArea : CustomizableUI.AREA_NAVBAR, label : "Profilsicherung", tooltiptext : "Sichern der aktuellen Konfiguration", onClick: function(){ // Speicherort - Ordner festlegen - Sichern funktioniert nur wenn Speicherort- bzw. Ordner vorhanden ist!! var path = "G:\\Martin\\Sicherungen\\Firefox\\Firefox Sicherung\\Nightly\\"; // var path = ""; // Ausschlussliste var excludes = 'bookmarkbackups *cache* crashes fftmp *healthreport* minidumps safebrowsing *webapps* saved-telemetry-pings *thumbnails* *session* *Telemetry* *hotfix* *.sqlite-shm *.sqlite-wal *.bak parent.lock blocklist.xml content-prefs.sqlite directoryLinks.json mimeTypes.rdf compatibility.ini parent.lock formhistory.sqlite'; if (!path) { var nsIFilePicker = Ci.nsIFilePicker; var FP = Cc['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker); FP.init(window, 'Sicherungspfad wählen', nsIFilePicker.modeGetFolder); if (FP.show() == nsIFilePicker.returnOK) { path = FP.file.path; } else { return false; } } excludes = excludes.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\s+/g, '|'); excludes = new RegExp(excludes, 'i'); var zw = Cc['@mozilla.org/zipwriter;1'].createInstance(Ci.nsIZipWriter); var pr = {PR_RDONLY: 0x01, PR_WRONLY: 0x02, PR_RDWR: 0x04, PR_CREATE_FILE: 0x08, PR_APPEND: 0x10, PR_TRUNCATE: 0x20, PR_SYNC: 0x40, PR_EXCL: 0x80}; var fu = Cu.import('resource://gre/modules/FileUtils.jsm').FileUtils; var dir = fu.getFile('ProfD', []); let d = new Date(); d = d.getDate() + '.' + (d.getMonth() + 1).toString().padStart(2, '0') + '.' + d.getFullYear().toString().padStart(2, '0') + ' ' + d.getHours().toString().padStart(2, '0') + '\uA789' + d.getMinutes().toString().padStart(2, '0') + '\uA789' + d.getSeconds().toString().padStart(2, '0'); // Die folgende Zeile formt den Archivnamen var archiveName = 'Profil Nightly ' + ' ' + d + '.zip'; /* 'd' ersetzt 'localnow' */ var xpi = fu.File(path + '\\' + archiveName); zw.open(xpi, pr.PR_RDWR | pr.PR_CREATE_FILE | pr.PR_TRUNCATE); var dirArr = [dir]; for (var i=0; i<dirArr.length; i++) { var dirEntries = dirArr[i].directoryEntries; while (dirEntries.hasMoreElements()) { var entry = dirEntries.getNext().QueryInterface(Ci.nsIFile); if (entry.path == xpi.path) { continue; } if (entry.isDirectory()) { dirArr.push(entry); } var relPath = entry.path.replace(dirArr[0].path, ''); if (relPath.match(excludes)) { continue; } var saveInZipAs = relPath.substr(1); saveInZipAs = saveInZipAs.replace(/\\/g,'/'); // Konfigurationsdateien können gesperrt werden try { zw.addEntryFile(saveInZipAs, Ci.nsIZipWriter.COMPRESSION_FASTEST, entry, false); } catch (e) {} } } zw.close(); alert('Die aktuelle Konfiguration wurde als:\n'+ archiveName +'\ngesichert in:\n' + path); function alert(aString, aTitle) { Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService).showAlertNotification("", aTitle, aString, false, "", null); } function bupgetCurrentProfileName(){ function readFile(aFile){ var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); stream.init(aFile, 0x01, 0, 0); var cvstream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream); cvstream.init(stream, "UTF-8", 1024, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); var content = "", data = {}; while (cvstream.readString(4096, data)) { content += data.value; } cvstream.close(); return content.replace(/\r\n?/g, "\n"); } var PrefD = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("PrefD", Components.interfaces.nsIFile); var ini = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("AppRegD", Components.interfaces.nsIFile); ini.append("profiles.ini"); var ini = readFile(ini); var profiles = ini.match(/Name=.+/g); var profilesD = ini.match(/Path=.+/g); for ( var i = 0; i < profiles.length;i++) { if ((profilesD[i]+"$").indexOf(PrefD.leafName+"$") >= 0) { profiles[i].match(/Name=(.+)$/); return RegExp.$1; } } return null; } }, }); var cssStr = '@-moz-document url("chrome://browser/content/browser.xhtml"){' + '#Backup-button .toolbarbutton-icon {' + 'list-style-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1%2B%2FAAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNC8xMS8wOGGVBZQAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABxklEQVQ4ja2UMUgbURjHfxeSFBzuBEuCkkAgIA5JDdzWohVnQe3UpRDE2UXpKKXdWro4ixlcdNJAydxiyHZkCIKIOEnLpZQSRFFz%2Bjqk73nvuDtb2j883nv%2F73u%2F%2B%2B69ewf%2FWUZgbgEFYDgiPw18B86An8DtQw%2BYdF1XRLVGoyGEEKJara4Bj0MKIhGYDxuGQVSTqtVqH0ql0uzvNzLigCQSicjmeZ7K63Q6u5VKZRoYigXGVWhZlpbbbrfrwKjfS4ZVGKVCoUCz2aTX65FOp6WdA04igf69CsqyLMrlctAWsRXGAf9EavXyFELEZT4A2TwYsLQKF%2BYXAJhb3VPep4%2BLzK3uqd7vS9Xr%2B2qsAW9u4eyoxcZSFoCVLZfTwxaA6v2xjaUsuYmnWrU60IOr%2FmD8etvl%2Fausikl%2FZcsFULEbD02hwPUdl7cvs1qiBAb9eOCdwdjEM2AABdh88wJA%2BbK%2FX6MDtVPmHyRPOfjRPfc87%2FPfgJLJ5AzwRc0BbNseB8a63e6TuKsXpnw%2BP5nJZAzgq%2BM4x3IPzwFM07woFovv%2Bv3%2BUDTiXqlU6tI0zQs%2FI%2FSe2bYt%2FyCPgJFA%2BAdwDeA4zrfg2l%2BwUqCoC1F3YQAAAABJRU5ErkJggg%3D%3D)' + '}}'; var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); sss.loadAndRegisterSheet(ios.newURI("data:text/css;base64," + btoa(cssStr), null, null), sss.USER_SHEET); })();
Pfade und Beschriftungen sind anzupassen....
Ich nutze dafür ein ewig altes Tool von Caschy. 10, Okt, 2009
(https://stadt-bremerhaven.de/firesave-1-0-d…er-den-firefox/)
Da wird man bei Erstbenutzung nach den Pfaden gefragt
und es wird eine editierbare *.ini erstellt.
Wer damit nicht klarkommt, also mit dem editieren, löscht diese einfach wieder,
sollten sich die Pfade geändert haben.
Habe nun ein Testprofil, eine Kopie meines Hauptprofils, angelegt.
Zusätzlich habe ich noch ein "nacktes" Profil, also ohne Anpassungen,
nur vorbereitet, dass CSS und JavaScript funktioniert.
Habe nun ein Testprofil
Sehr gut
Zusätzlich habe ich noch ein "nacktes" Profil
Und damit würde ich immer als erstes testen, egal ob CSS oder Skripte.
ein ewig altes Tool von Caschy.
Das nutze ich u.a. auch seit damals, und noch weitere.
Ich nutze dafür ein ewig altes Tool von Caschy. 10, Okt, 2009
Dies habe ich auch sehr lange benutzt! Da es aber ein ausgelagertes Programm ist und zudem nicht weiterentwickelt ( ggf. Sicherheitslücken!?) wird, habe ich irgendwann die interne Scriptlösung übernommen.
Ein Programm wie Firesave zu nutzen, ist in meinen Augen sowieso unnötig. Wieso braucht man bitte ein Programm, um einen Ordner zu sichern? Kopieren kann jedes Betriebssystem von Haus aus. Und selbst wenn man ein Programm nutzen wollte: Jedes vernünftige Backup-Programm lässt einen auswählen, was man sichern möchte. Speziell für Firefox benötigt man also auch nichts, wenn man sich sowieso schon über Firefox hinaus um Backups kümmert - was man wirklich tun sollte.
und noch weitere.
Guten Morgen!
Du kannst es ruhig weiter geben, für mich einfach die beste Lösung. Vor der Bastelei ein Knopfdruck, nach Fehler erneuter Knopfdruck, und Ruhe ist.
Du kannst es ruhig weiter geben
Danke.
Aber es war deine Zeit und Mühe es zu erstellen.
Außerdem könntest du bei Fragen dazu sicherlich besser helfen als ich
Funktionieren tut es zu 100% perfekt.