2

我正在尝试创建一个备份批处理文件来自动化 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...

4

5 回答 5

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

我不明白你所说的文件夹名称来自哪里。我假设您有一个变量,其值以某种方式定义。我将简单地将变量命名为“文件夹”。

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

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

move /y "c:\MyBackup.tib" "%extDrive%\%folder%\"
于 2012-04-14T00:35:18.553 回答
1

您可以要求驱动器号,如下所示:

假设您需要备份的一些照片在我们驱动器上的目录 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

于 2013-08-25T04:20:26.887 回答
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.
        )
        )
于 2013-11-23T03:41:16.047 回答
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
于 2014-10-19T23:11:14.983 回答
0

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

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

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

在 U 盘上创建目录:

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 [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.exelset.cmd的编译版本可以在WA2L/WinTools包的WA2LWinTools\lib中找到。

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

于 2019-05-21T21:40:44.500 回答