Я использую VHD disk для хранения файлов Dropbox на моем офисном ПК.

Мне нужно, чтобы VHD загружался автоматически при загрузке, т. Е. Мне нужно будет просто ввести decode password а не использовать инструмент « Disk Manager , например, здесь.

Мой поиск в Google пришел с командой DiskPart ; хотя я не могу установить drive letter без указания параметра volume id . В этой теме появилось больше информации о поиске в Google, хотя использование Powershell для меня не является привычным способом. Мне нужна собственная команда Windows, которая просто работает.

Поэтому мой вопрос заключается в том, как получить volume id смонтированного диска VHD при вызове DiskPart? В настоящее время я должен установить его как 3, который применим только для моего ПК.

п.с.

  1. Не ищу скрипты Powershell
  2. Мой скрипт DiskPart можно посмотреть здесь 1) mount, 2) unmount

3 ответа3

2

Я использую скрипт, который нашел в интернете очень давно.

Этот сценарий (MountVHD.cmd) создает сценарий diskpart, а затем вызывает diskpart с созданным сценарием, используя указанный путь и букву диска.

Этот скрипт принимает два параметра:

MountVHD.cmd \path\to\vhdfile.vhd X

где X: буква диска для назначения.

Затем вы можете создать другой командный сценарий, который вызывает его с помощью командной строки выше, и поместить этот вызывающий сценарий в папку автозагрузки.

@echo off
setlocal enabledelayedexpansion

if {%1}=={} (
    echo Usage: %~nx0 [vhd] [letter]
    exit /b 1
)
set vhdPath=%~dpnx1
set driveLetter=%2

if {!driveLetter!}=={} (
    echo Mounting !vhdPath!
) else (
    echo Mounting !vhdPath! to !driveLetter!:
)

REM
REM create diskpart script
REM
set diskPartScript=%~nx0.diskpart
echo sel vdisk file="!vhdPath!">!diskPartScript!
echo attach vdisk>>!diskPartScript!

REM assign the drive letter if requested
if not {!driveLetter!}=={} (
    echo select partition 1 >>!diskPartScript!
    echo assign letter=!driveLetter!>>!diskPartScript!
)

REM Show script
echo.
echo Running diskpart script:
type !diskPartScript!

REM
REM diskpart
REM
diskpart /s !diskPartScript!
del /q !diskPartScript!

echo Done!

endlocal
0

Факт: невозможно написать отдельный сценарий на диске, который выбирает конкретную букву диска для смонтированного виртуального жесткого диска!

Но можно сделать два вызова diskpart (с двумя сценариями), которые вызываются одним пакетом или любой другой программой.

Причина проблемы: Кажется, существует проблема с синхронизацией, по крайней мере, в некоторых версиях Windows, таких как Windows 7. Diskpart не ждет, пока присоединение завершится успешно.

Для некоторых приложений это не проблема, так как назначенная буква диска будет запомнена в следующий раз, поэтому вы сможете писать сценарии на ОДНОМ компьютере после первого подключения.

Однако для полного независимого сценария этого недостаточно. Разделение его на две команды diskpart - единственный способ автоматизировать это, если вы хотите избежать powershell:

Вот сценарий как решение (по какой-то причине он избегает 'enabledelayedexpansion', но это не важно, вы можете добавить это и удалить команды goto, если хотите :-)

Скрипт работает даже без параметров. У этого есть некоторые хорошие особенности, например

  • Он просто ищет само имя .vhd, если не указано :-)
  • Он создает сценарии diskpart в каталоге% TEMP%, потому что вам не гарантирован доступ к записи там, где лежит сценарий (и он чище).

Одна вещь, которую стоит упомянуть: поскольку буква диска изменяется во время второго вызова диска, "теневая запись" в проводнике Windows для старой буквы может отображаться до повторного открытия окон проводника.

@echo off

pushd "%~dp0"
set thisPath=%~dp0
setlocal

REM
REM Determining parameters
REM
REM You can specify the path to a specific vhd file in parameter 1, but you don't have to. Script will take 1st .vhd file found.
REM You can specify the driveletter - without colon - in parameter 2, but you don't have to. Script will take free drive letter found.
set vhdPath=%~dpnx1
set driveletter=%2
echo ThisPath: "%thisPath%"
if {%vhdPath%}=={} echo No specific VHD mentioned- will take first VHD file..

if not {%vhdPath%}=={} goto SpecificVHD
set SearchPath=%thisPath%*.vhd
echo SearchPath: %SearchPath%
for %%I in ("%SearchPath%") do (
   rem echo File: "%%I"
   set vhdpath=%%I
   if exist "%%I" goto outloop
)
:outloop
:SpecificVHD
echo.
if not exist %vhdpath% (
   echo Error! No .vhd file found in '%thisPath%' !
   exit /B 1
)

echo VHD path: %vhdpath%
rem pause

if {%driveLetter%}=={} (
    set Text=Mounting %vhdPath%
) else (
    set Text=Mounting %vhdPath% to %driveLetter%:
)
echo %Text%
echo.

REM
REM Create diskpart script
REM
set diskPartScript=%TEMP%\%~n0.diskpart
echo Creating diskpart script: '%diskPartScript%'
rem exit /B 0
rem pause

echo sel vdisk file="%vhdPath%">"%diskPartScript%"
echo attach vdisk>>"%diskPartScript%"

REM
REM diskpart Part 1
REM
diskpart /s "%diskPartScript%"
del /q "%diskPartScript%"

REM Assign the drive letter if given
REM [it is assumed, that only 1 partition exists in the VHD]
if {%driveLetter%}=={} goto noSpecificDriveLetter
   echo sel vdisk file="%vhdPath%">"%diskPartScript%"
   echo select partition 1 >>"%diskPartScript%"
   echo assign letter=%driveLetter%>>"%diskPartScript%"

REM timeout is not necessary on my system, but could be useful, so specified here
REM timeout /T 1 /nobreak

REM
REM diskpart Part 2
REM
diskpart /s "%diskPartScript%"
del /q "%diskPartScript%"

:noSpecificDriveLetter
echo Done.
popd
endlocal
pause
0

Я сталкивался с подобной ситуацией, и я надеюсь, что это может помочь вам ...

Я сделал резервную копию диска C моей старой рабочей станции на виртуальном жестком диске с меткой диска "Old_BG7". Файл VHDX в настоящее время находится на сервере в моем центре обработки данных (\\bgserver\e $\Backup\NetOpsBG7_C $ .vhdx). Я хотел, чтобы этот виртуальный диск был подключен как мой диск E: при каждом входе в систему. Проблема, с которой я столкнулся, заключалась в том, что Diskpart не всегда назначал один и тот же номер тома моему виртуальному диску.

Вот что я сделал, чтобы обойти эту проблему, и до сих пор она работала для меня.

Я создал запланированное задание, которое запускает пакетный сценарий (C:\Users\BG\AppData\Roaming\BG_Stuff\NetOpsBG7_E $ .cmd) при входе в систему с повышенными привилегиями. Этот пакетный скрипт выглядит так:

@echo off

diskpart /s "%userprofile%\AppData\Roaming\BG_Stuff\NetOpsBG7_C$.cfg"

for /f "tokens=2,3* delims= " %%i in ('echo list volume ^| diskpart ^| find /i "Old_BG7"') do if not %%j==E (echo select volume=%%i>"%userprofile%\AppData\Roaming\BG_Stuff\tmpScript.cfg" && echo assign letter=E>>"%userprofile%\AppData\Roaming\BG_Stuff\tmpScript.cfg" && echo exit>>"%userprofile%\AppData\Roaming\BG_Stuff\tmpScript.cfg" && diskpart /s "%userprofile%\AppData\Roaming\BG_Stuff\tmpScript.cfg" && del /q "%userprofile%\AppData\Roaming\BG_Stuff\tmpScript.cfg")

exit 0

Первая команда в пакетном сценарии вызывает этот стандартный сценарий diskpart (C:\Users\BG\AppData\Roaming\BG_Stuff\NetOpsBG7_C $ .cfg):

select vdisk file="\\bgserver\e$\Backup\NetOpsBG7_C$.vhdx"
attach vdisk
exit

Однако настоящее волшебство происходит во второй строке пакетного сценария. Я повторяю команду "список томов" в Diskpart, передавая эти выходные данные с помощью команды "НАЙТИ", чтобы найти метку моего диска VHD "Old_BG7", а затем использую "FOR" для возврата двух переменных: номера тома и буквы диска установленный VHD. Затем команда 'IF' вступает во владение и проверяет, соответствует ли буква диска VHD букве "E" или нет. Если это так, он просто выходит и выходит; но если нет, он пишет, выполняет, а затем удаляет временный сценарий Diskpart (C:\Users\BG\AppData\Roaming\BG_Stuff\tmpScript.cfg).

Так, например, если буква диска, назначенная виртуальному жесткому диску, не была "E", а его номер тома оказался равным 5, то tmpScript будет выглядеть так:

select volume=5
assign letter=E
exit

Надеюсь это поможет...

- = В

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .