Script de comando do Windows 7 para montar o disco VHD com letra de unidade atribuída via DiskPart

0

Eu uso VHD disk para armazenar meus arquivos do Dropbox no meu PC do escritório.

Eu preciso que o .vhd seja carregado automaticamente quando iniciado, ou seja, eu só precisarei digitar decode password em vez de ir até o fim com Disk Manager tool por exemplo guiado aqui .

Meu pesquisa do Google surgiu com DiskPart comando ; embora não seja possível definir drive letter sem especificar o parâmetro volume id . Mais pesquisa do Google surgiu com este segmento , embora usando Powershell não é uma maneira nativa / favor para mim. Eu preciso de um comando nativo do Windows que simplesmente funciona.

Então, minha pergunta é como obter volume id de um disco VHD montado ao chamar o DiskPart? Atualmente eu tenho que configurá-lo como 3, que só se aplica ao meu PC.

p.s.

  1. Não está procurando por scripts do Powershell
  2. Meu script DiskPart pode ser visto aqui 1) monte , 2) desmontar
por Nam G VU 07.01.2016 / 06:11

3 respostas

1

Eu usei um script que encontrei na Internet há muito tempo.

Esse script (MountVHD.cmd) gera um script diskpart e, em seguida, chama diskpart com o script gerado usando o caminho e a letra da unidade que você especifica.

Este script aceita dois parâmetros:

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

onde X: é a letra da unidade a ser atribuída.

Você pode então criar outro script de comando que chama isso com a linha de comando acima e colocar esse script de chamada na pasta de inicialização.

@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
    
por 08.01.2016 / 03:17
0

Fato: Não é possível escrever um único script diskpart que selecione uma letra de unidade específica para um VHD montado!

Mas é possível fazer duas chamadas diskpart (com dois scripts) que são chamadas por um lote ou por qualquer outro programa.

Razão para o problema: Parece haver um problema de tempo, pelo menos com algumas versões do Windows como o Windows 7. O Diskpart não está esperando até que o 'attach' seja bem-sucedido.

Para algumas aplicações, parece que não há problema, porque a letra da unidade, uma vez atribuída, será lembrada para a próxima vez, para que você possa escrever scripts em um computador após a primeira conexão.

No entanto, para um script independente completo, isso não é suficiente. A divisão em dois comandos diskpart é a única maneira de automatizar isso, se você quiser evitar o powershell:

Aqui está um script como uma solução (Evita'explodição habilitada ”por algum motivo, mas isso não é importante, você pode adicionar isto e remover comandos goto, se desejar: -)

O script funciona mesmo sem parâmetros. Tem alguns recursos interessantes, por exemplo,

  • Ele apenas procura o nome .vhd se não for fornecido: -)
  • Ele cria os scripts de diskpart no diretório% TEMP%, porque você não tem garantia de acesso de gravação no local em que o script está (e é mais limpo).

Uma coisa a ser mencionada: Como a letra da unidade é alterada durante a segunda chamada diskpart, é possível exibir uma "entrada de sombra" no Windows Explorer para a letra antiga até abrir as janelas do explorador novamente.

@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
    
por 13.04.2017 / 15:54
0

Encontrei uma situação semelhante e espero que talvez isso ajude você ...

Eu fiz o backup da unidade C da minha estação de trabalho antiga em um VHD com um rótulo de unidade de "Old_BG7". O arquivo VHDX atualmente reside em um servidor aqui no meu datacenter ( \\ bgserver \ e $ \ Backup \ NetOpsBG7_C $ .vhdx ). Eu queria ter esse disco virtual montado como minha unidade E: toda vez que eu fiz o login. O problema que eu encontrei, no entanto, foi que o Diskpart nem sempre atribuía o mesmo número de volume ao meu disco virtual.

Aqui está o que eu fiz para contornar essa questão e, até agora, tem trabalhado para mim.

Eu criei uma tarefa agendada que executa um script em lote ( C: \ Usuários \ BG \ AppData \ Roaming \ BG_Stuff \ NetOpsBG7_E $ .cmd ) no logon com privilégios elevados. Esse script em lote é assim:

@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

O primeiro comando no script em lote chama esse script de diskpart padrão ( C: \ Usuários \ BG \ AppData \ Roaming \ BG_Stuff \ NetOpsBG7_C $ .cfg ):

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

A mágica real, no entanto, acontece na segunda linha do script em lote. Estou ecoando o comando 'list volume' no Diskpart, canalizando essa saída através do comando 'FIND' para localizar meu rótulo de disco VHD "Old_BG7" e usando 'FOR' para retornar duas variáveis: o Número de Volume e a Letra da Unidade de o VHD montado. Em seguida, o comando 'IF' assume e verifica se a letra de unidade do VHD corresponde a "E" ou não. Se isso acontecer, ele simplesmente sai e sai; mas se não, ele escreve, executa e exclui um script temporário do Diskpart ( C: \ Usuários \ BG \ AppData \ Roaming \ BG_Stuff \ tmpScript.cfg ).

Assim, por exemplo, se a letra de unidade atribuída ao VHD era não "E", e seu número de volume era 5, o tmpScript ficaria assim:

select volume=5
assign letter=E
exit

Espero que isso ajude ...

- = B

    
por 05.09.2017 / 17:48