Проблема формат Unicode выхода команды wmic
. Следовательно, ваш файл InstallList.txt
содержит много байтов 0x00
, которые приводят к завершению цикла for /F
.
Чтобы обойти это, захватить wmic
выход с for /F
цикла, поэтому он становится преобразуется в не-Unicode формат:
@echo off
for /F "skip=1 delims=" %%G in ('
wmic PRODUCT GET Name
') do echo %%G
Опция skip=1
удаляет заголовок Name
из выходного сигнала.
К сожалению, выход по-прежнему содержит некоторые тревожные артефакты (на самом деле, есть некоторые осиротые возвращения каретки). Чтобы избавиться от них, гнезда другой for /F
петли:
@echo off
for /F "skip=1 delims=" %%G in ('
wmic PRODUCT GET Name
') do (
for /F "delims=" %%F in ("%%G") do echo %%F
)
Конечно, вы можете разобрать ваш Юникод выходного файл InstallList.txt
с for /F
, но вы не можете сделать это напрямую, вам нужно использовать команду type
сделать преобразование в не-Unicode:
for /F "skip=1 delims=" %%G in ('
type "C:\temp\InstallList.txt"
') do rem the rest is the same as above
Вы также можете использовать команду more
для достижения этой цели, просто писать more
вместо type
.
Вы можете заметить, что каждая строка, возвращаемые командой echo
содержит конечные пробелы.Если они беспокоят вас, вы можете использовать следующий код:
@echo off
setlocal EnableDelayedExpansion
set "REPL= "
for /F "skip=1 delims=" %%G in ('
wmic PRODUCT GET Name
') do (
for /F "delims=" %%F in ("%%G") do (
set "LINE=%%F%REPL%"
set "TRNC=!LINE:*%REPL%=%REPL%!"
call echo %%LINE:!TRNC!=%%
)
)
endlocal
Что я делаю здесь является:
- указать последовательность пространств (4 в этом примере, при условии, что каждая строка содержит меньше пространства в его части интереса) в переменной
REPL
;
- , чтобы прочитать каждую строку, добавить последовательность пробелов и сохранить расширенную строку в
LINE
;
- для получения фактической последовательности конечных пробелов на строку (путем поиска последовательности в
REPL
) и для ее сохранения в TRNC
;
- заменить фактическую последовательность пробелов каждой строки ничем, то есть усечь ее, а затем фактически вывести оставшуюся часть строки;
Конечно, вы можете это сделать и при анализе файла InstallList.txt
, как описано выше.
Не используйте WMIC и партии и вместо этого используйте PowerShell. –