Команда Windows FOR / F не работает?

4316
Mark Ransom

Я пытаюсь использовать команду FOR в командной строке Windows XP. У меня есть файл temp.txt с 3 строками:

temp1 temp2 temp3 

И я набираю следующую команду в командной строке:

for /F %p in (temp.txt) do echo Testing %p 

Ничего не возвращается Если я удалю параметр / F, вывод будет Testing temp.txt.

Насколько я могу определить, я использую команду именно так, как это задокументировано Microsoft . Я проверил свой реестр, чтобы убедиться, что командные расширения включены, и даже запустил новую оболочку, cmd /e:onчтобы быть вдвойне уверенным.

Что я делаю неправильно?

Да, я делал что-то не так.

Файл temp.txt не был создан с нуля, я просто отредактировал его, чтобы добавить в мой тестовый контент. К сожалению, когда я создал файл в первый раз, я сохранил его с маркером UTF-8 на передней панели. Воссоздание файла в виде простого текста решило проблему.

0
Ненавижу задавать глупые вопросы, но вы уверены, что находитесь в том же каталоге, что и `temp.txt` в командной строке? Не могу придумать ни одной причины, по которой это не сработает. Agent_9191 14 лет назад 0
Да, я в каталоге. Я также проверил с полным путем к файлу, но я пытаюсь устранить как можно больше ненужных деталей. Mark Ransom 14 лет назад 0
используйте echo ...> или скопируйте con, чтобы быстро создать файл для тестирования, тогда вы бы увидели, что он работает, затем вы можете использовать xxd или od и изучить различия. barlop 12 лет назад 0

4 ответа на вопрос

4
atroon

Я предполагаю, что это желаемый результат:

H:\>for /F %p in (temp.txt) do echo Testing %p  H:\>echo Testing temp1 Testing temp1  H:\>echo Testing temp2 Testing temp2  H:\>echo Testing temp3 Testing temp3 

Если да, то вы тестировали другие командные файлы или перенаправили ввод / вывод? Если вы делаете это как часть более крупного проекта, возможно, вы изменили разделители или параметр skip на команду FOR? Возможно ли, что в вашем файле temp.txt находятся непечатаемые символы? Я получил это для работы на нескольких разных компьютерах, в том числе 2k3 Server Std. коробка ... Я не могу не думать, что есть или проблемы с вашим входным файлом, или настройки по умолчанию без вашего ведома.

Я выяснил проблему еще до того, как увидел этот ответ, но, поскольку он включает в себя реальное решение (непечатные символы спереди), я выбираю его в качестве принятого ответа. Mark Ransom 14 лет назад 0
2
Ken

Вместо того, чтобы проверять с помощью echo, который просто принимает имена в наборе «как есть» (даже если файл не существует), попробуйте что-то вроде type:

for %p in (temp.txt) do type %p 

Это покажет вам, что «видит» оболочка. (Обратите внимание, что / F с несуществующим файлом будет жаловаться на то, что он не найден, но, возможно, у вас есть более одного файла temp.txt?)

Да, эта команда показывает мне содержимое файла temp.txt. Спасибо за предложение, но мне неясно, что я должен был выучить, попробовав его. Mark Ransom 14 лет назад 1
Просто установление базовой линии, что файл есть, читаемый и правильный. Затем я собирался спросить, как вы создали файл - я использовал старый добрый `copy con` - но я вижу, вы поняли это. Спецификация поражает снова! Мне придется поднять его на ступеньку выше в списке экстрасенсорных отладок. Ken 14 лет назад 0
2
Paul Tomasi

The proper approach is this:

for %%a in (temp1 temp2 temp3) do ( echo Testing %%a for /f %%b in (%%a) do echo %%b ) 

Or you could do this:

for /l %%n in (1,1,3) do ( for %%a in (temp%%n) do ( echo Testing %%a for /f %%b in (%%a) do echo %%b ) ) 

Another variantion is:

for %%a in (*.txt) do ( echo Testing %%a for /f %%b in (%%a) do echo %%b ) 

Etc...

If there are spaces in the filenames then you'll have to use 'usebackq' with 'FOR/F' and wrap the filenames in double-quotes like this:

... for /f "usebackq" %%b in ("%%a") do echo %%b ... 
0
Pablo

I've spend hours on this. You need to replace temp.txt with 'type temp.txt':

for /F %p in ('type temp.txt') do echo Testing %p 

Похожие вопросы