Почему пакетный файл FOR терпит неудачу при переборе выходных данных команды? - PullRequest
6 голосов
/ 08 октября 2008

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

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) в переменной среды.

Ответы [ 4 ]

1 голос
/ 16 декабря 2011

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

1 голос
/ 08 октября 2008

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

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

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

1 голос
/ 09 октября 2008

Ничего себе, это странно.

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

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

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

Здесь можно быстро догадаться, каковы значения COMSPEC и SHELL?

0 голосов
/ 08 октября 2008

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

cmd /e:on

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

HKCU\Software\Microsoft\Command Processor\EnableExtensions

Не знаю о Windows Server.

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

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