Назначение буквы на диск с помощью автозапуска

1416
Mycroft Holmes

У меня есть внешний диск, которому по неизбежным причинам необходимо назначать одну и ту же букву, независимо от того, к какому компьютеру я его подключаю. Я думал, что это может быть выполнено скриптом Diskpart. Я знаю GUID раздела, но как выбрать жесткий диск в Diskpart, используя GUID? Или есть какой-то другой способ назначить букву на жесткий диск с помощью скрипта?

0
Похоже, что нет способа перейти от руководства к тому. Diskpart вообще не отображает направляющие ни на уровне раздела, ни на уровне тома, поэтому даже если вы написали сценарий powershell для выбора каждого диска, а затем выбрали каждый раздел, вы не сможете сопоставить его с известным GUID. Единственное, что я могу предложить, - это попытаться сопоставить свой диск на основе метки (похоже, это единственная идентифицирующая информация, которую вы можете получить на томе) и проанализировать номер тома. тогда вы можете использовать команду выбора тома n, где n - номер проанализированного тома. Таким образом, вам не нужно выбирать диски / детали вообще. Frank Thomas 8 лет назад 0
Можно ли использовать mountvol для назначения буквы, используя GUID? Mycroft Holmes 8 лет назад 0
похоже, что mountvol может использовать guid, используя аргумент Volumename и объединяя GUID, но mountvol будет монтироваться не по букве диска, а по существующему пути. Вы не можете указать несмонтированный целевой путь для монтирования тома. Если это хорошо для вас, то это должно работать. смотрите больше здесь: https://technet.microsoft.com/en-us/library/bb490934.aspx Frank Thomas 8 лет назад 0
@MycroftHolmes: Можете ли вы установить программу / сервис на каждом компьютере, к которому будет подключен привод? Karan 8 лет назад 0
@Karan: установка программы оставит ненужный след в системе. Я пытался найти решение, используя опубликованный мной пакетный скрипт. Это, конечно, требует прав администратора. Просьба пройтись по сценарию, пожалуйста. Любой указатель для улучшения кода будет оценен. Mycroft Holmes 8 лет назад 0
Обратите внимание, что Windows запоминает назначения букв дисков до тех пор, пока они не будут перезаписаны, поэтому, если вы подключаете определенный диск и вручную назначаете ему букву K, например, то обычно, если K не является следующей доступной буквой диска, Windows не будет назначать ее любому другому диску, но помните об этом конкретном диске. Karan 8 лет назад 0
Правда. Но если одновременно используется несколько внешних жестких дисков и дисков, буквы дисков, как правило, назначаются другому тому. То, что делает мой скрипт - это возвращает его обратно, даже если он занят каким-то другим томом. Однако это опасная практика, если какой-либо процесс блокирует этот том. Mycroft Holmes 8 лет назад 0
Да, именно поэтому я сказал «до тех пор, пока они не будут перезаписаны», но если вы назначите что-то вроде Z, например, тогда, если вы не исчерпаете все остальные, Windows не должна перезаписывать настройку, и поэтому вы можете быть разумно уверены в этом случае. Скрипт, тем не менее, определит букву диска. Это проблема XY, потому что, хотя обходной путь может работать, реальная проблема заключается в том, что требует, чтобы одна и та же буква диска использовалась каждый раз? Karan 8 лет назад 0
Причина в том, что я использую некоторые программы резервного копирования, для которых требуется правильная буква внешнего диска. Mycroft Holmes 8 лет назад 0

2 ответа на вопрос

1
Mycroft Holmes

Вот пакетный файл, который я написал, чтобы изменить букву тома на K. Любая помощь в улучшении кода будет принята с благодарностью.

PS. В начале есть часть кода для запуска с использованием прав администратора. Я намеренно опустил это.

: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

Я также сделал скрипт Powershell для той же работы. Powershell делает лучше, чем пакетный скрипт.

$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 } 

Похожие вопросы