Zuweisen eines Buchstabens zu einem Laufwerk mithilfe von Autorun

1595
Mycroft Holmes

Ich habe ein externes Laufwerk, dem aus unvermeidbaren Gründen derselbe Buchstabe zugewiesen werden muss, unabhängig davon, an welchem ​​Computer ich es einsetze. Ich dachte, dass dies durch ein Diskpart-Skript erreicht werden könnte. Ich kenne die GUID der Partition, aber wie wähle ich die Festplatte in Diskpart mithilfe der GUID aus? Oder gibt es eine andere Möglichkeit, der Festplatte mithilfe eines Skripts einen Buchstaben zuzuweisen?

0
Es scheint keinen Weg zu geben, von einer Guid zu einem Volume zu gelangen. Es scheint, dass Diskpart keine Hilfslinien anzeigt, weder auf Partitions- noch auf Volume-Ebene. Wenn Sie also ein Powershell-Skript zur Auswahl der einzelnen Festplatten und dann jede Partition ausgewählt haben, können Sie diese nicht mit der bekannten GUID vergleichen. Das Einzige, was ich vorschlagen kann, ist, dass Sie versuchen, Ihre Festplatte anhand von Label abzugleichen (dies scheint die einzige identifizierende Information zu sein, die Sie auf einem Volume erhalten können) und die Volume-Nummer zu analysieren. dann können Sie select volume n verwenden, wobei n die analysierte Volume-Nummer ist. Auf diese Weise müssen Sie keine Platten / Teile auswählen. Frank Thomas vor 8 Jahren 0
Kann mountvol verwendet werden, um den Brief mithilfe der GUID zuzuweisen? Mycroft Holmes vor 8 Jahren 0
Es sieht so aus, als könnte mountvol die GUID verwenden, das Argument Volumename verwenden und die GUID verketten, aber Mountvol wird nicht an einen Laufwerksbuchstaben angehängt, sondern an einen vorhandenen Pfad. Sie können keinen nicht gemounteten Zielpfad zum Einhängen des Volumes angeben. Wenn das in Ordnung ist, sollte es funktionieren. Weitere Informationen finden Sie hier: https://technet.microsoft.com/en-us/library/bb490934.aspx Frank Thomas vor 8 Jahren 0
@ MycroftHolmes: Können Sie ein Programm / einen Dienst auf jedem Computer installieren, an den das Laufwerk angeschlossen ist? Karan vor 8 Jahren 0
@ Karan: Die Installation eines Programms würde einen unnötigen Footprint auf dem System hinterlassen. Ich habe versucht, die Lösung mit dem von mir geposteten Batch-Skript zu erreichen. Dies erfordert natürlich Administratorrechte. Bitte gehen Sie das Skript durch, wenn Sie möchten. Jeder Zeiger zur Verbesserung des Codes wäre zu schätzen. Mycroft Holmes vor 8 Jahren 0
Beachten Sie, dass Windows die Laufwerkbuchstabenzuweisungen speichert, bis sie überschrieben werden. Wenn Sie also ein bestimmtes Laufwerk anschließen und ihm manuell den Buchstaben K zuweisen, wird es normalerweise nur dann angezeigt, wenn K der nächste verfügbare Laufwerkbuchstabe ist. Denken Sie jedoch daran, was für ein bestimmtes Laufwerk es ist. Karan vor 8 Jahren 0
Wahr. Wenn jedoch mehrere externe Festplatten und Pendrive gleichzeitig verwendet werden, werden die Laufwerksbuchstaben normalerweise einem anderen Volume zugewiesen. Was mein Skript macht, ist es zurückzuschnappen, selbst wenn es von einem anderen Volume belegt wird. Es ist jedoch eine gefährliche Praxis, wenn ein Prozess das Volume sperrt. Mycroft Holmes vor 8 Jahren 0
Ja, deshalb habe ich gesagt "bis sie überschrieben werden", aber wenn Sie zum Beispiel etwas wie Z zuweisen, sollten Sie die Einstellung nicht überschreiben, wenn Sie nicht alle anderen Windows-Elemente überschreiben. In diesem Fall können Sie sich also sicher sein. Ein Skript würde den Laufwerksbuchstaben jedoch definitiv sicherstellen. Dies ist jedoch ein XY-Problem, denn während die Problemumgehung möglicherweise funktioniert, besteht das eigentliche Problem darin, dass derselbe Laufwerkbuchstabe jedes Mal verwendet werden muss. Karan vor 8 Jahren 0
Der Grund ist, dass ich einige Backup-Software verwende, die den korrekten Laufwerksbuchstaben des externen erfordert. Mycroft Holmes vor 8 Jahren 0

2 Antworten auf die Frage

1
Mycroft Holmes

Hier ist die Batch-Datei, die ich geschrieben habe, um den Volumenbuchstaben in K zu ändern. Jede Hilfe zur Verbesserung des Codes wäre sehr dankbar.

PS. Am Anfang befindet sich ein Teil des Codes, um dies mit Administratorrechten auszuführen. Ich habe das absichtlich weggelassen.

:mainBody set "volume=\Volume" set "drive="  for %%D in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do ( mountvol %%D: /L | findstr "%volume%" >nul if not errorlevel 1 ( if %%D==K ( echo DONE! goto end ) else ( set "drive=%%D" goto clearK ) ) )  :clearK mountvol K: /L >nul if errorlevel 1 ( echo K: is free... ) else ( echo K: is taken... for /f "tokens=1 delims=" %%A in ('mountvol K: \L') do SET currdriveguid=%%A for %%D in ( Z Y X W V U T S R Q P O N M L K J H G F E D B A ) do ( mountvol %%D: /L >nul if errorlevel 1 ( mountvol K: /d mountvol %%D:\ currdriveguid echo Current Volume moved to %%D:... goto assignK ) ) )   : assignK if not defined drive ( mountvol K:\ \\?%volume%\ ) else ( mountvol %drive%: /D mountvol K:\ \\?%volume%\ )  :end 
0
Mycroft Holmes

Ich habe auch ein Powershell-Skript erstellt, um die gleiche Arbeit zu erledigen. Powershell ist besser als das Batch-Skript.

$driveI = Get-WmiObject -Class win32_volume -Filter "DriveLetter='I:'"  if ($driveI -eq $null) {  write-host "I: is free..."  } elseif ($driveI.DeviceID.Contains("7899c0f7-f556-11e4-9cf2-7071bc4ab2b5") -And "$drive.SerialNumber = '-1675536360'") {  write-host "I: is already assigned to the required disk..." Write-Host "Press any key to continue ..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") exit  } else {  write-host "I: is occupied..." foreach ( $s in @("'Z:'", "'Y:'", "'X:'", "'W:'", "'V:'", "'U:'", "'T:'", "'R:'", "'Q:'", "'P:'", "'O:'", "'N:'", "'M:'", "'L:'", "'K:'", "'J:'", "'H:'", "'G:'", "'F:'", "'E:'", "'D:'", "'B:'", "'A:'")) { $testdrv = Get-WmiObject -Class win32_volume -Filter "DriveLetter=$s"  if ($testdrv -eq $null) { $s = $s.Trim([char]0x0027) Set-WmiInstance -input $driveI -Arguments @ Write-Host I: has been moved to $s break } } }  $diary = Get-WmiObject -Class win32_volume -Filter "Label='My Diary'" if ($diary.DeviceID.Contains("7899c0f7-f556-11e4-9cf2-7071bc4ab2b5") -And "$diary.SerialNumber = '-1675536360'") { Set-WmiInstance -input $diary -Arguments @ Write-Host "Press any key to continue ..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") exit  } else {  Write-Host Error Occured! Write-Host "Press any key to continue ..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") exit }