【问题标题】:capture result of wmic command to variable [duplicate]将wmic命令的结果捕获到变量[重复]
【发布时间】:2023-03-22 15:05:01
【问题描述】:

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

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

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

【问题讨论】:

  • edit您的问题标题与相关内容相关,而不仅仅是重复您添加的标签。您的标题应该描述您提出的问题或您试图解决的问题,并且应该足够清晰,以供在搜索结果列表中看到它的未来读者使用。您只是将标签信息冗余添加为主题,毫无意义且重复。
  • 强制性“DOS 和批处理是不同的动物,你几乎可以肯定没有使用 DOS”评论。

标签: windows batch-file cmd wmic


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢 Compo 最初我使用提示询问驱动器号,如下所示。这工作得很好,但你给了我正是我所希望的。再次感谢。 @echo off echo 输入源驱动器号 set /p Drive=driveletter: 然后将脚本中对驱动器号的所有引用替换为 %drive%
    【解决方案3】:

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

    set "DriveLetter=%~d0"
    

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

    【讨论】:

    • 谢谢莫菲。这是一个非常简单的解决方案,可以完成工作。我不明白,但这正是我想要做的。
    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多