|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Некорректная работа оператора сравнения "neq" |
|
|
CMD/BAT - [решено] Некорректная работа оператора сравнения "neq"
|
Пользователь Сообщения: 65 |
Включил в батник следующие строки:
For /F "Tokens=2,*" %%i In ('2^>nul Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{*-*-*-*-*}_is1" /V InstallLocation') Do if /i "%%j" neq "%~dp0" Goto label Помогите разобраться с чем это может быть связано. |
|
Отправлено: 18:09, 22-05-2013 |
Пользователь Сообщения: 65
|
Профиль | Отправить PM | Цитировать Если включить в скрипт конструкции:
наблюдается ситуация аналогичная вышеописанной. На WinXP с оператором "neq" скрипт работает, только так: Может кто сталкивался с подобной ситуацией? |
Последний раз редактировалось Lucretius, 22-05-2013 в 18:48. Отправлено: 18:33, 22-05-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Lucretius, у Вас изначально ошибка — в алгоритме. В запросе «reg.exe /query» Вы получаете (или не получаете) несколько строк. Вам нужно отфильтровать среди них потребную:
@echo off setlocal enableextensions enabledelayedexpansion for /f "usebackq tokens=3 delims= " %%i in ( `reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1E8BAA74-62A9-421D-A61F-164C7C3943E9}_is1" /v "InstallLocation" ^| find.exe /i "InstallLocation"` ) do set sInstallLocation=%%~i if defined sInstallLocation echo [%sInstallLocation%] endlocal exit /b 0 |
Отправлено: 23:24, 22-05-2013 | #3 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Lucretius, Вы, наверное, имели в виду, что при якобы очевидном тождестве "%%j" и "%~dp0" в условии IF "%%j" neq "%~dp0" всё равно происходит переход по метке. Ну, ладно, дело тут не в этом.
Вся проблема заключена в результате выполнения команды REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*******" /V InstallLocation Не знаю, как в других версиях утилиты reg.exe, но у меня как в 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\ В указанном выше спучае при ключе "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\ Третий пример. Команда: 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 Таким образом, в таких условиях получить правильный результат можно, только убрав вторую (первую из непустых) строку результата команды REG QUERY из обработки командой FOR, например, так: Ключ "skip=2" -- это и есть пропуск двух первых строк при обработки командой FOR (в этом ключе в расчёт обязательно берутся и пустые строки). |
Последний раз редактировалось Georgio, 23-05-2013 в 07:48. Причина: изменение тегов Отправлено: 06:32, 23-05-2013 | #4 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Iska, Ваш скрипт работает правильно только в случаях, когда в значении параметра InstallLocation отсутствуют пробелы. Поэтому надо так:
И откуда-то в коде взялась табуляция... |
|
Отправлено: 06:53, 23-05-2013 | #5 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Вот, уж (в данном значении "уж" -- не пресмыкающееся), что работает некорректно, так это переведённая справка командной строки по операторам сравнения (Windows 7 Starter). Для тех, кто хочет улыбнуться (не "оффтоп") --
|
Отправлено: 09:11, 23-05-2013 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Georgio:
Цитата Georgio:
в отличие от более новых версий: где вместо табуляции используются пробелы в качестве разделителей. Я потому и писал: Цитата Iska:
Цитата Georgio:
|
||||
Отправлено: 15:54, 23-05-2013 | #7 |
Пользователь Сообщения: 65
|
Профиль | Отправить PM | Цитировать Спасибо всем откликнувшимся!
Georgio Вы правы, я допустил опечатку, действительно "при якобы очевидном тождестве "%%j" и "%~dp0" в условии IF "%%j" neq "%~dp0" всё равно происходит переход по метке." (исправил в шапке) Сразу скажу, что код на примере Вашего Iska: For /f "usebackq Tokens=2*" %%I In (`2^>nul Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V "InstallLocation" ^| find.exe /i "InstallLocation"`) Do if /I "%%J\" NEQ "%~dp0" Goto label For /F "skip=2 Tokens=2*" %%I In ('2^>nul Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V InstallLocation') Do if /I "%%J\" NEQ "%~dp0" Goto label По поводу знака табуляции - подтверждаю, работает на XP, но не работает на семёрке я поднимал уже эту тему здесь. Кстати, с пробелом в качестве разделителя: for /f "usebackq tokens=2* delims= " %%i in ( `reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /v "InstallLocation" ^| find.exe /i "InstallLocation"` ) do set sInstallLocation=%%~j for /f "usebackq tokens=2*" %%i in ( `reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /v "InstallLocation" ^| find.exe /i "InstallLocation"` ) do set sInstallLocation=%%~j Изначально меня сбило с толку то, что если вынести значения в переменную за пределы цикла, переменная обретает верное значение, в противоречие тому, что внутри цикла "не работает" оператор NEQ. Причём оператор EQU, как я уже говорил, работал. На примере приведённого мной (неверного) кода: @echo Off Cls Setlocal enableextensions For /F "Tokens=2*" %%I In ('2^>nul Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V InstallLocation') Do set LocationI=%%I if defined LocationI echo I: "%LocationI%" For /F "Tokens=2*" %%I In ('2^>nul Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V InstallLocation') Do set LocationJ=%%J\ if defined LocationJ echo J: "%LocationJ%" For /F "Tokens=2*" %%I In ('2^>nul Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V InstallLocation') Do if /I "%%J\" NEQ "%~dp0" Goto label Echo 0: "%~dp0" Echo Каталоги совпадают Pause Exit :label Echo 0: "%~dp0" Echo Каталоги НЕ совпадают Pause Exit REM Результат на WinXP: REM I: "REG_SZ" REM J: "C:\Program Files\CCleaner\" REM 0: "C:\Program Files\CCleaner\" REM Каталоги НЕ совпадают REM Для продолжения нажмите любую клавишу . . . REM Результат на Win7: REM I: "REG_SZ" REM J: "C:\Program Files\CCleaner\" REM 0: "C:\Program Files\CCleaner\" REM Каталоги совпадают REM Для продолжения нажмите любую клавишу . . . Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V InstallLocation REM WinXP: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner InstallLocation REG_SZ C:\Program Files\CCleaner REM Win7: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner InstallLocation REG_SZ C:\Program Files\CCleaner Georgio спасибо за детальное объяснение, буду разбираться... |
Последний раз редактировалось Lucretius, 23-05-2013 в 22:17. Отправлено: 21:39, 23-05-2013 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Lucretius:
Цитата Lucretius:
|
||
Отправлено: 22:35, 23-05-2013 | #9 |
Пользователь Сообщения: 65
|
Профиль | Отправить PM | Цитировать Iska, верно, перенаправил в файл, открыл в hex - табуляция...
|
Отправлено: 22:53, 23-05-2013 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Ошибка просмотра фото - "прекращена работа программы "COM SURROGATE" | illusionmgs | Хочу все знать | 4 | 18-03-2014 19:20 | |
Всплывает сообщение "Прекращена работа программы "Hosts file cleaner" | AlexPSPb | Лечение систем от вредоносных программ | 4 | 08-01-2012 14:33 | |
Интерфейс - [решено] Как удалить папку "Моя музыка","Мои Картинки", "Мое видео"? | verdix | Microsoft Windows 2000/XP | 3 | 03-10-2009 23:46 | |
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") | submaster | Microsoft Windows NT/2000/2003 | 5 | 13-09-2006 12:29 |
|