从批处理脚本中的字符串中提取数字

时间:2015-05-10 23:19:59

标签: regex windows batch-file batch-processing

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

@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

有人能告诉我如何更正代码以获得所需的输出吗?

3 个答案:

答案 0 :(得分:3)

试试这个

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创建名为var<space>的变量,其值为<space>hello<space>

注2:

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

set "var=value"将值设置为value。此语法为您提供对变量名称及其值的完全(和可见)控制。

答案 1 :(得分:2)

@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%

答案 2 :(得分:1)

我认为问题在于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管道是要执行的命令的一部分。