pasta de cópia em lote localizada por guid

1

Em um arquivo de lote, posso copiar uma pasta localizada por um caminho constante como \? \ Volume {GUID}?

Ao copiar (copiar, xcopy ou robocopy) um diretório e seu conteúdo de uma unidade removível local (por exemplo, uma unidade externa USB) para outro local na mesma unidade, eu gostaria de usar caminhos absolutos exclusivos e constantes como \? \ Volume {GUID} para evitar o uso de letras de unidade que podem mudar com o tempo. Para operar a cópia, o arquivo de lote deve ser colocado no dispositivo removível, mas no caso de o arquivo ser movido ou colocado em outro lugar, eu prefiro ter certeza de que ele está operando na boa unidade.

Até agora eu tentei:

  • COPY pode manipular caminhos \? \ Volume {GUID} para copiar um arquivo, mas não pode copiar pastas
  • XCOPY retorna um erro "unidade inválida"
  • ROBOCOPY fornece um "caminho de rede não encontrado, aguarde 30 segundos ..."
  • para cada comando acima: variações de sintaxe com \? \ UNC \ Volume {guid} e com o trailing "\"

Estou fazendo algo errado ou isso não é o jeito de fazer isso?

Existe outra maneira de usar locais invariantes?

Idealmente, deve envolver o mínimo possível de ajustes. Por ajustes quero dizer: rotular a unidade ou dar uma carta fixa, etc.

    
por fkk 05.01.2017 / 06:02

1 resposta

1

Nomear um volume difere de < href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx"> Nomeando arquivos, caminhos e espaços para nome .

O próximo script mostra a possível abordagem de como obter a letra da unidade atualmente atribuída a um volume. Usa a classe Win32_Volume :

The Win32_Volume class represents an area of storage on a hard disk. The class returns local volumes that are formatted, unformatted, mounted, or offline. A volume is formatted by using a file system, such as FAT or NTFS, and might have a drive letter assigned to it. One hard disk can have multiple volumes, and volumes can span multiple physical disks. The Win32_Volume class does not support disk drive management.

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
call :getDriveLetter "\?\Volume{5c729d19-70f7-11e5-830d-ac220b50824f}\"
call :getDriveLetter "\?\Volume{090c044f-7ccc-11e4-824e-806e6f6e6963}\"
call :getDriveLetter "\?\Volume{de60a588-fbe5-11e4-826f-806e6f6e6963}\"
:endlocal
ENDLOCAL
goto :eof

:getDriveLetter
set "_volumeID=%~1"
set "_DriveLetter="
for /F "tokens=1,* delims==" %%G in ('
  wmic volume where "DeviceID='%_volumeID:\=\%'" get DriveLetter /value
  ') do for /F %%g in ("%%~H") do set "_%%~G=%%~g"
call :doSomething
goto :eof

:doSomething
rem only output for debugging 
if defined _DriveLetter (
    echo %_volumeID% DriveLetter %_DriveLetter% 
) else (
    echo %_volumeID% DriveLetter unknown
)
goto :eof

Saída :

d:\temp> D:\bat\SU63592.bat
\?\Volume{5c729d19-70f7-11e5-830d-ac220b50824f}\ DriveLetter F:
\?\Volume{090c044f-7ccc-11e4-824e-806e6f6e6963}\ DriveLetter unknown
\?\Volume{de60a588-fbe5-11e4-826f-806e6f6e6963}\ DriveLetter E:
    
por 05.01.2017 / 11:37