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

问题描述 投票:1回答:3

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

我得到了命令,以识别拇指驱动器的指定驱动器号,它自己工作。

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

windows batch-file cmd wmic
3个回答
0
投票

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

set "DriveLetter=%~d0"

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


2
投票

首先,要将命令的输出捕获到变量,请使用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的输出也捕获输出的编码,导致最后一个字符移动到行的开头或其他意外行为。解决方法是使用第二个嵌套的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发现此变通方法。


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
© www.soinside.com 2019 - 2024. All rights reserved.