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

Regex 从批处理脚本中的字符串中提取数字,regex,windows,batch-file,batch-processing,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 rep

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

@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&goto…
,这就是
\Device\Harddisk1\Partition3
中额外空间的来源

当然你可以写:

... do set driveIndex=%%a& goto ... 
但更好的语法是:

... do set "driveIndex=%%a" & goto ...
这消除了任何意外的空间

注1:
set
对空格非常挑剔
set var=hello
创建一个名为
var
的变量,其值为
hello

注2:

set var=“value”
将值设置为
“value”


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

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

您可能想看看问题是wmic正在输出一个额外的空行。到目前为止,最好的答案是,但是你真的应该解释为什么这样做会更好,以使你的答案更好。我认为更多的是用
set
命令来解释引号,以避免变量末尾的空格,这就是问题所在。它起作用了!我不知道这些引语为什么起作用,我想知道,但它起了作用。
更多
对我来说没有任何改变。(WIN8.1)很遗憾,这将返回一个空白的%drive\u index%I修改了答案,请重试。谢谢,谢谢。工作得很有魅力。
@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%