Почему пакетный файл FOR не работает при повторении вывода команды?

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

FOR /F "tokens=2* delims=  " %%A IN ('REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName') DO SET MyVariable=%%B

(после delims= есть символ табуляции)

Это прекрасно работает на тысячах компьютеров клиентов. Но на компьютере одного клиента (под управлением Windows Server 2003, с включенными расширениями команд)
происходит сбой с 'REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл». Запуск только команды "reg query" работает нормально. Reg.exe присутствует в C:\Windows\System32.

Я смог обойти проблему, изменив код на

REG QUERY "HKLM\SOFTWARE\Path\To\Key" /v ValueName > temp.txt
FOR /F "tokens=2* delims=  " %%A IN (temp.txt) DO SET MyVariable=%%B

Это заставило клиента начать работу, но я хотел бы понять, почему возникла проблема, чтобы избежать ее в будущем.

Немного от основной темы - также был бы полезен более прямой способ получить значение реестра (строка или DWORD) в переменную среды.


person Tim Danner    schedule 08.10.2008    source источник


Ответы (4)


я бы проверил:

  1. Роль клиента на машине - администратор?
  2. Где находится reg.exe на коробке - есть ли в пути более одной копии копии reg.exe?
  3. Есть ли какое-либо отличие локали на машине клиента от машин, на которых это обычно работает?

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

person Mark Allen    schedule 08.10.2008

Вау, это странно.

Если одни и те же команды работают при разделении на две строки, то я предполагаю, что это как-то связано с тем, как команда запускается в подоболочке в команде FOR.

Если вам действительно не терпелось выяснить, почему он умирает в этом конкретном случае, вы можете запустить такие команды, как «SET > envvars.txt», в качестве команды FOR и сравнить это с верхней оболочкой.

Или, может быть, начать с простого и попробовать запустить команду REG с помощью CMD/C, чтобы посмотреть, поможет ли это?

Одна быстрая догадка: каковы значения COMSPEC и SHELL?

person Eric Tuttleman    schedule 09.10.2008

У меня была аналогичная ситуация с этой. В моем случае это было плохое значение в COMSPEC. Я исправил это, и скрипт начал работать как положено.

person Paul Keusemann    schedule 16.12.2011

Для переключателя /F необходимо включить расширения команд. Обычно они включены по умолчанию, но я бы проверил это. В системах XP вы можете включить их, выполнив что-то вроде

cmd /e:on

или проверка реестра под

HKCU\Software\Microsoft\Command Processor\EnableExtensions

Не знаю насчёт Windows Server.

Выполнение help for и help cmd также может дать некоторые подсказки.

person agnul    schedule 08.10.2008
comment
Я проверил, что EnableExtensions установлен. Я отредактирую вопрос, чтобы отметить это. - person Tim Danner; 08.10.2008