Зачем удваивать результаты при вызове echo для вывода в файл? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь создать файл DiskDevices.ini для дисков / дисков.

Это моя партия .

@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

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Итак, вы вложили два цикла for /F, которые собирают в основном одну и ту же информацию, поэтому вы получаете дубликаты.


А как насчет этого подхода, который использует свойство Index для заголовка [Device_#], а также для предложения where внутреннего запроса wmic:

@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%%
)
0 голосов
/ 03 июля 2019

Потому что вы получаете список устройств дважды.Сделайте все в одном цикле или добавьте условие where со значением Index ко второму вызову wmic, чтобы отфильтровать другие устройства.

...