批处理文件和可变USB驱动器号

时间:2012-04-13 19:42:39

标签: batch-file usb-drive drive-letter

我正在尝试创建备份批处理文件以自动执行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,如果这有帮助......

5 个答案:

答案 0 :(得分:6)

序列号是一个十六进制表示的数字(用逗号表示的短划线用作十进制数字中的千位分隔符)。

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

我不明白您所谈论的文件夹名称的来源。我假设你有一个变量,其值以某种方式定义。我只需将变量命名为“folder”。

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

您可以使用MOVE命令将新创建的备份移动到外部驱动器上的文件夹,如果现有备份已存在则自动覆盖。

move /y "c:\MyBackup.tib" "%extDrive%\%folder%\"

答案 1 :(得分:1)

您可以要求提供驱动器信件,如下所示:

假设您需要备份的一些照片位于我们驱动器上的\ b \ c目录中,其字母在计算机之间更改。而且,您希望将照片备份到主驱动器,目录x \ y \ z 在主驱动器上(驱动器C:)<​​/ p>

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

答案 2 :(得分:0)

这将简单地找到连接到系统的所有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.
        )
        )

答案 3 :(得分:0)

我到处搜索并尝试很多东西 - 这是最快最简单的驱动器号切换命令行选项

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

答案 4 :(得分:0)

我写了一个小型C程序( lpath.exe )来解决更改可移动设备的驱动器号的问题。

这个想法是在相关的USB设备上创建一个目录(可以隐藏)或使用通过Windows资源管理器设置的驱动器/磁盘名称。

lpath 程序检查目录或磁盘名称是否存在,并检查所有可用磁盘,并返回要在批处理文件中使用的当前驱动器号:

在USB磁盘上创建目录:

mkdir f:\USB-DISK1

要解决驱动器号:

lpath USB-DISK1:\myImages\House

当前将USB磁盘分配给驱动器号 g:

时,它返回 g:\ myImages \ House

在脚本中使用例如:

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!

一种更方便的方法是在lpath.exe程序旁边创建一个 lset.cmd

@echo off
rem
rem lset.cmd - set variable with resolved label path
rem
rem [00] 01.05.2019 CWa Initial Version
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
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 - expand a path containing labels

lpath.exe lset.cmd 的编译版本可以在WA2L/WinTools WA2LWinTools \ lib 中找到包。

此解决方案的缺点是,您需要至少一个其他文件与脚本一起分发。