批处理条件FOR循环嵌套IF

时间:2017-02-19 12:20:25

标签: batch-file

我试图编写一个解析文本文件的脚本,以通过Label识别可移动驱动器。目标是根据找到的驱动器创建一个复制脚本。

我能够解析文件,但我似乎无法让第二对IF条件成立。

我可能误解了如何在FOR的每个循环中评估变量。

赞赏的想法。

编辑:为了清晰起见,扩展了原始请求(我提出的时间已经很晚了)扩展的目标是确定一个或多个目标驱动器,以便从SD卡复制数据。由于驱动器号分配因PC而异,并且取决于首先插入的是什么,我的想法是使用标签作为可识别的值,并创建一个简单的复制字符串

XCOPY SourceDrive\*.jpg DestinationDrive1\<GetDate>\
XCOPY SourceDrive\*.jpg DestinationDrive2\<GetDate>\

结束修改

@echo off
cls
title "Detecting device drive letters..."
setlocal enabledelayedexpansion
set DestinationDrive1Found=
set DestinationDrive2Found=
set SourceDriveFound=
set SourceDrive=
set DestinationDrive1=
set DestinationDrive2=

echo Detecting device drive letters...

echo list volume > %systemdrive%\ListDrives.tmp
diskpart /s %systemdrive%\ListDrives.tmp > %systemdrive%\CurrentDrives.tmp

echo   Checking drive IDs
FOR /F "skip=7 tokens=2-4" %%a IN (%systemdrive%\CurrentDrives.tmp) DO ( 
set "matchvar=%%c"  
set "comparevar=!matchvar:DRIVE=!" 
IF /I NOT "!comparevar!" == "%%c" IF "!DestinationDrive1Found!" NEQ 1 (
echo Drive %%b was found to be %%c and will be DESTINATION1 
set DestinationDrive1Found=1
set DestinationDrive1=%%b )
IF /I NOT "!comparevar!" == "%%c" IF "!DestinationDrive1Found!" EQU 1 ( echo Drive %%b was found to be %%c and will be DESTINATION2 
set DestinationDrive2Found=1
set DestinationDrive2=%%b )
)    

文件我正在解析

Microsoft DiskPart version 10.0.10586

Copyright (C) 1999-2013 Microsoft Corporation.
On computer: NEWGLOOMWIN10

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     D                       DVD-ROM         0 B  No Media           
  Volume 1     E   Macintosh H  HFS    Partition    231 GB  Healthy            
  Volume 2     C   BOOTCAMP     NTFS   Partition    721 GB  Healthy    System  
  Volume 3     F   TEAMXCAMRAX  FAT    Removable   1937 MB  Healthy            
  Volume 4     G   TEAMXDRIVEX  NTFS   Partition    465 GB  Healthy            
  Volume 5     H   TEAMYDRIVEY  NTFS   Partition    931 GB  Healthy 

2 个答案:

答案 0 :(得分:0)

如果您只想将一些变量设置为分配给任何可移动驱动器的驱动器,并在其“label”中使用字符串DRIVE,则以下内容可为您提供不需要提升的替代方案。

@Echo Off
For /F "UseBackQ Skip=1 Delims=" %%A In (`WMIC LogicalDisk Where^
 "DriveType='2' And VolumeName Like '%%DRIVE%%'" Get Name`
) Do For /F %%B In ("%%A") Do Set/A "i+=1"&Call Set "_drv%%i%%=%%B"
Set _drv
Timeout -1

[编辑] - 正确规定固定驱动器的示例

@Echo Off
For /F "UseBackQ Skip=1 Delims=" %%A In (`WMIC LogicalDisk Where^
 "DriveType='3' And VolumeName Like '%%DRIVE%%'" Get Name`
) Do For /F %%B In ("%%A") Do Set/A "i+=1"&Call Set "_drv%%i%%=%%B"
Set _drv
Timeout -1

没有规定驱动器类型的示例(根据评论推荐)

@Echo Off
For /F "UseBackQ Skip=1 Delims=" %%A In (
    `WMIC LogicalDisk Where "VolumeName Like '%%DRIVE%%'" Get Name`
) Do For /F %%B In ("%%A") Do Set/A "i+=1"&Call Set "_drv%%i%%=%%B"
Set _drv
Timeout -1

答案 1 :(得分:0)

感谢所有回复的人。如果@Mofi提供了答案,我会将答案标记为答案。最后删除了四个引号并添加了一个ELSE,这让我得到了我想要的答案。

下面的脚本给了我我正在追求的内容。

@echo off
cls
title "Detecting device drive letters..."
setlocal enabledelayedexpansion
set DestinationDrive1Found=
set DestinationDrive2Found=
set SourceDriveFound=
set SourceDrive=
set DestinationDrive1=
set DestinationDrive2=

echo Detecting device drive letters...

echo list volume > %systemdrive%\ListDrives.tmp
diskpart /s %systemdrive%\ListDrives.tmp > %systemdrive%\CurrentDrives.tmp


echo   Checking drive IDs
FOR /F "skip=7 tokens=2-4" %%a IN (%systemdrive%\CurrentDrives.tmp) DO ( 
set "matchvar=%%c"  
set "comparevar=!matchvar:CAMRA=!" 
IF /I NOT "!comparevar!" == "%%c" (@echo Drive %%b was found to be %%c and will be SOURCE 
set SourceDriveFound=1
set SourceDrive=%%b)
)

echo   Checking drive IDs
FOR /F "skip=7 tokens=2-4" %%a IN (%systemdrive%\CurrentDrives.tmp) DO ( 
set "matchvar=%%c"  
set "comparevar=!matchvar:DRIVE=!" 
IF /I NOT "!comparevar!" == "%%c" IF !DestinationDrive1Found! NEQ 1 (
echo Drive %%b was found to be %%c and will be DESTINATION1 
set DestinationDrive1Found=1
set DestinationDrive1=%%b 
) ELSE ( 
IF /I NOT "!comparevar!" == "%%c" IF !DestinationDrive1Found! EQU 1 ( echo Drive %%b was found to be %%c and will be DESTINATION2 
set DestinationDrive2Found=1
set DestinationDrive2=%%b ))
)