从批处理脚本中的字符串中提取数字
Extract a number from string in batch script
我一直在努力编写一个脚本,该脚本将从驱动器的其他属性中找到驱动器索引号。脚本如下:
@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
中附加的space的来源。
当然你可以这样写:
... do set driveIndex=%%a& goto ...
但更好的语法是:
... do set "driveIndex=%%a" & goto ...
这消除了任何意外的 spaces。
注1:set
对space非常挑剔。 set var = hello
创建一个名为 var<space>
的变量,值为 <space>hello<space>
。
注2:
set var="value"
将值设置为 "value"
set "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
该管道是要执行的命令的一部分。
@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%
我一直在努力编写一个脚本,该脚本将从驱动器的其他属性中找到驱动器索引号。脚本如下:
@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
中附加的space的来源。
当然你可以这样写:
... do set driveIndex=%%a& goto ...
但更好的语法是:
... do set "driveIndex=%%a" & goto ...
这消除了任何意外的 spaces。
注1:set
对space非常挑剔。 set var = hello
创建一个名为 var<space>
的变量,值为 <space>hello<space>
。
注2:
set var="value"
将值设置为 "value"
set "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
该管道是要执行的命令的一部分。
@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%