将wmic命令的结果捕获到变量

时间:2017-03-25 00:53:32

标签: windows batch-file cmd wmic

我正在尝试编写一个小批量脚本来从拇指驱动器安装应用程序。问题是根据可用的驱动器号插入不同的机器时驱动器号会更改。我有脚本来运行安装但是想在开头添加一个脚本来检测我插入的拇指驱动器的已分配驱动器号,并将其存储在一个变量中,然后我可以在脚本的其余部分替换该驱动器信完成安装。

我得到了命令,以识别拇指驱动器的指定驱动器号,该驱动器号独立工作。

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

3 个答案:

答案 0 :(得分:2)

首先,将命令的输出捕获到变量use 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来发现此解决方法。

答案 1 :(得分:0)

您需要在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

答案 2 :(得分:0)

我认为执行的批处理文件存储在拇指驱动器上。并且双击执行此批处理文件。因此,您只需要:

set "DriveLetter=%~d0"

%~d0引用参数0的驱动器,它是批处理文件名。在命令提示符窗口call /?中运行,以获取有关如何引用批处理文件的参数的详细信息。 %~d0扩展为D:E:,...