Lucretius, Вы, наверное, имели в виду, что при якобы очевидном тождестве
"%%j" и
"%~dp0" в условии
IF "%%j" neq "%~dp0" всё равно
происходит переход по метке. Ну, ладно, дело тут не в этом.
Вся проблема заключена в результате выполнения команды
Код:
Код: Выделить всё
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*******" /V InstallLocation
Не знаю, как в других версиях утилиты reg.exe[/i], но у меня как в Windows XP, так и в Windows 7 результат выполнения команды, например,
Код:
Код: Выделить всё
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{006B5C65-3938-4246-B182-994A7E415EDE}" /V InstallLocation
располагается в четыре строки:
Код:
Код: Выделить всё
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{006B5C65-3938-4246-B182-994A7E415EDE}
InstallLocation REG_SZ C:\Program Files\Intel\Bluetooth\
Первая и четвёртая строки -- пустые, командой FOR[/i] не обрабатываются. Отсюда следует, что команда
FOR сначала должна "пройтись" по второй строке, а потом по третьей.
В указанном выше спучае при ключе
"tokens=2*" второго и последующих "токенов" не найдётся, и переменные
%%I и
%%J не определятся. После этого будет обработана вторая строка, и переменная
%%J примет
ожидаемое нами значение
C:\Program Files\Intel\Bluetooth\, после чего
корректно выполнится условие
IF.
Теперь рассмотрим другой случай.
Команда:
Код:
Код: Выделить всё
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Download Master_is1" /V InstallLocation
Результат:
Код:
Код: Выделить всё
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Download Master_is1
InstallLocation REG_SZ C:\Program Files\Download Master\
В данном случае при том жк ключе "tokens=2*"[/i] команда
FOR во второй (первой из непустых) строке "обнаружит" второй "токен"
Master_is1, и явно декларированная переменная
%%I примет его значение. А вот дальше нас ждёт "сюрприз"! Неявно объявленная переменная
%%J, конечно не примет никакого значения, поскольку "токены" заканчиваются на втором, но (!) в условии
IF эта переменная (точнее, "пустое место" от неё) фигурировать будет:
IF /I "" NEQ "путь" GOTO label. Разумеется, что данное условие также будет выполнено
корректно, и с переходом на метку прервётся цикл, так и не обработав третью (вторую из непустых), нужную нам, строку, в которой находится
ожидаемое значение.
Третий пример.
Команда:
Код:
Код: Выделить всё
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft .NET Framework 4 Client Profile" /V InstallLocation
Результат:
Код:
Код: Выделить всё
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft .NET Framework 4 Client Profile
InstallLocation REG_SZ C:\windows\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client
Тут всё как в предыдущем примере, только переменная %%J[/i] уже определяется во второй (первой из непустых) строке и принимает значение
Framework 4 Client Profile. Истинное условие
"Framework 4 Client Profile" NEQ "путь" также срабатывает
корректно, но
ожидаемого результата мы не получаем, так как цикл снова обрывается после обработки второй (первой из непустых) строки.
Таким образом, в таких условиях
получить правильный результат можно, только убрав вторую (первую из непустых) строку результата команды
REG QUERY из обработки командой
FOR, например, так:
Код:
Код: Выделить всё
FOR /F "skip=2 tokens=2*" %%I IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Download Master_is1" /V InstallLocation') DO IF /I "%%J" NEQ "%~dp0" GOTO label
Ключ "skip=2"[/i] -- это и есть пропуск двух первых строк при обработки командой
FOR (в этом ключе в расчёт обязательно берутся и пустые строки).