2008-11-04 5 views
5

У меня есть пакетный файл (в Windows XP, с помощью активированного расширения команды)/F со следующей строкой:Batch закрывается преждевременно на для команды

for /f %%s in ('type version.txt') do set VERSION=%%s 

На некотором компьютере, он прекрасно работает (как показано на рисунке по this SO question), но на других это убивает cmd (только консольное окно закрывается)

Почему?


Примечание: компьютеры, кажется, имеют одинаковую конфигурацию: xpsp2, пользователь имеет право административное, ни «командного процессора», определенный в HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor ...

+0

Благодарим за редактирование, Оли: Я хотел пометить этот «скрипт» вопроса, но автозаполнение на теге SO обмануло меня;) – VonC 2008-11-04 09:42:43

ответ

4

я получил первый эмпирический ответ:.

for /f %%s in (version.txt) do ... 

работает просто отлично, на каждом компьютере

кажется for /f работает с именем файла, а не с какой-либо д Команда os напоминает «тип имя_файла».

Однако, это не верно для всего компьютера моего клиента (на некоторых, «тип файла» отлично работает)

Если вы хотите 15 (легко?) Баллов ;-), Вы можете оставить ответ вопрос:
Почему «for/f» иногда не работает ни с чем другим, кроме имени файла. И почему он просто закрывает сессию DOS?


Edit: (!) Через 3 года, barlop столкнулись с подобной ситуацией, подробно описанную в вопросе "for /f closes cmd prompt immediately?". Его заключение:

COMSPEC было получить перечисленные при выполнении SET + ENTER.
Итак, я открыл окно переменных окружения и увидел, что COMSPEC не был указан под пользовательскими или системными переменными. Я добавил его в System Variables, запустил командную строку и, похоже, работает нормально.

Этот thread on ss64 forum, упомянутый Andriy M в своем ответе на вопрос о барлопе, содержит подробности.

Обстрел из в «for» петли для завершения «dir» (или любой другой команды, вы попросили заполнить) требует ComSpec быть установлен для того, чтобы перезагрузить cmd окно.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\ComSpec= 
%SystemRoot%\system32\cmd.exe 
+0

Возможно, 15 очков не разрезают горчицу? :-) Честно говоря, я не смог воспроизвести описанное вами поведение. Можете ли вы опубликовать несколько подробностей? – Tomalak 2008-11-04 13:14:31

+0

Спасибо, Томалак, за то, что нашли время проверить этот выпуск. Дело в том, что у меня мало деталей рядом с тем, о котором я упоминал: на ПК одного клиента на сеансе DOS я печатаю «for/f% s in (« type afilename.txt ») do echo% s» и. .. «poof» больше нет окон DOS ... – VonC 2008-11-04 14:16:13

+0

Я буду преследовать это, но я хотел проверить с сообществом SO, если эта проблема уже была замечена раньше. Очевидно нет. Я опубликую любое заключение, которое я могу найти. – VonC 2008-11-04 14:17:34

0

Является ли это, что файл не имеет расширения и, таким образом CMD рассматривает его как каталог, который не существует?

0

Если командные расширения отключены, параметр (set) для команды for должен быть файлом.

Если активированы расширения команд, параметр (set) для команды for может быть файлом, строкой или командой.

Командные расширения отключены на компьютере клиента, где сбой «type filename».

Для получения информации о включении или отключении расширений команд введите «cmd /?»

0

Подождите ... может быть, у вас есть апострофы вокруг имени файла? MS говорит, что имена файлов получают двойные кавычки, а литералы - апострофы.

for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions] 

for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions] 

for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions] 

Если вы, конечно, не делаете этого.

Вы можете использовать для/F логики синтаксического анализа на немедленной строке, путем оборачивать filenameset между скобками в одинарных кавычках (то есть «filenameset»). Filenameset обрабатывается как одна строка ввода из файла, а затем анализируется.

1

Что касается расширений команд, есть возможность CMD.EXE вызывается с/E: OFF, так что команда расширения отключены (даже если включен в реестр).

Если в сценарии используются опции оболочки расширения командной строки, ВЫСОКО предлагается, чтобы вы выполняли следующий трюк в начале ваших сценариев.

- Информация вставленный из http://www.ss64.com/nt/setlocal.html

SETLOCAL будет установить ERRORLEVEL, если задан аргумент. Он будет равен нулю, если задан один из двух действительных аргументов, а другой - другой.

Вы можете использовать это в пакетном файле, чтобы определить, если расширения команды доступны, используя следующую методику:

VERIFY errors 2>nul 
SETLOCAL ENABLEEXTENSIONS 
IF ERRORLEVEL 1 echo Unable to enable extensions 

Это работает, потому что «ПРОВЕРКИ ошибки» устанавливает ERRORLEVEL 1 и затем SETLOCAL не сможет сбросить значение ERRORLEVEL, если расширения недоступны (например, если скрипт работает под командованием.com)

Если командные расширения отключены, то SETLOCAL ENABLEEXTENSIONS не восстановит их.

Смежные вопросы