Parameterübergabe an Fremdprogramme

Aktuelle Version: 12.26 (02.12.2021)
Alles zum Thema Directory Opus
Antworten
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hallo Listlinge,

mein Ziel ist es, eine oder mehrere ausgewählte Dateien mittels eines Schalters von einem Fremdprogramm weiter bearbeiten zu lassen.

Angefangen habe ich mit den DAEMON Tools. Ich wähle eine Imagedatei aus und binde diese mit:

Code: Alles auswählen

"D:\CD-DVD\DAEMON Tools Ultra\DTCommandLine.exe" --mount --path "{filepath$}"
als virtuelles Laufwerk ein. Das funktioniert und es wird automatisch ein Laufwerksbuchstabe vergeben.
Nun möchte ich dieses virtuelle Laufwerk mittels eines Schalters auch wieder freigeben können.

Die Hilfeseite https://ultra.daemon-help.com/settings/command/ von DAEMON Tools gibt hierzu folgende Vorgaben:

-u or --unmount
Unmounts an image from a virtual drive.
Syntax: --unmount --letter "arg"
Options:
l or letter: device letter
Example (extended): DTCommandLine.exe --unmount --letter "M"
Example (simplified): DTCommandLine.exe -u -l "M"

Dazu benötige ich also den Laufwerksbuchstaben der markierten, zu lösenden Imagedatei als Übergabeparameter. Und hier komme ich einfach nicht weiter. Bisher löse ich das mit:

Code: Alles auswählen

"D:\CD-DVD\DAEMON Tools Ultra\DTCommandLine.exe" --unmount_all
Man könnte in den beiden Schaltern auch feste Laufwerksbuchstaben vergeben, aber vielleicht klappt das ja, wenn ich die richtigen Variablen kenne.

MfG

josinoro
Benutzeravatar
Nobmen
Boardbetreuer
Beiträge: 1159
Registriert: 26. Jun 2004 08:48
Betriebssystem: Win 10 Home/Pro 32/64bit
Edition: Pro
Kontaktdaten:

Re: Parameterübergabe an Fremdprogramme

Beitrag von Nobmen »

dt wurde damals über jahre hinweg genutzt.
dann wurde etwas von jahren intern bei dt umgebaut das etliche probleme bei dopus verursachte!
die eigene buchstabenzuweisung ging z.b. nicht mehr wie gewünscht.
da dopus+windows intern iso (hauptnutzung) und andere container verwalten kann (anmelden/entfernen) wurde DT bei mir entfernt.

hinwies:
damals entsprach die anleitung nicht den intern commands
und funktionierte daher nicht.

funktioniert den der rechtklick mit "auswerfen" auf das eingebundete Laufwerk nicht?
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hallo Nobmen,
danke für deine Antwort.
Nobmen hat geschrieben: 23. Okt 2021 15:00 funktioniert den der rechtklick mit "auswerfen" auf das eingebundete Laufwerk nicht?
Doch, das funktioniert einwandfrei. Auch die Zuweisung und die Freigabe mit einem festen Laufwerksbuchstaben funktioniert. Ich dachte nur, dass es eine Möglichkeit gibt, nur den Laufwerksbuchstaben von der markierten Datei oder dem virtuellen Laufwerk in ein Skript mit aufzunehmen.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Man kann da viel machen.. o))
Hier mal zwei Buttons die ich nehme um RDrive-Images an/abzumelden.
Habe ich lange nicht benutzt, aber funktionieren vermutlich, vielleicht kannst Du die ausschlachten/umbauen.

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="none" display="both" label_pos="right" textcol="none">
	<label>Mount RDriveImage image..</label>
	<icon1>#mapnetworkdrive</icon1>
	<function type="script">
		<instruction>@script JScript</instruction>
		<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
		<instruction>function OnClick(data){</instruction>
		<instruction>	var f = data.func, c = f.command, tab = f.sourcetab, path2 = &quot;&quot;+tab.path;</instruction>
		<instruction>	var root = (tab.path.Root() &amp;&amp; tab.path) || tab.path, subpath = (&quot;&quot;+path2).replace(root,&quot;&quot;);</instruction>
		<instruction />
		<instruction>	if (tab.selected_files.count == 0){</instruction>
		<instruction>		DOpus.Output(&quot;No file selected&quot;);</instruction>
		<instruction>		return false;</instruction>
		<instruction>	}</instruction>
		<instruction>	if (tab.selected_files.count &gt; 1){</instruction>
		<instruction>		DOpus.Output(&quot;Too many files selected&quot;);</instruction>
		<instruction>		return false;</instruction>
		<instruction>	}</instruction>
		<instruction />
		<instruction>	var letter = chooseAvailableDriveLetter();</instruction>
		<instruction>	if (!letter) {</instruction>
		<instruction>		DOpus.Output(&quot;Selection aborted.&quot;);</instruction>
		<instruction>		return false;</instruction>
		<instruction>	}</instruction>
		<instruction />
		<instruction>	DOpus.Output(&quot;Ok, mounting &quot; + tab.selected_files(0).realpath + &quot; to &quot; + letter + &quot;:..&quot;);</instruction>
		<instruction />
		<instruction>	var exePath = DOpus.FSUtil.Resolve(&quot;/rdriveimage&quot;);</instruction>
		<instruction>	var exeFullPath = exePath + &quot;\\r-driveimagecl.exe&quot;;</instruction>
		<instruction>	if (!DOpus.FSUtil.exists(exeFullPath)) {</instruction>
		<instruction>		DOpus.Output(&quot;Cannot find &quot; + exeFullPath);</instruction>
		<instruction>		return false;</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	var cmdLine = &quot;&quot;;</instruction>
		<instruction>	cmdLine += &apos;&quot;&apos;+exeFullPath+&apos;&quot; &apos;;</instruction>
		<instruction>	cmdLine += &apos;mount -a=&quot;&apos;+tab.selected_files(0).realpath+&apos;&quot; &apos;;</instruction>
		<instruction>	cmdLine += &apos;-s=0:0 &apos;; //disk0, partition0 oder so..</instruction>
		<instruction>	cmdLine += &apos;-lr=&apos;+letter;</instruction>
		<instruction />
		<instruction>	DOpus.Output(&quot;CmdLine: &quot; + cmdLine);</instruction>
		<instruction>	c.RunCommand(cmdLine);</instruction>
		<instruction>	</instruction>
		<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(tab.path)+&apos;&quot;&apos;); //regular &quot;Go SWITCHPATH&quot; mode</instruction>
		<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(root)+subpath+&apos;&quot;&apos;); //keep subfolders, loop roots only</instruction>
		<instruction>}</instruction>
		<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function getUsedUnusedDriveLetters() {</instruction>
		<instruction>//##############################################################################	</instruction>
		<instruction>	var Drive = function(letter, label){</instruction>
		<instruction>		this.letter = letter;</instruction>
		<instruction>		this.label = label;</instruction>
		<instruction>		this.toString = function(){ return this.letter; };</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	var arrayObjectToString = function toString(){</instruction>
		<instruction>		for(var letters=&quot;&quot;, i=0;i&lt;this.length;i++) letters += this[i].letter + &quot;, &quot;;</instruction>
		<instruction>		return letters.replace(/, ?$/,&quot;&quot;); //trim trailing separator</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	var lettersInUse	= []; lettersInUse.toString		= arrayObjectToString;</instruction>
		<instruction>	var lettersNotInUse	= []; lettersNotInUse.toString	= arrayObjectToString;</instruction>
		<instruction>	var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);</instruction>
		<instruction>	var fsoDrive = null, letter, label, driveObject;</instruction>
		<instruction />
		<instruction>	for(var en=new Enumerator(fso.Drives); !en.atEnd(); en.moveNext()) {</instruction>
		<instruction>	    fsoDrive=en.item()</instruction>
		<instruction>		try{</instruction>
		<instruction>			letter = fsoDrive.DriveLetter;</instruction>
		<instruction>			label = fsoDrive.VolumeName || &quot;(unnamed)&quot;;</instruction>
		<instruction>		} catch(e){ //getting label can fail for weird drives</instruction>
		<instruction>			label = &quot;(unknown)&quot;;</instruction>
		<instruction>		}</instruction>
		<instruction>		driveObject = new Drive(letter, label);</instruction>
		<instruction>		lettersInUse[letter] = driveObject;</instruction>
		<instruction>		lettersInUse.push(driveObject);</instruction>
		<instruction>	    //objDrive.AvailableSpace, objDrive.DriveLetter, objDrive.DriveType</instruction>
		<instruction>	    //objDrive.FileSystem, objDrive.FreeSpace, objDrive.IsReady</instruction>
		<instruction>	    //objDrive.Path, objDrive.RootFolder, objDrive.SerialNumber</instruction>
		<instruction>	    //objDrive.ShareName, objDrive.TotalSize, objDrive.VolumeName</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	for(var i=65;i&lt;91;i++) {</instruction>
		<instruction>		letter = String.fromCharCode(i);</instruction>
		<instruction>		if (lettersInUse[letter]) continue;</instruction>
		<instruction>		driveObject = new Drive(letter, &quot;&quot;);</instruction>
		<instruction>		lettersNotInUse[letter] = driveObject;</instruction>
		<instruction>		lettersNotInUse.push(driveObject);</instruction>
		<instruction>	}</instruction>
		<instruction>	return { inUse: lettersInUse, notInUse: lettersNotInUse };</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>//##############################################################################</instruction>
		<instruction>function getUsedUnusedDriveLettersDemo() {</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
		<instruction>	DOpus.Output(&quot;Drives/Letters:&quot;);</instruction>
		<instruction>	DOpus.Output(&quot;    in use         : &quot; + result.inUse+ &quot; (&quot;+result.inUse.length+&quot;)&quot;);</instruction>
		<instruction>	DOpus.Output(&quot;    free/not used  : &quot; + result.notInUse + &quot; (&quot;+result.notInUse.length+&quot;)&quot;);</instruction>
		<instruction>	DOpus.Output(&quot;    by letter      : &quot; + result.inUse[&quot;C&quot;].letter + &quot;: &quot; + result.inUse[&quot;C&quot;].label);</instruction>
		<instruction>	DOpus.Output(&quot;    letter &amp; label : &quot; + result.inUse[1].letter + &quot;: &quot; + result.inUse[1].label);</instruction>
		<instruction>	DOpus.Output(&quot;    letter.toString: &quot; + result.inUse[1]);</instruction>
		<instruction>}</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function OpenMenu(dlg, type, listEntries){</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	dlg.title = &quot;Select drive letter&quot;;</instruction>
		<instruction>	dlg.message = &quot;Available letters:&quot;; //Check filters to &quot;+filterFlags.replace(&quot;,&quot;,&quot;, &quot;)+&quot; items:&quot;</instruction>
		<instruction>	dlg.buttons = &quot;Ok|Cancel&quot;;</instruction>
		<instruction>	dlg.choices = listEntries;</instruction>
		<instruction>	//if (type==&quot;list&quot;) 	{	dlg.list = 0; dlg.menu = 0;}</instruction>
		<instruction>	if (type==&quot;dropdown&quot;)	dlg.menu = 0;</instruction>
		<instruction>	if (type==&quot;multilist&quot;)	dlg.list = 0;</instruction>
		<instruction>	dlg.Show();</instruction>
		<instruction>	return dlg.selection; //dlg.selection = 0-indexed, dlg.result = 1-indexed (wot?);</instruction>
		<instruction>}</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function chooseAvailableDriveLetter() {</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	var list = DOpus.Create.Vector();</instruction>
		<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
		<instruction>	for(var i=0;i&lt;result.notInUse.length;i++) list.push_back(result.notInUse[i].letter)</instruction>
		<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
		<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
		<instruction>	if (letterIndex == -1) return null;</instruction>
		<instruction>	var letter = result.notInUse[letterIndex];</instruction>
		<instruction>	return letter;</instruction>
		<instruction>}</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function chooseOccupiedDriveLetter() {</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	var list = DOpus.Create.Vector();</instruction>
		<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
		<instruction>	for(var i=0;i&lt;result.inUse.length;i++) list.push_back(result.inUse[i].letter)</instruction>
		<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
		<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
		<instruction>	if (letterIndex == -1) return null;</instruction>
		<instruction>	var letter = result.inUse[letterIndex];</instruction>
		<instruction>	return letter;</instruction>
		<instruction>}</instruction>
	</function>
</button>

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="none" display="both" label_pos="right" textcol="none">
	<label>UnMount RDriveImage image..</label>
	<icon1>#mapnetworkdrive</icon1>
	<function type="script">
		<instruction>@script JScript</instruction>
		<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
		<instruction>function OnClick(data){</instruction>
		<instruction>	var f = data.func, c = f.command, tab = f.sourcetab, path2 = &quot;&quot;+tab.path;</instruction>
		<instruction>	var root = (tab.path.Root() &amp;&amp; tab.path) || tab.path, subpath = (&quot;&quot;+path2).replace(root,&quot;&quot;);</instruction>
		<instruction />
		<instruction>	//there is no support for selected drives in &quot;my computer&quot; o(..</instruction>
		<instruction>	//DOpus.Output(&quot;Selected count: &quot;+tab.selected.count);</instruction>
		<instruction>	//if (tab.selected.count == 1){</instruction>
		<instruction>	//	DOpus.Output(&quot;1 item selected&quot;);</instruction>
		<instruction>	//	return false;</instruction>
		<instruction>	//}</instruction>
		<instruction />
		<instruction>	var letter = chooseOccupiedDriveLetter();</instruction>
		<instruction>	if (!letter) {</instruction>
		<instruction>		DOpus.Output(&quot;Selection aborted.&quot;);</instruction>
		<instruction>		return false;</instruction>
		<instruction>	}</instruction>
		<instruction />
		<instruction>	DOpus.Output(&quot;Ok, unmounting &quot; + letter + &quot;:..&quot;);</instruction>
		<instruction />
		<instruction>	var exePath = DOpus.FSUtil.Resolve(&quot;/rdriveimage&quot;);</instruction>
		<instruction>	var exeFullPath = exePath + &quot;\\r-driveimagecl.exe&quot;;</instruction>
		<instruction>	if (!DOpus.FSUtil.exists(exeFullPath)) {</instruction>
		<instruction>		DOpus.Output(&quot;Cannot find &quot; + exeFullPath);</instruction>
		<instruction>		return false;</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	var cmdLine = &quot;&quot;;</instruction>
		<instruction>	cmdLine += &apos;&quot;&apos;+exeFullPath+&apos;&quot; &apos;;</instruction>
		<instruction>	cmdLine += &apos;unmount &apos;;</instruction>
		<instruction>	cmdLine += &apos;-lr=&apos;+letter;</instruction>
		<instruction />
		<instruction>	DOpus.Output(&quot;CmdLine: &quot; + cmdLine);</instruction>
		<instruction>	c.RunCommand(cmdLine);</instruction>
		<instruction>	</instruction>
		<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(tab.path)+&apos;&quot;&apos;); //regular &quot;Go SWITCHPATH&quot; mode</instruction>
		<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(root)+subpath+&apos;&quot;&apos;); //keep subfolders, loop roots only</instruction>
		<instruction>}</instruction>
		<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function getUsedUnusedDriveLetters() {</instruction>
		<instruction>//##############################################################################	</instruction>
		<instruction>	var Drive = function(letter, label){</instruction>
		<instruction>		this.letter = letter;</instruction>
		<instruction>		this.label = label;</instruction>
		<instruction>		this.toString = function(){ return this.letter; };</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	var arrayObjectToString = function toString(){</instruction>
		<instruction>		for(var letters=&quot;&quot;, i=0;i&lt;this.length;i++) letters += this[i].letter + &quot;, &quot;;</instruction>
		<instruction>		return letters.replace(/, ?$/,&quot;&quot;); //trim trailing separator</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	var lettersInUse	= []; lettersInUse.toString		= arrayObjectToString;</instruction>
		<instruction>	var lettersNotInUse	= []; lettersNotInUse.toString	= arrayObjectToString;</instruction>
		<instruction>	var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);</instruction>
		<instruction>	var fsoDrive = null, letter, label, driveObject;</instruction>
		<instruction />
		<instruction>	for(var en=new Enumerator(fso.Drives); !en.atEnd(); en.moveNext()) {</instruction>
		<instruction>	    fsoDrive=en.item()</instruction>
		<instruction>		try{</instruction>
		<instruction>			letter = fsoDrive.DriveLetter;</instruction>
		<instruction>			label = fsoDrive.VolumeName || &quot;(unnamed)&quot;;</instruction>
		<instruction>		} catch(e){ //getting label can fail for weird drives</instruction>
		<instruction>			label = &quot;(unknown)&quot;;</instruction>
		<instruction>		}</instruction>
		<instruction>		driveObject = new Drive(letter, label);</instruction>
		<instruction>		lettersInUse[letter] = driveObject;</instruction>
		<instruction>		lettersInUse.push(driveObject);</instruction>
		<instruction>	    //objDrive.AvailableSpace, objDrive.DriveLetter, objDrive.DriveType</instruction>
		<instruction>	    //objDrive.FileSystem, objDrive.FreeSpace, objDrive.IsReady</instruction>
		<instruction>	    //objDrive.Path, objDrive.RootFolder, objDrive.SerialNumber</instruction>
		<instruction>	    //objDrive.ShareName, objDrive.TotalSize, objDrive.VolumeName</instruction>
		<instruction>	}</instruction>
		<instruction>	</instruction>
		<instruction>	for(var i=65;i&lt;91;i++) {</instruction>
		<instruction>		letter = String.fromCharCode(i);</instruction>
		<instruction>		if (lettersInUse[letter]) continue;</instruction>
		<instruction>		driveObject = new Drive(letter, &quot;&quot;);</instruction>
		<instruction>		lettersNotInUse[letter] = driveObject;</instruction>
		<instruction>		lettersNotInUse.push(driveObject);</instruction>
		<instruction>	}</instruction>
		<instruction>	return { inUse: lettersInUse, notInUse: lettersNotInUse };</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>//##############################################################################</instruction>
		<instruction>function getUsedUnusedDriveLettersDemo() {</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
		<instruction>	DOpus.Output(&quot;Drives/Letters:&quot;);</instruction>
		<instruction>	DOpus.Output(&quot;    in use         : &quot; + result.inUse+ &quot; (&quot;+result.inUse.length+&quot;)&quot;);</instruction>
		<instruction>	DOpus.Output(&quot;    free/not used  : &quot; + result.notInUse + &quot; (&quot;+result.notInUse.length+&quot;)&quot;);</instruction>
		<instruction>	DOpus.Output(&quot;    by letter      : &quot; + result.inUse[&quot;C&quot;].letter + &quot;: &quot; + result.inUse[&quot;C&quot;].label);</instruction>
		<instruction>	DOpus.Output(&quot;    letter &amp; label : &quot; + result.inUse[1].letter + &quot;: &quot; + result.inUse[1].label);</instruction>
		<instruction>	DOpus.Output(&quot;    letter.toString: &quot; + result.inUse[1]);</instruction>
		<instruction>}</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function OpenMenu(dlg, type, listEntries){</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	dlg.title = &quot;Select drive letter&quot;;</instruction>
		<instruction>	dlg.message = &quot;Available letters:&quot;; //Check filters to &quot;+filterFlags.replace(&quot;,&quot;,&quot;, &quot;)+&quot; items:&quot;</instruction>
		<instruction>	dlg.buttons = &quot;Ok|Cancel&quot;;</instruction>
		<instruction>	dlg.choices = listEntries;</instruction>
		<instruction>	//if (type==&quot;list&quot;) 	{	dlg.list = 0; dlg.menu = 0;}</instruction>
		<instruction>	if (type==&quot;dropdown&quot;)	dlg.menu = 0;</instruction>
		<instruction>	if (type==&quot;multilist&quot;)	dlg.list = 0;</instruction>
		<instruction>	dlg.Show();</instruction>
		<instruction>	return dlg.selection; //dlg.selection = 0-indexed, dlg.result = 1-indexed (wot?);</instruction>
		<instruction>}</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function chooseAvailableDriveLetter() {</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	var list = DOpus.Create.Vector();</instruction>
		<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
		<instruction>	for(var i=0;i&lt;result.notInUse.length;i++) list.push_back(result.notInUse[i].letter)</instruction>
		<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
		<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
		<instruction>	if (letterIndex == -1) return null;</instruction>
		<instruction>	var letter = result.notInUse[letterIndex];</instruction>
		<instruction>	return letter;</instruction>
		<instruction>}</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>function chooseOccupiedDriveLetter() {</instruction>
		<instruction>//##############################################################################</instruction>
		<instruction>	var list = DOpus.Create.Vector();</instruction>
		<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
		<instruction>	for(var i=0;i&lt;result.inUse.length;i++) list.push_back(result.inUse[i].letter)</instruction>
		<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
		<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
		<instruction>	if (letterIndex == -1) return null;</instruction>
		<instruction>	var letter = result.inUse[letterIndex];</instruction>
		<instruction>	return letter;</instruction>
		<instruction>}</instruction>
	</function>
</button>
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hallo tbone,

vielen Dank für deine Antwort.

Das in mich gesetzte Vertrauen in meine Programmierkünste ehrt mich. Allerdings zu unrecht.

Die beiden Schalter habe ich erstmal ausprobiert. Es erfolgt keine Funktion.0
Lediglich beim Unmount werde ich nach dem Laufwerksbuchstaben gefragt, wobei auch ein von R-Drive eingebundenes Image in der Liste erscheint. Ein Freigeben ist aber nicht möglich. Das muss dann wieder direkt von R-Drive aus gemacht werden.
Beim Einbinden erfolgt keinerlei Reaktion. Selbst provozierte Fehler durch Anwahl mehrerer Dateien, bewirken keine Reaktion.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Mal in die Konsole von DO gucken, vll sind dort Scriptfehler zu finden, ansonsten ran an die Tasten und ein paar Debug-Ausgaben einbauen und gucken, wo es hängt oder verfrüht aussteigt. Ich kann Dir das jetzt leider nicht an DT anpassen und fertig machen. Ich nutze DT nicht, ich nehme "MagicDisk". In den Buttons ist jedenfalls schon ein Haufen Code und vielleicht auch sogar schon alles drin, was Du brauchst. Irgendwann muss jeder mit dem Scripten anfangen.. o)

Falls nicht, DO hat glaube ich auch Unterstützung für Variablen "ohne Scripting", um bspw. den Laufwerksbuchstaben zu merken oder ähnlich. Umgebungsvariablen (ala DOS) gibt es auch noch, aber bevor man damit und den Standard-Buttons rumversucht, ist das mit dem JScript vielleicht doch einfacher. Versuch' mal! o)
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Vll später die Tage nochmal anklopfen, wenn Du nicht weiterkommst.
Ich scripte derzeit etwas für den jDownloader, ganz andere Baustelle, muss ich erstmal fertig kriegen! o)
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hallo tbone,

da ich die Fehlermeldungen in einem Ausgabefenster erwartet hatte, muss ich mich korrigieren. In der Konsole werden die Fehler korrekt angezeigt.
Lediglich der Pfad zu R-DriveImage unterscheidet sich von dem aus deinem Skript. Nachdem ich das mit dem doppelten Backslash gerafft hatte, arbeiten beide Schalter augenscheinlich fehlerfrei den Code ab. Nur, es wird kein Image eingebunden und auch kein von R-DriveImage eingebundenes Image freigegeben. In der Konsole bekomme ich nur die Bestätigung:

Mount:
Ok, mounting S:\R-DriveImage\_Images\LW-D-image_20210917221503_1_1.rdr to R:..
CmdLine: "D:\Backup\R-Drive Image\r-driveimagecl.exe" mount -a="S:\R-DriveImage\_Images\LW-D-image_20210917221503_1_1.rdr" -s=0:0 -lr=R

Unmount:
Ok, unmounting R:..
CmdLine: "D:\Backup\R-Drive Image\r-driveimagecl.exe" unmount -lr=R


____________________________________________________________________________
Ich scripte derzeit etwas für den jDownloader, ganz andere Baustelle, muss ich erstmal fertig kriegen! o)
hört sich auch interessant an. :)
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Die Commandlines sehen doch schonmal gut aus.. ich würde die mal noch in eine richtige Eingabeaufforderung pasten und gucken was da passiert.

Mit dem jDownloader ja, die Scripting-Schnittstelle (API) habe ich erst letzte Woche zufällig gefunden und versuche da mal einzubauen, dass der fertige Downloads in einen anderen Ordner verschiebt UND entpackt vorher und das Archiv löscht, falls erfolgreich entpackt und die fertigen Downloads in eine Datei eintragen, damit man gleich beim LinkGrabber schon sieht, aahh.. das hatte ich ja schon runtergeladen.
Irgendwie ganz simple Sachen, die aber komischerweise nicht so eingebaut werden, nun. o)
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Den so zusammengestrickten Aufruf im Kommandofenster eingegeben, führt zur Fehlermeldung:

! Access Denied. Administrator permissions are needed to use the selected options. Use an administrator command prompt to complete these tasks.
! Operation failed: Access Denied. Administrator permissions are needed to use the selected options. Use an administrator command prompt to complete these tasks.

Den Aufruf im Kommandofenster mit Adminrechten eingegeben, führt bei beiden Anweisungen zum gewünschten Erfolg. Daraufhin habe ich DOpus in den Administratormodus gesetzt und beide Schalter ausprobiert. So funktionieren beide Schalter einwandfrei. Jetzt stellt sich mir natürlich die Frage, wie man den Administratormodus im JScript formuliert?

Die nächsten Tage versuche ich mich an den DAEMON Tools.

Danke.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Da kann mann so einen Modifier setzen glaube ich "@admin" heisst der, guck mal in die Doku.
Ich habe mein System ohne diese ACL am Laufen, Admin rund um die Uhr, mich nervt das Nachgefrage. o)

Sehr gut soweit, freut mich dass Du Dir schon soweit selbst weitergeholfen hast, sehr prima! o)
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hm, jetzt habe ich einige Dinge erfolglos ausprobiert. Ich durchschaue das Objektmodell nicht und weiß nicht, welche Methode von welchem Objekt den DOpus in den Adminmodus versetzt.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Überall da wo im Code "c.RunCommand(..)" ausgeführt wird, muss dem "c", welches das Command Object ist, mitgeteilt werden, dass der auszuführende Befehl/die Befehle im "admin" Kontext laufen sollen.

Für den Code hier, müsste man also vor jede oben genannte Stelle, folgende Zeile einfügen:
c.SetModifier("@admin");
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hallo tbone,

das habe ich jetzt weiter versucht.

Bild

Ersetze ich c.SetModifier("@admin"); durch c.AddLine("@admin"); kommt keine Fehlermeldung, allerdings passiert auch nichts weiter.
Dateianhänge
DOpus-SetModifier01.png
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Probier mal ohne "@", das ist hier falsch, sorry, weil wir hier keine Batch bauen, sondern nur einen Befehl direkt losjagen, der "admin" Kontext muss also vorher schon direkt gesetzt werden.
c.SetModifier("admin");

Das "@" braucht man nur bei AddLine(..), damit DO seine speziellen Kommandos wiedererkennt, sobald er die mit AddLine() gebaute Befehlsabfolge ausführt. Es ist wie, als würde man "@admin" in einen Batch-Button schreiben.

Die DO-Script-Geschichten sind manchmal etwas esoterisch, aber wenn man die DO-Geschichte kennt, kann man das einordnen.
Jedenfalls gibt es 2 Varianten wie man Befehle über die DO-Scripting-API losschicken kann:

1. "Gesammelte" Ausführung mit "Run()" von mehreren Befehlen (wie in einem 0815-ButtonCode):

Code: Alles auswählen

var myCommand = DOpus.Create.Command();
myCommand.AddLine("@admin");
myCommand.AddLine("//this is basically a batch button*");
myCommand.AddLine("Select "*" PATTERN");
myCommand.AddLine("MyCommand.exe or whatever DO-Command..");
myCommand.Run();
2. Direkte Ausführung von EINEM Befehl mit "RunCommand()":

Code: Alles auswählen

var myCommand = DOpus.Create.Command();
myCommand.SetModifier("admin");
myCommand.RunCommand("MyCommand.exe or whatever DO-Command..")
Bei der ersten Variante könnte man auch mit..

Code: Alles auswählen

myCommand.SetModifier("admin");
arbeiten, wäre dann aber doppelt gemoppelt, bzw. die Zeile AddLine("@admin") könnte man dann weglassen. Schneller ist SetModifier(), aber für den Menschen ist es vielleicht einfacher, wenn alles mit "AddLine()" hinzugefügt wird. Ein Script ließe sich z.B. besser von einem, bzw. zu einem Button wandeln, wenn der ButtonCode komplett in "AddLine()" Sequenzen aufgeht.
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Nun habe ich bei meiner Bastelei die Hilfedatei offen und sehe den Wald vor lauter Bäumen nicht. Es steht ja auch ohne @ in der Hilfedatei.
So jedenfalls funktioniert es wie gewünscht. Vielen Dank für deine Hilfe - auch für die ausführlichen Zusatzinfos.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

So ist es. o)
Ja, die extra Infos helfen hoffentlich zu verstehen, warum und weshalb hier nun genau der .SetModifier("admin") Aufruf gut passt.
AddLine("@admin") ginge ja auch, dann muss man aber immer noch ein paar Zeilen extra umschreiben.

Falls Du das Ding bzw. die Knöpfe für die Deamon Tools fertig hast, wäre es fein, wenn Du diese auch wieder hochladen könntest.
Vielleicht in die Schalter-Beispiele Sektion? Thx! o)
nostra
Beiträge: 35
Registriert: 7. Mär 2010 01:38
Betriebssystem: Windows 11 Ent x64
DOpus Version: 12.xx + Betas
Edition: Pro

Re: Parameterübergabe an Fremdprogramme

Beitrag von nostra »

Darf es auch UltraISO sein?
Damit geht es ganz einfach.
Vorher natürlich in UltraISO ein virtuelles Laufwerk erstellen.

Die einzelnen Befehle

Image mount
D:\Program Files1 (x86)\UltraISO\drivers\isocmd.exe -eject Z:
D:\Program Files1 (x86)\UltraISO\drivers\isocmd.exe -mount Z: {filepath$}
go Z:



Image unmount
D:\Program Files1 (x86)\UltraISO\drivers\isocmd.exe -eject Z:

Komplett mit "Neue Menüschalter" sieht es so aus


Pfade natürlich anpassen, rot. Hoffe hab nichts vergessen
<?xml version="1.0"?>
<button backcol="none" display="icon" textcol="none" type="menu_button">
<label>UltraISo</label>
<icon1>D:\Program Files1 (x86)\UltraISO\UltraISO.exe,0</icon1>
<button backcol="none" display="both" textcol="none">
<label>Image mount</label>
<icon1>#saveprefs</icon1>
<function type="normal">
<instruction>D:\Program Files1 (x86)\UltraISO\drivers\isocmd.exe -eject Z:</instruction>
<instruction>D:\Program Files1 (x86)\UltraISO\drivers\isocmd.exe -mount Z: {filepath$}</instruction>
<instruction>go Z:</instruction>
</function>
</button>
<button backcol="none" display="both" textcol="none">
<label>Image unmount</label>
<icon1>#loadprefs</icon1>
<function type="normal">
<instruction>D:\Program Files1 (x86)\UltraISO\drivers\isocmd.exe -eject Z:</instruction>
</function>
</button>
</button>
Der erste Befehl in "Image mount" der eject ist dafür, falls eine andere Iso eingebunden ist, dann wird die vorher rausgeschmissen und die neue mounten zu können.


Ps: Zu mountende ISO vorm Mounten natürlich markieren.
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Nun habe ich mich mal wieder daran gemacht und weiter probiert. So scheint es zu funktionieren.

Code: Alles auswählen

<?xml version="1.0"?>
<button display="icon" type="three_button">
	<label>DAEMON Tools Image</label>
	<icon1>#thumbnails</icon1>
	<button display="both">
		<label>Imagedatei einbinden</label>
		<tip>Bindet ein Image als virtuelles Laufwerk.</tip>
		<icon1>D:\CD-DVD\DAEMON Tools Ultra\DTUltra.exe,0</icon1>
		<icon2>D:\CD-DVD\DAEMON Tools Ultra\DTShellHlp.exe,3</icon2>
		<function type="script">
			<instruction>// &quot;D:\CD-DVD\DAEMON Tools Ultra\DTCommandLine.exe&quot; --mount --letter &quot;X&quot; --path &quot;{filepath$}&quot;</instruction>
			<instruction>@script JScript</instruction>
			<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
			<instruction />
			<instruction>function OnClick(data){</instruction>
			<instruction>	var f = data.func, c = f.command, tab = f.sourcetab, path2 = &quot;&quot;+tab.path;</instruction>
			<instruction>	var root = (tab.path.Root() &amp;&amp; tab.path) || tab.path, subpath = (&quot;&quot;+path2).replace(root,&quot;&quot;);</instruction>
			<instruction />
			<instruction>	var exePath = DOpus.FSUtil.Resolve(&quot;D:\\CD-DVD\\DAEMON Tools Ultra&quot;);</instruction>
			<instruction>	var exeFullPath = exePath + &quot;\\DTCommandLine.exe&quot;;</instruction>
			<instruction>//_____________________________________________________________________________________________________</instruction>
			<instruction />
			<instruction />
			<instruction>	if (tab.selected_files.count == 0){</instruction>
			<instruction>		DOpus.Output(&quot;No file selected&quot;);</instruction>
			<instruction>		return false;</instruction>
			<instruction>	}</instruction>
			<instruction>	if (tab.selected_files.count &gt; 1){</instruction>
			<instruction>		DOpus.Output(&quot;Too many files selected&quot;);</instruction>
			<instruction>		return false;</instruction>
			<instruction>	}</instruction>
			<instruction />
			<instruction>	var letter = chooseAvailableDriveLetter();</instruction>
			<instruction>	if (!letter) {</instruction>
			<instruction>		DOpus.Output(&quot;Selection aborted.&quot;);</instruction>
			<instruction>		return false;</instruction>
			<instruction>	}</instruction>
			<instruction />
			<instruction>	DOpus.Output(&quot;Ok, mounting &quot; + tab.selected_files(0).realpath + &quot; to &quot; + letter + &quot;:..&quot;);</instruction>
			<instruction />
			<instruction>	if (!DOpus.FSUtil.exists(exeFullPath)) {</instruction>
			<instruction>		DOpus.Output(&quot;Cannot find &quot; + exeFullPath);</instruction>
			<instruction>		return false;</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	var cmdLine = &quot;&quot;;</instruction>
			<instruction>	cmdLine += &apos;&quot;&apos;+exeFullPath+&apos;&quot; &apos;;</instruction>
			<instruction>	cmdLine += &apos;--mount --letter &quot;&apos;;</instruction>
			<instruction>	cmdLine += &apos;&apos;+letter+&apos;&quot; --path &apos;+&apos;&quot;&apos;+tab.selected_files(0).realpath+ &apos;&quot;&apos;;</instruction>
			<instruction />
			<instruction>	DOpus.Output(&quot;CmdLine: &quot; + cmdLine);</instruction>
			<instruction>	c.SetModifier(&quot;admin&quot;);</instruction>
			<instruction>	c.RunCommand(cmdLine);</instruction>
			<instruction>	</instruction>
			<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(tab.path)+&apos;&quot;&apos;); //regular &quot;Go SWITCHPATH&quot; mode</instruction>
			<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(root)+subpath+&apos;&quot;&apos;); //keep subfolders, loop roots only</instruction>
			<instruction>}</instruction>
			<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function getUsedUnusedDriveLetters() {</instruction>
			<instruction>//##############################################################################	</instruction>
			<instruction>	var Drive = function(letter, label){</instruction>
			<instruction>		this.letter = letter;</instruction>
			<instruction>		this.label = label;</instruction>
			<instruction>		this.toString = function(){ return this.letter; };</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	var arrayObjectToString = function toString(){</instruction>
			<instruction>		for(var letters=&quot;&quot;, i=0;i&lt;this.length;i++) letters += this[i].letter + &quot;, &quot;;</instruction>
			<instruction>		return letters.replace(/, ?$/,&quot;&quot;); //trim trailing separator</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	var lettersInUse	= []; lettersInUse.toString		= arrayObjectToString;</instruction>
			<instruction>	var lettersNotInUse	= []; lettersNotInUse.toString	= arrayObjectToString;</instruction>
			<instruction>	var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);</instruction>
			<instruction>	var fsoDrive = null, letter, label, driveObject;</instruction>
			<instruction />
			<instruction>	for(var en=new Enumerator(fso.Drives); !en.atEnd(); en.moveNext()) {</instruction>
			<instruction>	    fsoDrive=en.item()</instruction>
			<instruction>		try{</instruction>
			<instruction>			letter = fsoDrive.DriveLetter;</instruction>
			<instruction>			label = fsoDrive.VolumeName || &quot;(unnamed)&quot;;</instruction>
			<instruction>		} catch(e){ //getting label can fail for weird drives</instruction>
			<instruction>			label = &quot;(unknown)&quot;;</instruction>
			<instruction>		}</instruction>
			<instruction>		driveObject = new Drive(letter, label);</instruction>
			<instruction>		lettersInUse[letter] = driveObject;</instruction>
			<instruction>		lettersInUse.push(driveObject);</instruction>
			<instruction>	    //objDrive.AvailableSpace, objDrive.DriveLetter, objDrive.DriveType</instruction>
			<instruction>	    //objDrive.FileSystem, objDrive.FreeSpace, objDrive.IsReady</instruction>
			<instruction>	    //objDrive.Path, objDrive.RootFolder, objDrive.SerialNumber</instruction>
			<instruction>	    //objDrive.ShareName, objDrive.TotalSize, objDrive.VolumeName</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	for(var i=65;i&lt;91;i++) {</instruction>
			<instruction>		letter = String.fromCharCode(i);</instruction>
			<instruction>		if (lettersInUse[letter]) continue;</instruction>
			<instruction>		driveObject = new Drive(letter, &quot;&quot;);</instruction>
			<instruction>		lettersNotInUse[letter] = driveObject;</instruction>
			<instruction>		lettersNotInUse.push(driveObject);</instruction>
			<instruction>	}</instruction>
			<instruction>	return { inUse: lettersInUse, notInUse: lettersNotInUse };</instruction>
			<instruction>}</instruction>
			<instruction />
			<instruction>//##############################################################################</instruction>
			<instruction>function getUsedUnusedDriveLettersDemo() {</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
			<instruction>	DOpus.Output(&quot;Drives/Letters:&quot;);</instruction>
			<instruction>	DOpus.Output(&quot;    in use         : &quot; + result.inUse+ &quot; (&quot;+result.inUse.length+&quot;)&quot;);</instruction>
			<instruction>	DOpus.Output(&quot;    free/not used  : &quot; + result.notInUse + &quot; (&quot;+result.notInUse.length+&quot;)&quot;);</instruction>
			<instruction>	DOpus.Output(&quot;    by letter      : &quot; + result.inUse[&quot;C&quot;].letter + &quot;: &quot; + result.inUse[&quot;C&quot;].label);</instruction>
			<instruction>	DOpus.Output(&quot;    letter &amp; label : &quot; + result.inUse[1].letter + &quot;: &quot; + result.inUse[1].label);</instruction>
			<instruction>	DOpus.Output(&quot;    letter.toString: &quot; + result.inUse[1]);</instruction>
			<instruction>}</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function OpenMenu(dlg, type, listEntries){</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	dlg.title = &quot;Select drive letter&quot;;</instruction>
			<instruction>	dlg.message = &quot;Available letters:&quot;; //Check filters to &quot;+filterFlags.replace(&quot;,&quot;,&quot;, &quot;)+&quot; items:&quot;</instruction>
			<instruction>	dlg.buttons = &quot;Ok|Cancel&quot;;</instruction>
			<instruction>	dlg.choices = listEntries;</instruction>
			<instruction>	//if (type==&quot;list&quot;) 	{	dlg.list = 0; dlg.menu = 0;}</instruction>
			<instruction>	if (type==&quot;dropdown&quot;)	dlg.menu = 0;</instruction>
			<instruction>	if (type==&quot;multilist&quot;)	dlg.list = 0;</instruction>
			<instruction>	dlg.Show();</instruction>
			<instruction>	return dlg.selection; //dlg.selection = 0-indexed, dlg.result = 1-indexed (wot?);</instruction>
			<instruction>}</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function chooseAvailableDriveLetter() {</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	var list = DOpus.Create.Vector();</instruction>
			<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
			<instruction>	for(var i=0;i&lt;result.notInUse.length;i++) list.push_back(result.notInUse[i].letter)</instruction>
			<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
			<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
			<instruction>	if (letterIndex == -1) return null;</instruction>
			<instruction>	var letter = result.notInUse[letterIndex];</instruction>
			<instruction>	return letter;</instruction>
			<instruction>}</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function chooseOccupiedDriveLetter() {</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	var list = DOpus.Create.Vector();</instruction>
			<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
			<instruction>	for(var i=0;i&lt;result.inUse.length;i++) list.push_back(result.inUse[i].letter)</instruction>
			<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
			<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
			<instruction>	if (letterIndex == -1) return null;</instruction>
			<instruction>	var letter = result.inUse[letterIndex];</instruction>
			<instruction>	return letter;</instruction>
			<instruction>}</instruction>
		</function>
	</button>
	<button backcol="none" display="both" textcol="#ff0000">
		<label>Imagedatei freigeben</label>
		<tip>Trennt ein Image als virtuelles Laufwerk.</tip>
		<icon1>D:\CD-DVD\DAEMON Tools Ultra\DTUltra.exe,0</icon1>
		<icon2>D:\CD-DVD\DAEMON Tools Ultra\DTShellHlp.exe,4</icon2>
		<function type="script">
			<instruction>@script JScript</instruction>
			<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
			<instruction />
			<instruction>function OnClick(data){</instruction>
			<instruction>	var f = data.func, c = f.command, tab = f.sourcetab, path2 = &quot;&quot;+tab.path;</instruction>
			<instruction>	var root = (tab.path.Root() &amp;&amp; tab.path) || tab.path, subpath = (&quot;&quot;+path2).replace(root,&quot;&quot;);</instruction>
			<instruction />
			<instruction>	var exePath = DOpus.FSUtil.Resolve(&quot;D:\\CD-DVD\\DAEMON Tools Ultra&quot;);</instruction>
			<instruction>	var exeFullPath = exePath + &quot;\\DTCommandLine.exe&quot;;</instruction>
			<instruction>//_____________________________________________________________________________________________________</instruction>
			<instruction />
			<instruction />
			<instruction>	//there is no support for selected drives in &quot;my computer&quot; o(..</instruction>
			<instruction>	//DOpus.Output(&quot;Selected count: &quot;+tab.selected.count);</instruction>
			<instruction>	//if (tab.selected.count == 1){</instruction>
			<instruction>	//	DOpus.Output(&quot;1 item selected&quot;);</instruction>
			<instruction>	//	return false;</instruction>
			<instruction>	//}</instruction>
			<instruction />
			<instruction>	var letter = chooseOccupiedDriveLetter();</instruction>
			<instruction>	if (!letter) {</instruction>
			<instruction>		DOpus.Output(&quot;Selection aborted.&quot;);</instruction>
			<instruction>		return false;</instruction>
			<instruction>	}</instruction>
			<instruction />
			<instruction>	DOpus.Output(&quot;Ok, unmounting &quot; + letter + &quot;:..&quot;);</instruction>
			<instruction />
			<instruction>	if (!DOpus.FSUtil.exists(exeFullPath)) {</instruction>
			<instruction>		DOpus.Output(&quot;Cannot find &quot; + exeFullPath);</instruction>
			<instruction>		return false;</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	var cmdLine = &quot;&quot;;</instruction>
			<instruction>	cmdLine += &apos;&quot;&apos;+exeFullPath+&apos;&quot; &apos;;</instruction>
			<instruction>	cmdLine += &apos;--unmount --letter &quot;&apos;;</instruction>
			<instruction>	cmdLine += &apos;&apos;+letter+&apos;&quot;&apos;;</instruction>
			<instruction />
			<instruction>	DOpus.Output(&quot;CmdLine: &quot; + cmdLine);</instruction>
			<instruction>	c.SetModifier(&quot;admin&quot;);</instruction>
			<instruction>	c.RunCommand(cmdLine);</instruction>
			<instruction>	</instruction>
			<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(tab.path)+&apos;&quot;&apos;); //regular &quot;Go SWITCHPATH&quot; mode</instruction>
			<instruction>	//c.RunCommand(&apos;Go PATH=&quot;&apos;+loop.NextPath(root)+subpath+&apos;&quot;&apos;); //keep subfolders, loop roots only</instruction>
			<instruction>}</instruction>
			<instruction>///////////////////////////////////////////////////////////////////////////////</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function getUsedUnusedDriveLetters() {</instruction>
			<instruction>//##############################################################################	</instruction>
			<instruction>	var Drive = function(letter, label){</instruction>
			<instruction>		this.letter = letter;</instruction>
			<instruction>		this.label = label;</instruction>
			<instruction>		this.toString = function(){ return this.letter; };</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	var arrayObjectToString = function toString(){</instruction>
			<instruction>		for(var letters=&quot;&quot;, i=0;i&lt;this.length;i++) letters += this[i].letter + &quot;, &quot;;</instruction>
			<instruction>		return letters.replace(/, ?$/,&quot;&quot;); //trim trailing separator</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	var lettersInUse	= []; lettersInUse.toString		= arrayObjectToString;</instruction>
			<instruction>	var lettersNotInUse	= []; lettersNotInUse.toString	= arrayObjectToString;</instruction>
			<instruction>	var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);</instruction>
			<instruction>	var fsoDrive = null, letter, label, driveObject;</instruction>
			<instruction />
			<instruction>	for(var en=new Enumerator(fso.Drives); !en.atEnd(); en.moveNext()) {</instruction>
			<instruction>	    fsoDrive=en.item()</instruction>
			<instruction>		try{</instruction>
			<instruction>			letter = fsoDrive.DriveLetter;</instruction>
			<instruction>			label = fsoDrive.VolumeName || &quot;(unnamed)&quot;;</instruction>
			<instruction>		} catch(e){ //getting label can fail for weird drives</instruction>
			<instruction>			label = &quot;(unknown)&quot;;</instruction>
			<instruction>		}</instruction>
			<instruction>		driveObject = new Drive(letter, label);</instruction>
			<instruction>		lettersInUse[letter] = driveObject;</instruction>
			<instruction>		lettersInUse.push(driveObject);</instruction>
			<instruction>	    //objDrive.AvailableSpace, objDrive.DriveLetter, objDrive.DriveType</instruction>
			<instruction>	    //objDrive.FileSystem, objDrive.FreeSpace, objDrive.IsReady</instruction>
			<instruction>	    //objDrive.Path, objDrive.RootFolder, objDrive.SerialNumber</instruction>
			<instruction>	    //objDrive.ShareName, objDrive.TotalSize, objDrive.VolumeName</instruction>
			<instruction>	}</instruction>
			<instruction>	</instruction>
			<instruction>	for(var i=65;i&lt;91;i++) {</instruction>
			<instruction>		letter = String.fromCharCode(i);</instruction>
			<instruction>		if (lettersInUse[letter]) continue;</instruction>
			<instruction>		driveObject = new Drive(letter, &quot;&quot;);</instruction>
			<instruction>		lettersNotInUse[letter] = driveObject;</instruction>
			<instruction>		lettersNotInUse.push(driveObject);</instruction>
			<instruction>	}</instruction>
			<instruction>	return { inUse: lettersInUse, notInUse: lettersNotInUse };</instruction>
			<instruction>}</instruction>
			<instruction />
			<instruction>//##############################################################################</instruction>
			<instruction>function getUsedUnusedDriveLettersDemo() {</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
			<instruction>	DOpus.Output(&quot;Drives/Letters:&quot;);</instruction>
			<instruction>	DOpus.Output(&quot;    in use         : &quot; + result.inUse+ &quot; (&quot;+result.inUse.length+&quot;)&quot;);</instruction>
			<instruction>	DOpus.Output(&quot;    free/not used  : &quot; + result.notInUse + &quot; (&quot;+result.notInUse.length+&quot;)&quot;);</instruction>
			<instruction>	DOpus.Output(&quot;    by letter      : &quot; + result.inUse[&quot;C&quot;].letter + &quot;: &quot; + result.inUse[&quot;C&quot;].label);</instruction>
			<instruction>	DOpus.Output(&quot;    letter &amp; label : &quot; + result.inUse[1].letter + &quot;: &quot; + result.inUse[1].label);</instruction>
			<instruction>	DOpus.Output(&quot;    letter.toString: &quot; + result.inUse[1]);</instruction>
			<instruction>}</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function OpenMenu(dlg, type, listEntries){</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	dlg.title = &quot;Select drive letter&quot;;</instruction>
			<instruction>	dlg.message = &quot;Available letters:&quot;; //Check filters to &quot;+filterFlags.replace(&quot;,&quot;,&quot;, &quot;)+&quot; items:&quot;</instruction>
			<instruction>	dlg.buttons = &quot;Ok|Cancel&quot;;</instruction>
			<instruction>	dlg.choices = listEntries;</instruction>
			<instruction>	//if (type==&quot;list&quot;) 	{	dlg.list = 0; dlg.menu = 0;}</instruction>
			<instruction>	if (type==&quot;dropdown&quot;)	dlg.menu = 0;</instruction>
			<instruction>	if (type==&quot;multilist&quot;)	dlg.list = 0;</instruction>
			<instruction>	dlg.Show();</instruction>
			<instruction>	return dlg.selection; //dlg.selection = 0-indexed, dlg.result = 1-indexed (wot?);</instruction>
			<instruction>}</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function chooseAvailableDriveLetter() {</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	var list = DOpus.Create.Vector();</instruction>
			<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
			<instruction>	for(var i=0;i&lt;result.notInUse.length;i++) list.push_back(result.notInUse[i].letter)</instruction>
			<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
			<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
			<instruction>	if (letterIndex == -1) return null;</instruction>
			<instruction>	var letter = result.notInUse[letterIndex];</instruction>
			<instruction>	return letter;</instruction>
			<instruction>}</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>function chooseOccupiedDriveLetter() {</instruction>
			<instruction>//##############################################################################</instruction>
			<instruction>	var list = DOpus.Create.Vector();</instruction>
			<instruction>	var result = getUsedUnusedDriveLetters();</instruction>
			<instruction>	for(var i=0;i&lt;result.inUse.length;i++) list.push_back(result.inUse[i].letter)</instruction>
			<instruction>	var letterIndex = OpenMenu( DOpus.Dlg, &quot;list&quot;, list);</instruction>
			<instruction>	if (typeof letterIndex == &quot;undefined&quot;) return null;</instruction>
			<instruction>	if (letterIndex == -1) return null;</instruction>
			<instruction>	var letter = result.inUse[letterIndex];</instruction>
			<instruction>	return letter;</instruction>
			<instruction>}</instruction>
		</function>
	</button>
</button>
Jetzt würde ich mir noch wünschen, dass beim Unmount ein eventuell ausgewähltes Objekt dahingehend überprüft wird, ob es ein virtuelles Laufwerk ist. Sollte das der Fall sein, soll dieses getrennt werden, wenn nicht wird der Auswahldialog mit den existierenden virtuellen Laufwerken angezeigt. Da fehlt mir aber noch der Ansatz.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Jetzt würde ich mir noch wünschen, dass beim Unmount ein eventuell ausgewähltes Objekt dahingehend überprüft wird, ob es ein virtuelles Laufwerk ist.
Du meinst, Du willst ein File selektieren, dann "Unmount" drücken, und der Button soll selbst erkennen, ob das selektierte File als LaufwerkX, Y, oder Z gemountet ist, um es dann automatisch ohne weitere Interaktion "unzumounten"?

Bei ISO Files wäre das u.U. möglich, denke ich. Du musst dafür in das ISO reingucken, Dir die Liste der Folder/Files aus dem Root holen und dann alle Laufwerke vom Typ 4 abklappern (reale und virtuelle CDRoms) und gucken, ob deren Folder/File Struktur mit der vom ISO übereinstimmt.

Bei Images von RDrive-Image oder anderen Imaging-Tools sehe ich erstmal nicht wie das gehen könnte, man braucht halt irgendwas um ein paar Infos vom ISO/Image zu holen, ohne es erst anzumelden, notfalls ginge auch das, aber irgendwie ist das wohl overkill und vermutlich auch nicht sonderlich schnell.

Eine andere Möglichkeit ist natürlich, sich zu merken, welches File in welchen Buchstaben gemountet ist, das funktioniert aber auch nur solange das System oder andere Tools nicht an den Buchstaben drehen, Laufwerke anderweitig abgemeldet werden usw.. ist auch weit weg von optimal.
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hallo tbone,

so weit will ich gar nicht gehen. Wenn das ausgewählte Objekt eine Datei oder ein Ordner ist, sollen alle virtuellen Laufwerke, die man lösen könnte, in einem Dialog aufgelistet werden. Ist ein virtuelles Laufwerk angewählt, soll es, eventuell nach einer Sicherheitsabfrage, gelöst werden.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

josinoro hat geschrieben: 10. Nov 2021 10:20 Wenn das ausgewählte Objekt eine Datei oder ein Ordner ist
Warum willst Du ein File/Folder dazu auswählen, wo ist der Zusammenhang mit den gerade angemeldeten ISOs/Images?
Woher bekommst Du eine Liste der angemeldeten ISOs/Images von Deinem ISO/Image-Tool?

Ich habe mal geguckt, was MagicDisc so kann (was ich benutze).. das kann per Commandline nicht viel, ich bediene es vorwiegend über das TrayMenu, nicht "deluxe", aber so oft mounte ich keine ISOs. Es ist aber wohl kompatibel (selber Kern/Software/Entwickler) mit MagicISO. Das wiederum hat ein Kommandozeilen-Tool dabei und einen Parameter, mit dem man die angelegten/virtuellen Laufwerke listen kann:

Code: Alles auswählen

>miso.exe NULL -vlist
                         MagicISO Console v3.1.113
        Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 MagicISO Inc.
This is unregistered version, Can't Save or burn an image greater than 300MB

The following is all of the present virutal CD/DVD drivers.

[1] No Media   (E:)
[2] No Media   (G:)
[3] No Media   (F:)
[4] No Media   (H:)
Damit könnte man arbeiten, die Ausgabe kann man parsen und in Dialogform anbieten, zum Unmounten z.B..
Leider ist die WebSeite down, aber über die WayBackMachine kann man es noch herunterladen:
https://web.archive.org/web/20170113040 ... gicISO.exe
Das GUI Programm dazu gibt es auch noch:
https://web.archive.org/web/20161221195 ... icdisc.exe
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Was kommt denn bei Dir, wenn Du..

Code: Alles auswählen

DTCommandLine.exe --get_count --type "dt"
ausführst? Gibt das auch eine Liste der Laufwerke?
josinoro
Beiträge: 195
Registriert: 4. Aug 2013 19:58

Re: Parameterübergabe an Fremdprogramme

Beitrag von josinoro »

Hallo tbone,

vielen, vielen Dank für deine Mühe.
tbone hat geschrieben: 10. Nov 2021 11:45 Warum willst Du ein File/Folder dazu auswählen, wo ist der Zusammenhang mit den gerade angemeldeten ISOs/Images?
Woher bekommst Du eine Liste der angemeldeten ISOs/Images von Deinem ISO/Image-Tool?
Ich möchte gar keine Datei oder einen Ordner auswählen, aber meistens ist ja ein Objekt ausgewählt. Sollte dieses Objekt durch bewusste Anwahl ein virtuelles Laufwerk sein, dann soll es gelöst werden, ansonsten erscheint der Dialog mit den zur Verfügung stehenden virtuellen Laufwerken.
Oder andersherum ausgedrückt, wenn ich ein virtuelles Laufwerk lösen möchte und deshalb auf den Schalter tappe, wird nachgeschaut, ob das ausgewählte Objekt ein virtuelles Laufwerk ist. Sollte das der Fall sein, wird es, eventuell mit einer Sicherheitsabfrage, gelöst. Ist es kein virtuelles Laufwerk, also irgendein anderes Objekt, wird, wie bisher, der Dialog mit den zur Verfügung stehenden Laufwerken angezeigt.

Bei der Anweisung:

Code: Alles auswählen

DTCommandLine.exe --get_count --type "dt"
bekomme ich die Anzahl der eingebundenen Laufwerke angezeigt.
Benutzeravatar
tbone
Berater
Beiträge: 626
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64

Re: Parameterübergabe an Fremdprogramme

Beitrag von tbone »

Probier mal das MagicISO aus, das macht automatisch Kontext-Menu Einträge, die nah dran sind an der gesuchten Funktionalität. Dann habe ich noch WinCDEmu probiert, das macht auch Kontext-Menu Einträge.. Buttons im DOpus sind das dann nicht, aber vll kannst Du damit zurecht kommen.

Wenn die DeamonTools über Kommandozeile keine Möglichkeit bieten die angemeldeten Laufwerke zu ermitteln, kommt man damit auf jeden Fall nicht weiter, da hilft dann erstmal nur MagicISO bzw. miso.exe, damit könnte man die Buttons bauen. Ein bisschen doof ist, dass das MagicISO schon relativ alt ist, es scheint zu funktionieren, weiß nur nicht ob einem da irgendwas fehlt. Andererseits sind die CDs und DVDs ja seit ca. 10 Jahren auch stehengeblieben, vermutlich kann MagicISO alles was man mit diesen ISOs etc. machen können muss, bzw. kennt auch alle Formate/Varianten.
Antworten