Пакетный файл и переменные буквы USB-накопителя

Я пытаюсь создать пакетный файл резервной копии для автоматизации Acronis True Image и обслуживания резервного копирования.

Буква USB-накопителя меняется в зависимости от того, на какой машине выполняется резервное копирование и / или сколько устройств подключено и использует буквы дисков ...

Мой пакет находится в C:\ Мой пакет будет вызывать ATI. ATI выгружает образ на C:\ Затем пакет ищет мой внешний диск на основе серийного номера тома следующим образом:

SET SN=30BC-F5A4
SET found=

0>NUL SET /P=Searching for external drive...
TIMEOUT 3 /NOBREAK >NUL

FOR %%N IN (D E F G H I J K L M O P Q R S T U V W X Y Z) DO (
IF defined found CALL :MOVE
VOL %%N: 2>NUL | FIND "%sn%" >NUL && CALL :MOVE %%N
)

ECHO  Fail^^!
TIMEOUT 3 /NOBREAK >NUL

ECHO.
ECHO Connect it now and cancel "Autoplay".
TIMEOUT 3 /NOBREAK >NUL

ECHO.
ECHO Press any key to try again...
PAUSE >NUL

CALL: EXTERNAL



:: ***MOVE BACKUP***

:MOVE

Хорошо, это работает нормально, но сейчас мне нужно что-то вроде:

Найдите подходящее внешнее устройство по серийному номеру. (Как указано выше) Возьмите правильную букву диска и превратите ее в переменную. Прервите цикл FOR IN DO, когда будет найдена буква диска, и сделайте его переменной. Используйте переменную, чтобы проверить, существует ли папка. Если папки не существует, создайте ее. Если папка существует, проверьте, существует ли в ней MyBackup.tib. Если да, удалите файл. CHDIR или что-то вроде того, где находится пакет, (C:\) и MOVE вновь созданная резервная копия в папку на внешнем.

Я собираюсь десять часов подряд работать над этой проблемой, и я не ближе к поиску правильного синтаксиса / команды (команд), чем был вначале.

ПОЖАЛУЙСТА, вы можете помочь !? Я дам тебе печенье, лол!

Я использую Windows 7 Ultimate, если это поможет ...


person S3NTYN3L    schedule 13.04.2012    source источник
comment
PowerShell или msys вариант?   -  person    schedule 13.04.2012
comment
Нет, я бы не хотел ничего устанавливать. Я буду использовать эту партию на машинах друзей и родственников, так что ...   -  person S3NTYN3L    schedule 13.04.2012


Ответы (5)


Серийный номер - это число в шестнадцатеричной системе счисления (с дефисом, вставленным во многом так же, как запятые используются в качестве разделителя тысяч в десятичных числах).

WMIC volume get driveLetter, serialNumber можно использовать для получения списка всех букв дисков с их серийными номерами в десятичной системе счисления. Ваш серийный номер 30BC-F5A4 соответствует десятичному 817690020. Я преобразовал ваш шестнадцатеричный SN в десятичную форму, используя следующую команду в командной строке: set /a 0x30BCF5A4.

Таким образом, следующая команда установит в переменной букву диска (с двоеточием) вашего внешнего диска.

set SN=817690020
set "extDrive="
for /f %%D in ('wmic volume get driveLetter^, serialNumber ^| find "%sn%"') do set extDrive=%%D
if not defined extDrive echo Error finding external drive & exit /b

Я не понимаю, откуда взялось название папки, о которой вы говорите. Я предполагаю, что у вас есть переменная, значение которой каким-то образом определено. Я просто назову переменную "папка".

set folder=someFolderName
if not exist "%extDrive%\%folder%\" mkdir "%extDrive%\%folder%"

Вы можете использовать команду MOVE, чтобы переместить вновь созданную резервную копию в папку на внешнем диске, автоматически перезаписав любую существующую резервную копию, если она уже существует.

move /y "c:\MyBackup.tib" "%extDrive%\%folder%\"
person dbenham    schedule 14.04.2012
comment
Вы можете оставить исходную команду SET SN и добавить после нее преобразование: SET /A SN=0x%SN:-=%. - person Andriy M; 14.04.2012
comment
Ой: if not defined "%extDrive%\%folder%\" mkdir "%extDrive%\%folder%". Вы имели в виду if not exist …, верно? - person Andriy M; 14.04.2012
comment
Спасибо, Андрей, еще один тупой с моей стороны. Все исправлено. @ S3NTYN3L - это довольно важное исправление ошибки. Старый код, скорее всего, попытается создать папку, даже если она уже существует, и выдаст сообщение об ошибке. Исправление создает папку только при необходимости. - person dbenham; 14.04.2012

Вы можете запросить букву диска, например:

Допустим, некоторые фотографии, для которых необходимо создать резервную копию, находятся в каталоге a \ b \ c на нашем диске, чья буква меняется между компьютерами. И вы хотите сохранить свои фотографии на главный диск в каталог x \ y \ z на основном диске (диск C :)

set /p Path="Enter the drive letter for your drive on this computer. No symbols, just the capital letter"
xcopy /e /v  %Path%:\a\b\c c:\x\y\z

Вы даже можете попросить путь для резервного копирования, вот так ...

set /p Path="Enter the drive letter for your removable drive on this computer. No symbols, just the capital letter."
set /p PathBackUp="Enter the path to where you want your data to be backed up on this computer. Start with a backslash."
set /p BackupDrive="Enter the drive letter for your data to be backed up to on this    computer. No symbols, just the capital letter."
xcopy /e /v  %Path%:\a\b\c %BackupDrive%:%PathBackUp%

Или оба...

set /p Path="Enter the drive letter for your removable drive on this computer. No symbols, just the capital letter."
set /p DataPath="Enter the path where your data to be backed up is. Start with a backslash, and don't include the drive letter.
set /p PathBackUp="Enter the path to where you want your data to be backed up on this computer. Start with a backslash, and don't include the drive letter."
set /p BackupDrive="Enter the drive letter for your data to be backed up to on this    computer. No symbols, just the capital letter."
xcopy /e /v  %Path%:%DataPath% %BackupDrive%:%PathBackUp%

Я предполагаю, что такого рода поражение противоречит цели автоматизации, но это всего лишь мысль; может это поможет.

Для получения дополнительной информации о команде и модификаторах xcopy см. http://www.computerhope.com/xcopyhlp.htm < / а>

Для получения дополнительной информации о команде set см. http://www.computerhope.com/sethlp.htm

person evamvid    schedule 25.08.2013

Это просто найдет все USB-накопители, подключенные к системе.

@echo off

for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,description^,drivetype 2^>NUL`) do (

if %%l equ 2 (
echo %%i is a USB drive.
        )
        )
person sparky3489    schedule 23.11.2013

Я искал везде и пробовал многое - это самый быстрый и простой вариант командной строки для переключения букв диска.

echo off

set /p Path="Enter the Drive Letter of the source File then press enter___"

set /p Pathde="Enter the Drive Letter of the Destination File then press enter___"

echo on

COPY %path%:\Users\Dell\Desktop\test.txt %pathde%:\test.txt
person Jim    schedule 19.10.2014

Я написал небольшую программу на языке C (lpath.exe) для решения проблемы изменения букв дисков съемных устройств.

Идея состоит в том, чтобы создать каталог (который можно скрыть) на соответствующем USB-устройстве или использовать имя диска / диска, заданное с помощью проводника Windows.

Программа lpath проверяет все доступные диски, если каталог или имя диска существует, и возвращает текущую букву диска, которая будет использоваться в пакетном файле:

Создайте каталог на USB-диске:

mkdir f:\USB-DISK1

Чтобы разрешить букву диска:

lpath USB-DISK1:\myImages\House

это возвращает g: \ myImages \ House, если USB-диску в настоящее время назначена буква диска g:

В сценарии используйте, например:

setlocal EnableDelayedExpansion
set input=USB-DISK1:\exports\weekly
for /f "tokens=*" %%r in ('echo !input!^| lpath') do set input=%%r
echo resolved directory is: !input!

Более удобный способ - создать lset.cmd вместе с программой lpath.exe.

@echo off
rem
rem lset.cmd - set variable with resolved label path
rem
rem [00] 01.05.2019 CWa Initial Version
rem [02] 15.06.2019 CWa ++
rem
if not {%COMPUTERNAME%}=={!COMPUTERNAME!} echo %~n0-ERROR: use this function with 'setlocal EnableDelayedExpansion' only & exit /b 7

rem USAGE: lib\lset variable "path"    - set variable with resolved label path

set __lset_path=%~2
if {!__lset_path!}=={} set %1=& exit /b
for /f "tokens=*" %%r in ('echo !__lset_path!^| "%~dp0lpath"') do set %1=%%r
set __lset_path=

и используйте его в основном сценарии пакета, как:

setlocal EnableDelayedExpansion
call lset input USB-DISK1:\exports\weekly
echo resolved directory is: !input!

Для более подробного руководства см .: lpath - развернуть путь, содержащий метки

Скомпилированную версию lpath.exe и lset.cmd можно найти в WA2LWinTools \ lib файла пакет WA2L / WinTools.

Недостатком этого решения является то, что вам нужен как минимум один дополнительный файл для распространения вместе со скриптом.

person CWa    schedule 21.05.2019