2013-09-11 2 views
0

У меня есть пакетный файл, который написать список всех доступных дисков в текстовом файле и другой пакетный файл для чтения содержимого в этом текстовом файле (пропускает первая линия)Batch код для чтения текстового файла

Код для список привод:

wmic logicaldisk get name> "abc.txt 

код, который используется для чтения текстового файла:

FOR /F "skip=1" %%m IN (abc.txt) DO (echo %%m) 

читатель партия только будет работать, только если файл был создан вручную, Зачем??

Нужны некоторые решения, пожалуйста, помогите!

+0

Нет необходимости в режиме добавления '>>' redirection. Обычный '>' отлично работает в этом случае. – dbenham

ответ

2

Как указано в miltonb, выход WMIC находится в формате Unicode UTF-16 с спецификацией.

FOR/F не любит юникод. Вы можете использовать TYPE для преобразования Unicode в ANSI. Обратите внимание, что предложение IN() заключено в одинарные кавычки, поэтому FOR/F считывает вывод команды вместо файла.

FOR /F "skip=1" %%m IN ('type abc.txt') DO (echo %%m) 

EDIT

можно поставить команду WMIC непосредственно в FOR/F IN() пункта, и полностью исключить необходимость временного файла.

Несмотря на то, что FOR/F не может читать файл в формате unicode, он может напрямую обрабатывать выходные данные Unicode WMIC. К сожалению, он вводит артефакт дополнительного возврата каретки, добавленного к каждой строке (я понятия не имею, почему). Это может вызвать проблемы с анализом. Существует несколько способов решения проблемы. Моим любимым является использование одного дополнительного цикла FOR/F для прерывания возврата завершающей каретки из каждой строки.

Обратите внимание, что второй FOR/F использует двойные кавычки в предложении IN(), чтобы заставить его прочитать строку.

for /f "skip=1" %%A in ('wmic logicaldisk get name') do for /f %%B in ("%%A") do echo %%B 
+0

Это классный трюк с «dbenham», я не знал этого. – miltonb

+0

Как мы можем заставить код всегда указывать на последнюю строку (пропустить все остальные строки) – user2765512

+0

@ user2765512 - Простейшее решение состоит в том, чтобы цикл FOR/F устанавливал переменную равной значению каждой строки. Последняя линия побеждает :) – dbenham

0

Проблема заключается в том, что wmic выводит формат UTF-16, который обозначается FF FE в начале файла (Hex Dump Tool). Команда FOR не может понять формат Unicode и ничего не находит.

Вам понадобится промежуточный шаг для преобразования abc.txt в обычный текст. Это объясняет, почему при создании вручную в текстовом формате файл работает так, как ожидалось. Добавьте в свой второй пакетный файл следующее, которое будет выполнять преобразование.

TYPE abc.txt > abcplain.txt 
    FOR /F "skip=1" %%m IN (abcplain.txt) DO (echo %%m) 
Смежные вопросы