Пакет преждевременно закрывается по команде for / f - PullRequest
5 голосов
/ 04 ноября 2008

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

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

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

Почему?


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

Ответы [ 5 ]

5 голосов
/ 04 ноября 2008

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

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

отлично работает на любом компьютере.

Кажется, for /f работает с именем файла, а не с любой командой dos, такой как 'type filename'.

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

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


Редактировать: 3 года спустя (!), barlop столкнулся с аналогичной ситуацией, подробно изложенной в вопросе "for /f немедленно закрывает приглашение cmd? ". Его вывод был:

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

Эта ветка на форуме ss64 , упомянутая Andriy M в ответе на вопрос Барлопа, содержит детали.

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\ComSpec=
%SystemRoot%\system32\cmd.exe
1 голос
/ 07 ноября 2008

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

Если в сценарии используются параметры оболочки расширений команд, НАСТОЯТЕЛЬНО рекомендуется выполнить следующий прием в начале сценариев.

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

SETLOCAL установит ОШИБКУ, если дан аргумент. Он будет равен нулю, если указан один из двух допустимых аргументов, а один - в противном случае.

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

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

Это работает, потому что "VERIFY errors" устанавливает ERRORLEVEL в 1, а затем SETLOCAL не сможет сбросить значение ERRORLEVEL, если расширения недоступны (например, если скрипт выполняется под command.com)

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

0 голосов
/ 04 ноября 2008

Подождите ... может быть, у вас есть апострофы вокруг имени файла? 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]

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

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

0 голосов
/ 04 ноября 2008

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

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

Расширения команд отключены на клиентском компьютере, где не удается установить «имя файла».

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

0 голосов
/ 04 ноября 2008

Неужели файл не имеет расширения и, следовательно, cmd рассматривает его как каталог, который не существует?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...