【问题标题】:Why double results when call echo to output to file?为什么调用 echo 输出到文件时结果会加倍?
【发布时间】:2019-07-03 02:46:19
【问题描述】:

我正在尝试生成有关磁盘/驱动器的 DiskDevices.ini 文件。

这是my batch

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
SET "InputFile=DiskDevices.ini"
IF EXIST "%InputFile%" (DEL /f /q "%InputFile%")
SET /A "TotalDevices=0"
SET /A "Index=0"
@FOR /F "skip=2 tokens=*" %%G IN ('
"WMIC PATH Win32_DiskDrive GET Index /format:csv 2>NUL"
') DO (
    SET /A "TotalDevices=TotalDevices+1"
    SET /A "Index=Index+1"
    >>"%InputFile%" CALL ECHO [Device_%%Index%%]
    @FOR /F Tokens^=* %%G IN ('
    "WMIC PATH Win32_DiskDrive GET Caption,Size /value 2>NUL"
    ') DO (
        @FOR /F Tokens^=* %%H IN ("%%G") DO (>>"%InputFile%" CALL ECHO %%H)
        )
)
>>"%InputFile%" CALL ECHO [Total Devices]
>>"%InputFile%" CALL ECHO Value=%%TotalDevices%%
PAUSE

结果是循环两次。

[Device_1]
Caption=Samsung EVO
Size=162536803840
Caption=Kingston USB Device
Size=31718510080
[Device_2]
Caption=Samsung EVO
Size=162536803840
Caption=Kingston USB Device
Size=31718510080
[Total Devices]
Value=2

我也需要这个:

[Device_1]
Caption=Samsung EVO
Size=162536803840
[Device_2]
Caption=Kingston USB Device
Size=31718510080
[Total Devices]
Value=2

感谢您的帮助。

【问题讨论】:

    标签: batch-file cmd wmi wmic


    【解决方案1】:

    嗯,你已经嵌套了两个 for /F 循环,它们收集的信息基本相同,这就是你得到重复的原因。


    这种方法怎么样,它使用[Device_#] 标头的Index 属性以及内部wmic 查询的where 子句:

    @echo off
    set "COUNT=0"
    > "DiskDevices.ini" (
        for /F "delims=" %%J in ('wmic DiskDrive get Index /VALUE 2^> nul') do (
            for /F "tokens=2 delims==" %%I in ("%%J") do (
                echo [Device_%%I]
                for /F "delims=" %%H in ('wmic DiskDrive where "Index=%%I" get Caption^,Size /VALUE 2^> nul') do (
                    for /F "delims=" %%G in ("%%H") do (
                        echo(%%G
                    )
                )
                set /A "COUNT+=1"
            )
        )
        echo [Total Devices]
        call echo Value=%%COUNT%%
    )
    

    【讨论】:

    • 谢谢@aschipfl,我测试了你的批次,没有创建/生成的 DiskDevices.ini。在 Win10 x64 1809 上测试。
    • 我刚刚发现代码中有一个错误,虽然我不得不承认我还没有机会测试它......
    • 谢谢@aschipfl,我测试了你的新批次,没有创建/生成的 DiskDevices.ini。当将 REM 添加到 for /F "delims=" %%H in ('wmic DiskDrive where "Index=%%I" get Caption^,Size /VALUE 2^> nul') 时.........然后创建了 DiskDevices.ini。 [Device_0] [Device_1] [设备总数] 值=2
    • 糟糕,for /F %%H 循环中缺少左括号,现已修复...
    【解决方案2】:

    因为您获得了两次设备列表。在一个循环中执行所有操作,或者在第二个 wmic 调用中添加带有 Index 值的 where 条件以过滤掉其他设备。

    【讨论】:

    • 请详细说明你的答案/添加一些代码来改进它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多