将 wmic 命令的结果捕获到变量
capture result of wmic command to variable
我正在尝试编写一个小的批处理脚本来从拇指驱动器安装应用程序。问题是根据可用的驱动器号插入不同的机器时,驱动器号会发生变化。我有 运行 安装的脚本,但想在开头添加一个脚本,该脚本将检测我插入的拇指驱动器的分配驱动器号并将其存储在一个变量中,然后我可以在其余部分中替换该变量用于完成安装的驱动器盘符的脚本。
我得到了识别自己工作的拇指驱动器分配的驱动器盘符的命令。
wmic logicaldisk where volumename="StacelandFlash" get name
结果:D:
(正确)
但我似乎无法将其分配给变量。
set X=wmic logicaldisk where volumename="StacelandFlash" get name
echo X
结果:X
set X=wmic logicaldisk where volumename="StacelandFlash" get name
echo %X%
结果:wmic logicaldisk where volumename="StacelandFlash" get name
首先,要将命令的输出捕获到变量,请使用 for /F
。有关完整详细信息,请参阅 cmd 控制台中的 for /?
。示例:
for /f "tokens=2 delims=:" %%I in ('find /c /v "" "notes.txt"') do (
set /a "linecount=%%I"
)
rem // %linecount% now contains the number of lines in notes.txt
现在,捕获 WMI 查询结果有一些独特的复杂性。首先,您的 wmic
命令包含一个等号,它将打破 for /f
。这部分很容易修复:用插入符转义 =
(例如 ^=
),或者用引号将方程括起来。
下一个障碍有点棘手。 WMI 结果以非 ANSI 编码 (UCS-2 LE) 编码。捕获 wmic
的输出也会捕获输出的编码,导致最后一个字符被移动到行的开头或其他意外行为。解决方法是使用 second 嵌套 for /f
来清理值。
考虑到所有这些,我认为这就是您要找的东西:
@echo off
setlocal
for /f "tokens=2 delims==" %%I in (
'wmic logicaldisk where "volumename='StacelandFlash'" get name /value'
) do for /f "delims=" %%# in ("%%I") do set "driveletter=%%~#"
echo %driveletter%
注意:感谢 @Dave Benham 发现了这个解决方法。
您需要 运行 For 循环中的命令。
@Echo Off
For /F "Skip=1 Delims=" %%A In ('
"WMIC LogicalDisk Where (VolumeName='StacelandFlash') Get Name"
') Do For %%B In (%%A) Do Set "USB=%%B"
Echo(%USB%
Timeout -1
我想执行的批处理文件存储在拇指驱动器上。这个批处理文件是双击执行的。因此,您只需要:
set "DriveLetter=%~d0"
%~d0
引用参数 0 的驱动器,它是批处理文件名。 运行 在命令提示符 window call /?
中获取有关如何引用批处理文件参数的详细信息。 %~d0
扩展为 D:
、E:
、...
我正在尝试编写一个小的批处理脚本来从拇指驱动器安装应用程序。问题是根据可用的驱动器号插入不同的机器时,驱动器号会发生变化。我有 运行 安装的脚本,但想在开头添加一个脚本,该脚本将检测我插入的拇指驱动器的分配驱动器号并将其存储在一个变量中,然后我可以在其余部分中替换该变量用于完成安装的驱动器盘符的脚本。
我得到了识别自己工作的拇指驱动器分配的驱动器盘符的命令。
wmic logicaldisk where volumename="StacelandFlash" get name
结果:D:
(正确)
但我似乎无法将其分配给变量。
set X=wmic logicaldisk where volumename="StacelandFlash" get name
echo X
结果:X
set X=wmic logicaldisk where volumename="StacelandFlash" get name
echo %X%
结果:wmic logicaldisk where volumename="StacelandFlash" get name
首先,要将命令的输出捕获到变量,请使用 for /F
。有关完整详细信息,请参阅 cmd 控制台中的 for /?
。示例:
for /f "tokens=2 delims=:" %%I in ('find /c /v "" "notes.txt"') do (
set /a "linecount=%%I"
)
rem // %linecount% now contains the number of lines in notes.txt
现在,捕获 WMI 查询结果有一些独特的复杂性。首先,您的 wmic
命令包含一个等号,它将打破 for /f
。这部分很容易修复:用插入符转义 =
(例如 ^=
),或者用引号将方程括起来。
下一个障碍有点棘手。 WMI 结果以非 ANSI 编码 (UCS-2 LE) 编码。捕获 wmic
的输出也会捕获输出的编码,导致最后一个字符被移动到行的开头或其他意外行为。解决方法是使用 second 嵌套 for /f
来清理值。
考虑到所有这些,我认为这就是您要找的东西:
@echo off
setlocal
for /f "tokens=2 delims==" %%I in (
'wmic logicaldisk where "volumename='StacelandFlash'" get name /value'
) do for /f "delims=" %%# in ("%%I") do set "driveletter=%%~#"
echo %driveletter%
注意:感谢 @Dave Benham 发现了这个解决方法。
您需要 运行 For 循环中的命令。
@Echo Off
For /F "Skip=1 Delims=" %%A In ('
"WMIC LogicalDisk Where (VolumeName='StacelandFlash') Get Name"
') Do For %%B In (%%A) Do Set "USB=%%B"
Echo(%USB%
Timeout -1
我想执行的批处理文件存储在拇指驱动器上。这个批处理文件是双击执行的。因此,您只需要:
set "DriveLetter=%~d0"
%~d0
引用参数 0 的驱动器,它是批处理文件名。 运行 在命令提示符 window call /?
中获取有关如何引用批处理文件参数的详细信息。 %~d0
扩展为 D:
、E:
、...