Laufwerkbuchstaben tauschen - effizientes Tool gesucht (W10, USB)

areiland schrieb:
Diesen Direktaufruf gibts doch schon, nämlich im Kontextmenü des Startbuttons, was gerade mal zwei Klicks bedeutet.
Ich finde es angenehmer das Kontextmenu über die Tastenkombination "Win-X" aufzurufen.
 
@AGB-Leser: Vllt. so nicht in W7, aber man könnt' den Aufruf der DTV auch via Tastenkombi (noch effizienter/schneller) realisieren. 😉
 
Direktaufruf?
Der müsste mir direkt das Laufwerk angeben ohee dahin scrollen zu müssen.
Noch besser den Dialog um Laufwerksbuchstaben für jenes Laufwerk.
Ich sehe nicht mal mit AutoIt (vgl. auch Bildschirmerweiterung, Win+P) eine Makrolösung mich dahin gondeln zu lassen.

Wenn jemand neben der Kommandozeile von DriveLetterChanger ein smartes Tool für die Kommandozeile wüsste das effektiv nur «Tausche R: T:» durchführt wäre das nett.

CN8
 
Powershell mit Adminrechten: set-partition -driveletter m -newdriveletter e, fertig. Möchtest Du es noch einfacher?
 
Bestenfalls ein Sprachkurs Mensch - PowerShell • PowerShell - Mensch.

Google ist zu doof PowerShell als Kommandozeile zu begreifen sonst hätte ich dies längst gefunden haben müssen.
So, jetzt muss ich das nur noch in meine AutoIt-Shell einbauen und testen.

Ach so - wie ruft man denn eine Admin-Powershell auf? CMD allein aufzurufen wüsste ich, aber auch nicht als Admin… Könnte sein, dass mich das am Ende komplett reinreißt

CN8
 
Wie rufst Du andere Programme explizit mit Adminrechten auf? Genau so öffnet man auch die Powershell mit Adminrechten.
 
@cumulonimbus8
Wie Bitte? Du gibst so viele Hilfreiche Tipps ab, und sowas banales kennst du nicht?
Powershell.png
Rechter Mausklick, dann
 
Tja… Wie ruft man wohl etwas mit Adminrechten auf…
…wenn die Anforderung lautet rechts im Explorerbaum auf ein Laufwerk zu klicken um dann etwas auszulösen?

HKEY_CLASSES_ROOT\Drive\shell\RunAs ist leider schon für ein CMD-Box verbraucht, das nur als Randbemerkung.

Einfügung - noch ein Randbemerkung:
Das alles soll allein mit der aus ablaufen. Icdh kenne wohl den aktuellen Buchstaben, aber das system soll nur noch freie anbieten und akzeptieren. So weit bin ich mit AutoIt, nun fhelt nur noch die Befehlszeile die die Eckdaten umsetzt…


CN8


---

Wenn auch als Versuch aus einer normalen CMD heraus; ein Stick steckt und er horcht auf M:

C:\Windows\System32\WindowsPowerShell\v1.0>powershell.exe set-partition -driveletter m -newdriveletter t
set-partition : Das angeforderte Objekt wurde nicht gefunden.
In Zeile:1 Zeichen:1
  • set-partition -driveletter m -newdriveletter t
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (PS_StorageCmdlets:ROOT/Microsoft/..._StorageCmdlets) [Set-Partition], C
imException
+ FullyQualifiedErrorId : MI RESULT 6,Set-Partition

So, was hätte unsere WunderShell denn so alles von mir um einen ach so primitiven Befehl auszuführen?


---

Copy-Paste…

Example 5: Change the drive letter​

PowerShellCopy

PS C:\> Set-Partition -DriveLetter Y -NewDriveLetter Z
This example changes the drive letter from Y to Z.

Super. 1:1 von MS höchstpersönlich. Und es funktioniert nicht. So, ohne alles
Kein Tönchen, dort dass es als Admin laufen muss (42012 als Errorcode ist Murks; es gibt keien dopplten LW-Buchstaben).


Als Admin klappts. Und wie starte ich per REG als Admin? Alles ein Totes Gleis???
 
Zuletzt bearbeitet:
Hier meine Lösung

Für AutoIt
Code:
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>

#Region Konstanten
Const $Pipe = "|"
Local $LaufwerkeListe = ""
Local $FreieLaufwerke
Const $FensterName = '(Keiner)' ; ´written by CyRoX
Const $LaufwerkeTypen = 'ALL'
Local $UserForm
Const $XKoordinate = 35
Const $YAbstand = 20
Const $FormularBreite = 90
Const $FormularXNull = 60
Const $FormularYNull = 70
Const $KnopfXNull = 10
Const $KnopfYNull = 5
Const $KnopfHoch = 20
Const $KnopfBreit = 70
$YKoordinate = $KnopfYNull
Local $QuellLaufwerk
Local $KnopfText
Local $RechenHilfe
Local $GeklicktesLaufwerk
Local $ZielLaufwerk
Const $ProgPfad = "C:\Windows\System32\WindowsPowerShell\v1.0\"
Const $ProgName = "PowerShell.Exe"
#EndRegion

#Region Kommandozeile
If $CmdLine[0] = 0 Then
Exit
Else
$QuellLaufwerk = $CmdLine[1]
    $KnopfText = StringLeft($CmdLine[1], 2) & " ->"
EndIf
#EndRegion

#Region Freie Laufwerke
$Laufwerke = DriveGetDrive("All")
$LaufwerkeAlle = _ArrayToString($Laufwerke, $Pipe, 1) & $Pipe
$LaufwerkeAlle = StringUpper($LaufwerkeAlle)
For $i = 67 to 90 ;97 to 122
If StringInStr($LaufwerkeAlle, Chr($i) & ":" & $Pipe) = 0 Then $LaufwerkeListe = $LaufwerkeListe & Chr($i) & $Pipe
Next
$LaufwerkeListe = StringLeft($LaufwerkeListe, StringLen($LaufwerkeListe) -1)
$FreieLaufwerke = StringSplit($LaufwerkeListe, $Pipe)
#EndRegion

#Region GUI
$RechenHilfe = $KnopfYNull + $KnopfHoch + $KnopfYNull + $YKoordinate + ($FreieLaufwerke[0] * $YAbstand)
$UserForm = GUICreate($FensterName, $FormularBreite, $RechenHilfe, $FormularXNull, $FormularYNull)
Dim $RadioKnopf[$FreieLaufwerke[0]]
For $I = 1 To $FreieLaufwerke[0]
$RadioKnopf[$I-1] = GUICtrlCreateRadio(StringUpper($FreieLaufwerke[$I]), $XKoordinate, $YKoordinate)
$YKoordinate = $YKoordinate + $YAbstand
Next
$FormularStarter = GUICtrlCreateButton($KnopfText, $KnopfXNull, $YKoordinate + $KnopfYNull, $KnopfBreit, $KnopfHoch)
GUISetState(@SW_SHOW)
#EndRegion

#Region AusLeseSchleife
$ZielLaufwerk = ''
While $ZielLaufwerk = ''
    $FormularKlickWert = GUIGetMsg()
    Switch $FormularKlickWert
        Case -3
            Exit
        Case $FormularStarter
            $GeklicktesLaufwerk = ''
            For $I = 1 To $FreieLaufwerke[0]
                If BitAND(GUICtrlRead($RadioKnopf[$I-1]), 1) Then
                 $GeklicktesLaufwerk = ControlGetText($FensterName, '', $RadioKnopf[$I-1])
                EndIf
            Next
            If $GeklicktesLaufwerk <> '' Then
             $ZielLaufwerk = $GeklicktesLaufwerk
            Else
                Exit
            EndIf
            GUISetState(@SW_HIDE)
    EndSwitch
WEnd
#EndRegion

#Region Schalten
If $ZielLaufwerk <> '' Then
Run ($ProgPfad & $ProgName & " Set-Partition -DriveLetter " & StringLeft($QuellLaufwerk, 1) & " -NewDriveLetter " & $ZielLaufwerk, $ProgPfad)
EndIf
#EndRegion
Der Absprung wenn ohne Parameter aufgerufen ist gesunder Pessimismus.
Zuerst wird ein Button vorbereitet der, schön klein, den Quelllaufwerk-Buichstaben als Info mit angibt (der Fenstertitel geht räumlich unter).
Den Block Freie Laufwerke habe ich hier gefunden und (als Großbuchstaben-Fan) gleich A und B übergangen da ich die für Sonderzwecke reser4t habe (Nein!! Nicht für Floppys!!)
Damit habe ich eine Info wie groß (hich) die GUI wird.
Unter GUI werden dann in den passend ausgerechneten Rahmen die Radiobuttons der noch freien Lettern eingesetzt, unten der Button der die Sache auslöst. (Ohne Auswahl oder Schließkreuz beenden ohne Aktion, siehe gnau unten.)
Die AusLeseSchleife habe ich (wie auch Gewisses weiter oben) von hier von CyRoX, aber etwas geändert, wie die Absprungfunktion. Dass bei RadioButtons eigntlich nur eine Rückgabe kommen kann ist klar, aber ich lasse es so wo CheckBoxen abglaufen und ursprünglich deren Inhalte gesammlt wurden. (Es fehlt an Ehrgeiz rauszufinden wie ich hier allein nur den eine RadioButton zurückgegeben bekomme.)
Das Ende Schalten ist theoretisch unnötig da das auch in der Schleife passierne kann; ist Programmierrest Ergebnisse sehen zu können.
Als 64-Bit kompiliert und die EXE dann in der Kompatibilität auf Als-Admin schalten. (Leider kann man PowerSehll nicht überreden ohne Aufblitzen zu laufen.)
Felht nur die Sprungschanze in der Registry:
Code:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Drive\shell\DLC CN8]
@="Drive-Letter-Changer CN8"

[HKEY_CLASSES_ROOT\Drive\shell\DLC ME\command]
@="J:\\ANW\\AutoIt3\\Examples\\DriveLetterChangerCN8.exe %L"
Der Pfad und die Betitelung müssen natürlich angepasst und aufgehübscht werden.
 
Nur nebenbei: kaum einsatzbereit wird es auch schon benötigt und bewährt sich.
CN8
 
cumulonimbus8 schrieb:
Leider kann man PowerSehll nicht überreden ohne Aufblitzen zu laufen
"Powershell.exe -Windowstyle Hidden" - dann geht auch kein Fensterchen mehr auf.
 
Dingen zu Folge die ich las klappt das trotzdem nicht richtig. Ich hatte das im Code sogar drin ohne eine Wirkung zu erkennen. Da das Aufblitzen wiederum Arbeit verheißt mach ich aus der Not die Tugend der Erkenntnis.
CN8
 
Lies doch mal bitte den Eingangspost welches Tool ich ablösen wollte…
CN8
 
  • Gefällt mir
Reaktionen: areiland
Kleine Anmerkung zum Skript aus Post#49 und die Verwendung von AutoIT:

Kommentare sind über das Semikolon ; möglich
Sieht man sich nach längerer Zeit den Quellcode nochmals an, so dauert es ungemein unnötig wieder es nachvollziehen zu können. Daher ist eine gute Dokumentation immer ans Herz zu legen.

Der Code lässt sich leider aufgrund teilweise fehlender Einrückungen nur semi-freundlich lesen.
Seitens AutoIT gibt es das Tool tidy.exe
-den Code in einen Ordner kopieren
-tidy.exe starten
-die .au3 wählen
-in dem Ordner wird die Datei als Backup erstellt + sämtliche if-, for- und while-Anweisungen werden automatisch eingerückt

lässt sich so einfacher und schöner lesen.
 
ryan_blackdrago schrieb:
Kommentare sind über das Semikolon ; möglich
Diese Qual vergesse ich nie :D Und sprechende Variablen helfen da auch. Ich kenne meinen sonstigen Murks den ich verfasse…

ryan_blackdrago schrieb:
Der Code lässt sich leider aufgrund teilweise fehlender Einrückungen nur semi-freundlich lesen.
Da möchte ich wohl die Schuld an die Forensoftware schieben. (Ich habe nur Leerzeichen verwendet, wieso das so weit eingerück wurde weiß ich micht.)
Von dato wenig Platz in der Breite gewohnt waren mir Tab-Einrückungen um schon 4 Spalten zu viel, ich nutze nur eine ; und im Editor für AtoIt (oder VBA, ode WSH…) ist das für mich auch so gut genug lesbar.

ryan_blackdrago schrieb:
Seitens AutoIT gibt es das Tool tidy.exe
Habe ich eben ausprobiert (solche Funktionen/AddIns in anderen Editoren habe mich gelehrt ihnen auszuweichen) - welch Witz. Die durchgelaufene Datei ist genauso eingerückt wie das Original.

Trotzdem ein Dankeschön für den Beitrag und die Mühe da er absolut berechtigt war und gerne von Anderen die Code posten berherzigt werden mag.

CN8
 
Nachgehakt

Oder: Ein Schuss ins Leere

MS selbst gibt zum Ändern des Laufwerksbuchstabens PS C:\> Set-Partition -DriveLetter Y -NewDriveLetter Z an.

Was MS aber nicht angibt ist, dass das Laufwerk auch ein Medium enthalten muss. Konkret - ich stecke einen Kartenleser ein, der bekommt einen Buchstaben (P wie Puchstape). Es ist aber keine Karte eingesteckt…

PS C:\Windows\system32> PS C:\> Set-Partition -DriveLetter P -NewDriveLetter Z
Get-Process : Es wurde kein Positionsparameter gefunden, der das Argument "Set-Partition" akzeptiert.
In Zeile:1 Zeichen:1
  • PS C:\> Set-Partition -DriveLetter P -NewDriveLetter Z
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-Process], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetProcessCommand


…also streikt das Ganze mit der genannten Fehlermeldung. Vermutlich ist für WIN P durchaus P, für die PS aber nicht. Oder nichts was sie meint greifen zu können.

Da Tools es schaffen auch leere Laufwerke zu bedienen sollte es die (wie mir jüngst versichert wurde) allmächtige PowerShell das doch auch können.

CN8
 
Auf dem Kartenleser ist wohl noch keine Partitionstabelle und es muss erst eine geschrieben werden.
Das macht man nicht mit "Set-Partition", weil man da nichts setzen kann, was noch gar nicht vorhanden ist, sondern mit "New-Partition".

Hier mal ein Schnipsel aus meinem PS-Skript, das vielleicht das grundsätzliche Vorgehen bei dieser Aktion verdeutlicht. Es dient aber nur zur Information!

Deshalb gleich ein paar warnende Hinwiese vorweg:
  • Bitte den Beispiel-Code nicht 1:1 übernehmen und den Code-Schnipsel nicht unangepasst anwenden!
  • Es setzt voraus, dass in dem Beispiel ein USB-Stick angeschlossen ist und sonst kein weiterer externer Datenträger!
  • Ein Beispiel mit einem Kartenleser kann ich nicht liefern, da ich keinen Kartenleser zur Verfügung habe.

In dem Beispiel wird ein im System freier und somit verfügbarer Laufwerksbuchstabe automatisch vergeben.

PowerShell:
Stop-Service -Name ShellHWDetection

$NewUsbLb = "Test"
$DskNr = (Get-PhysicalDisk | Where {$_.BusType -Eq "USB" -And $_.CannotPoolReason -Match "Removable"}).DeviceID
$PrtSt = (Get-Disk | Where {$_.Number -Eq "$DskNr"}).PartitionStyle

If ($PrtSt -Eq "RAW")
{
    Initialize-Disk -Number $DskNr -PartitionStyle MBR -PassThru
}

Clear-Disk -Number $DskNr -RemoveData -RemoveOEM -Confirm:$False -PassThru
New-Partition -DiskNumber $DskNr -AssignDriveLetter -IsActive:$True -UseMaximumSize
$NewDrvLt = (Get-Volume | Where {$_.DriveType -Eq "Removable"}).DriveLetter
Format-Volume -DriveLetter "$NewDrvLt" -FileSystem FAT32 -NewFileSystemLabel "$NewUsbLb" -Force -Confirm:$False

Start-Service -Name ShellHWDetection
 
NotNerdNotDau schrieb:
Es setzt voraus, dass in dem Beispiel ein USB-Stick angeschlossen ist und sonst kein weiterer externer Datenträger!
Macht es leider schon nutzlos da über Reader und in genug Situationen (Anhängen eines Backup-LW) mehr denn ein USB-LW im Spiel sind; bei Multi-Readern unvermeidbar.

NotNerdNotDau schrieb:
Auf dem Kartenleser ist wohl noch keine Partitionstabelle
Also (jetzt lasse ich mal die Zügel los) diese verflixte PS ist zu blöd bequeme Angaben wie sie die REG liefert - LW-Buchstabe - auszuwerten und sucht stattdessen mit all ihren Möglichkeiten nach Partitontabellen… Sauber…
Und das soll ein Alleskönner sein..?

Plan der Aufgabe ist einen LW-Buchstaben zu übergeben - was durch die REG erfolgt, Kontextmenü eines LW, und damit auch existiert der Buchstabe auch ganz sicher. Die freien finden sich, der Rest ist nur Trennen und neu zuweisen.

An die Allgemeinheit:
Warum das alles nur über Set-Partition geht ist das mehr denn lästig. Was macht denn nur die Datenträgerverwaltung, was andere Tools, so ganz ohne Partitionen?

CN8
 
Jeder unformatierte Datenträger muss, damit ein LW-Buchstabe vergeben werden kann, formatiert werden und darauf eine Partition erstellt werden.

Egal ob mit diskpart, cmd, PS, über die Datenträgerverwaltung, oder mit einer externen Anwendung.
Es kann natürlich sein, dass ich nicht so ganz blicke, worauf du genau hinaus willst.

Wenn sich der Kartenleser im fabrikneuen Zustand befindet, dann muss der erst formatiert werden.
Sollte sich darauf eine Partitionstabelle befinden und nur der LW-Buchstabe getauscht, oder ein anderer zugewiesen werden, dann kann man das mit Windows-Bordmitteln erledigen. Allerdings muss der Code dann auch korrekt sein.
"Set-Partition" alleine passt jedenfalls nicht, deshalb auch die Fehlermeldung.
 
Zurück
Oben