Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Некорректная работа оператора сравнения "neq"

Ответить
Настройки темы
CMD/BAT - [решено] Некорректная работа оператора сравнения "neq"

Пользователь


Сообщения: 65
Благодарности: 7

Профиль | Отправить PM | Цитировать


Изменения
Автор: Lucretius
Дата: 23-05-2013
Описание: Опечатка
Включил в батник следующие строки:
Код: Выделить весь код
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
скрипт сверяет путь взятый из реестра с директорией расположения батника. Оказалось, что оператор сравнения "neq" не работает(при тождестве "%%j" и "%~dp0" происходит переход по метке) в данном скрипте на WinXP, причём c оператором "equ" скрипт работает правильно. На Win7 ОБА варианта работают правильно.

Помогите разобраться с чем это может быть связано.

Отправлено: 18:09, 22-05-2013

 

Пользователь


Сообщения: 65
Благодарности: 7

Профиль | Отправить PM | Цитировать


Объясните, а зачем указывать в качестве разделителей - используемые по умолчанию?
Выдержка из справки(Win7):
" delims=xxx - набор разделителей вместо используемых по умолчанию пробела и знака табуляции." Как я уже отмечал выше, если в подобных случаях(обработка результатов команд reg.exe) не указывать разделитель, скрипты работают одинаково правильно на обоих осях. Вот наткнулся на скрипт где в качестве разделителей указаны и табуляция и пробел, можно сказать универсальный вариант, но опять же - без указания разделителей работает ничуть не хуже. При каких условиях это может иметь значение?

Последний раз редактировалось Lucretius, 05-06-2013 в 22:32.


Отправлено: 19:27, 04-06-2013 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Lucretius:
Объясните, а зачем указывать в качестве разделителей - используемые по умолчанию? »
Если в очередной версии ОС умолчания изменятся? Умолчания — это, конечно, хорошо… Но, фактически — мина замедленного действия.

Отправлено: 19:45, 04-06-2013 | #12


Пользователь


Сообщения: 65
Благодарности: 7

Профиль | Отправить PM | Цитировать


Ещё такой вопрос, приведённые выше скрипты можно реализовать двумя способами:
1.
Код: Выделить весь код
For /f "usebackq Tokens=2* Delims=	 " %%I In (`2^>nul REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V "InstallLocation" ^| find.exe /i "REG_SZ"`) Do Set loc=%%~J
2.
Код: Выделить весь код
For /f "Tokens=2* Delims=	 " %%I In ('2^>nul REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V "InstallLocation" ^| find.exe /i "REG_SZ"') Do Set loc=%%~J
т.е. с использованием новой семантики "usebackq" и без неё. Какой из данных примеров является наиболее грамотным, с точки зрения программной логики и почему?

Отправлено: 22:32, 05-06-2013 | #13


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Lucretius, в данном случае «оба лучше».

Пример, когда «usebackq» «лучше»:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
	`wmic.exe LogicalDisk where "DriveType=3 and FileSystem='NTFS'" get Name /value ^| find.exe /i "Name"`
) do echo %%i

endlocal
exit /b 0

Отправлено: 02:59, 06-06-2013 | #14


Пользователь


Сообщения: 65
Благодарности: 7

Профиль | Отправить PM | Цитировать


Iska, спасибо Вам за внимание к теме и оперативность в ответах. По поводу "usebackq", - назначение новой семантики мне понятно, меня смущало применение её там, где в ней нет необходимости.
Последний вопрос:
Внутри цикла -
Код: Выделить весь код
For /f "Tokens=2* Delims=	 " %%I In ('2^>nul REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V "InstallLocation" ^| find.exe /i "REG_SZ"') 
Do if /I "%%J" NEQ "%~dp0" GoTo label
если переменная "%%J" не определена(отсутствие ветки) - НЕ происходит переход по метке, продолжается выполнение кода,
вынес значение в переменную за пределы цикла:
Код: Выделить весь код
For /f "Tokens=2* Delims=	 " %%I In ('2^>nul REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" /V "InstallLocation" ^| find.exe /i "REG_SZ"') Do Set install=%%~J

If defined install (
 if /i not "%install%"=="%~dp0" GoTo label
) Else GoTo label
так вот, можно ли упростить этот код(точнее вторую его часть), при соблюдении всех условий?

Отправлено: 22:53, 10-06-2013 | #15


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Да не особенно. Ну, разве что:
Код: Выделить весь код
if not defined install goto :MyLabel
if /i "%install%" neq "%~dp0" goto :MyLabel
P.S. Лучше не использовать метки, совпадающие с именами команд.

Отправлено: 23:55, 10-06-2013 | #16



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Некорректная работа оператора сравнения "neq"

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Ошибка просмотра фото - "прекращена работа программы "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




 
Переход