在批处理脚本中从string中提取数字

我一直在努力编写一个脚本,可以从驱动器的其他属性中find驱动器索引号。 脚本如下:

@echo off REM batch file to load Veracrypt Set "driveIndex=" for /f "skip=1 tokens=1 delims= " %%a in ('wmic diskdrive where "model ='WD Elements 1078 USB Device'" get index') do SET driveIndex=%%a & goto reportLetter :reportLetter if not defined driveIndex ( echo Error Occured! pause exit ) else ( echo \Device\Harddisk%driveIndex:~0%\Partition3 pause exit ) 

但是,脚本的输出是\Device\Harddisk1 \Partition3 。 我尝试了很长一段时间,但可以让脚本给出以下输出: \Device\Harddisk1\Partition3

任何人都可以告诉我如何纠正代码来获得所需的输出?

尝试这个

 DO SET "driveIndex=%%a" 

你的线

 ... do set driveIndex=%%a & goto ... 

被解释为set driveIndex=%%a<space>& goto ... ,这是, \Device\Harddisk1 \Partition3中的额外空间来自何处。

当然你可以写:

 ... do set driveIndex=%%a& goto ... 

但更好的语法是:

 ... do set "driveIndex=%%a" & goto ... 

这消除了任何意想不到的空间。

注1: set空间非常挑剔。 set var = hello用值<space>hello<space>创建一个名为var<space>的变量。

笔记2:

set var="value"将值设置为"value"

set "var=value"将值设置为value 。 这个语法给你完整的(和可见的)控制变量名称和它的值。

 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET DRIVE_INDEX= FOR /F "usebackq skip=1" %%i IN (`wmic diskdrive where "model = 'HGST HTS725050A7E630 ATA Device'" get index`) DO ( IF "!DRIVE_INDEX!" EQU "" (SET DRIVE_INDEX=%%i) ) ECHO DRIVE_INDEX is set to %DRIVE_INDEX% 

我相信问题是WMIC输出是Unicode。

我会尝试

 for /f "skip=1 tokens=1 delims= " %%a in ('wmic diskdrive where "model ='WD Elements 1078 USB Device'" get index^|more') do SET driveIndex=%%a & goto reportLetter 

^|more转换为ANSI。 脱字符号逃脱管道告诉cmd管道是要执行的命令的一部分。