robocopy 批处理文件以获取所有本地磁盘和备份

robocopy batch file to get all local disks and backup

我有这个代码,

For /F "tokens=1" %%I In ('wmic logicaldisk get DeviceID^,DriveType^|Findstr "3"') Do (
If Exist "%%I" robocopy %%I "%dest%\%%I"  /MIR /IS /XA:SH /XD "!dirs!" /XF "!files!" /R:3 /W:3 /TEE /log+:"%srclog%\%logfile%" /NP
)

但是 robocopy 将源读取为备份作为当前用户的配置文件路径,即源:C:\Users\Administrator 而不是所需的 C:\

此外,如何将变量设置为仅包含字母并带有 :\ ?这是为了在备份目标中创建文件夹,以便我可以按驱动器字母对它们进行排序...

%%I 接收磁盘的 DeviceID,它只是驱动器号后跟一个冒号,如 C:。这就构成了相对路径。要使其绝对指向驱动器的根目录,只需附加一个反斜杠,如 C:\。所以在你的代码中 %%I 变成 %%I\.

对于问题的另一部分,要仅提取纯驱动器号,您需要一个中间变量来执行此操作,例如drive,然后您可以应用sub-string expansion, like %drive:~,1%. But since this happens in a block of code, you need to apply delayed expansion,像 !drive:~,1!(因为您已经对 !dirs!!files! 使用了延迟扩展,我假设您已经在脚本中的某处使用了命令行 setlocal EnableDelayedExpansion):

for /F "tokens=1" %%I in ('wmic LogicalDisk GET DeviceID^,DriveType ^| findstr "3"') do (
    set "drive=%%I"
    if exist "%%I\" robocopy "%%I\" "%dest%\!drive:~,1!" /MIR /IS /XA:SH /XD "!dirs!" /XF "!files!" /R:3 /W:3 /TEE /log+:"%srclog%\%logfile%" /NP
)