Page 1 of 1

Freies Laufwerk ermitteln

Posted: 03 Jan 2021, 16:33
by Filzfrosch
Moin,

ich versuche jetzt seit einiger Zeit vergeblich vor dem Setzen eines Netzlaufwerks (mit net use) zu prüfen, welcher freie Laufwerksbuchstabe zur Verfügung steht.
Ich habe über das Kommando

Code: Select all

DriveGet, LWList, List
einen String aller zur Zeit vergebenen Laufwerksbuchstaben. (z.B. CDEFGHIXZ).
Jetzt möchte ich, dass von Z nach A geprüft wird, welcher Buchstabe frei wäre (in diesem Beispiel also Y).
Wie dann das Laufwerk mit dem freien Laufwerksbuchstaben verbunden wird ist kein Problem, aber die Buchstabenprüfung selber scheitert kläglich ...
Ich habe es versucht mit If InStr(LWList1,Z) usw. aber dabei findet er im obigen Beispiel ein Y obwohl keines dabei ist.
Außerdem muss so natürlich jeder Buchstabe einzeln geprüft werden, bis ein freier gefunden wurde. Dadurch wird das Script natürlich ellenlang.
Ich denke, da gibt es bestimmt eine viel kleinere, kompaktere Lösung.
Wer greift mir kurz mal unter die Arme?
Dank im Voraus!

Grüße

Re: Freies Laufwerk ermitteln

Posted: 03 Jan 2021, 17:00
by KHA
Spontan fällt mir, sowas ein:

Code: Select all

DriveGet, LaufwerkBuschStabe, List, 
;LaufwerkBuschStabe := "CDEFGHIXZ"
AnzahlBuchstaben := StrSplit(LaufwerkBuschStabe).MaxIndex()

For Each, Zeichen In StrSplit("ZYXWVUTSRQPONMLKJIHGFEDCBA")
{
Buchstabe := StrSplit(LaufwerkBuschStabe)[AnzahlBuchstaben]
	if (Buchstabe != Zeichen)
	{
	FreieBuchstabe := Zeichen
	break
	}
AnzahlBuchstaben--
}

MsgBox, % FreieBuchstabe

Re: Freies Laufwerk ermitteln

Posted: 03 Jan 2021, 17:20
by Filzfrosch
Danke, hab den Code an mein Script angepasst und klappt jetzt super!
Vielen Dank!

Vor allem sind es nur ein paar Zeilen Code, gegen meinen davor .... :roll:

Re: Freies Laufwerk ermitteln

Posted: 03 Jan 2021, 17:25
by KHA
Idee 2: vlt. ist es einfacher

Code: Select all

DriveGet, LaufwerkBuschStabe, List,
AnzahlBuchstaben := StrSplit(LaufwerkBuschStabe).MaxIndex()

Loop, 26
{
Großbuchstabe := Chr(91 - A_Index)
Buchstabe := StrSplit(LaufwerkBuschStabe)[AnzahlBuchstaben]
	if (Buchstabe != Großbuchstabe)
	{
	FreieBuchstabe := Großbuchstabe
	break
	}
AnzahlBuchstaben--
}
MsgBox, % FreieBuchstabe

Re: Freies Laufwerk ermitteln

Posted: 04 Jan 2021, 02:27
by haichen
Hier noch eine etwas kürzere Variante:

Code: Select all

DriveGet, LaufwerkBuschStabe, List
FreieLWBuchstaben :="CDEFGHIJKLMNOPQRSTUVWXYZ"
Loop, parse, LaufwerkBuschStabe
     FreieLWBuchstaben := StrReplace(FreieLWBuchstaben, A_LoopField, "",, 1)

msgbox, % FreieLWBuchstaben

Re: Freies Laufwerk ermitteln  Topic is solved

Posted: 04 Jan 2021, 04:50
by just me
Moin,

für die Freunde von 'weniger Zeilen ist mehr': ;)

Code: Select all

LWList := "CDEFGHIXYZ" ; <<<<< Test
LWB := SubStr(RegExReplace("CDEFGHIJKLMNOPQRSTUVWXYZ", "[" . LWList . "]"), 0)
MsgBox, %LWB%

Re: Freies Laufwerk ermitteln

Posted: 04 Jan 2021, 05:50
by haichen
Aaaaah. Ooooh. Toll. Der Regexp ist klasse!! :bravo:

Re: Freies Laufwerk ermitteln

Posted: 04 Jan 2021, 06:57
by BoBo
@just me :thumbup:
Ich hatte zwztl an einen ASCII-Wertabgleich gedacht.
Ähm, was genau macht die RegExLogik (semantisch)?

Re: Freies Laufwerk ermitteln

Posted: 04 Jan 2021, 07:29
by just me
@BoBo,

der Regex definiert eine Klasse [...] für die in der Laufwerksliste enthaltenen Buchstaben und entfernt alle Buchstaben dieser Klasse aus dem 'Laufwerksbuchstabenstring'. Was übrig bleibt, ist frei, und der letzte der Freien wird genommen SubStr(..., 0).

Re: Freies Laufwerk ermitteln

Posted: 04 Jan 2021, 12:04
by Filzfrosch
Moin
Ihr seid der Hammer hier :thumbup:
Alle funzen gut.
Und zum Schluß der Einzeiler mit Erklärung von just me ist dann Champions League :D
Vielen Dank dafür, ich finde es immer wieder klasse zu sehen, wie Cracks die Aufgabe überhaupt angehen.
Daraus versuche ich mir dann ein wenig abzuschauen.
Aber mein Dank auch an alle anderen!

Re: Freies Laufwerk ermitteln

Posted: 04 Jan 2021, 16:42
by BoBo
@just me :thumbup: