2013-06-10 3 views
1

Я пытаюсь сравнить строку, которая должна быть чувствительна к регистру в сценарии пакетной работы DOS. Я не могу понять, как включить чувствительность к регистру в выражении IF. Вот то, что я делаю, и это также соответствие на нижнем регистре «-f», который я пытаюсь избежать:Сравнение Windows строк с чувствительностью к регистру

SET "ARGS=%*" 
IF "%ARGS:-F=%" NEQ "%ARGS%" (
    ECHO Pro option -F was found and not allowed. 
    GOTO :ERROR 
) 
+3

ДОС 'IF' заявление * * является чувствительны к регистру по умолчанию; он должен быть нечувствителен к регистру с помощью переключателя '/ I'. Вы повторяли значения ''!% ARGS%: - F =! "' И '"!% ARGS%! "' Перед выражением 'IF', чтобы посмотреть, что они держат? – LittleBobbyTables

+0

Это звучит странно, поскольку EQ и NEQ (и ==) чувствительны к регистру по умолчанию, если не указан флаг «/ i». –

+0

В частности, ошибка, которую я получал, была «символ (был неожиданным) или сообщение, подобное этому. Это сообщение было разрешено путем замены« NEQ »на метод« NOT == ». – djangofan

ответ

4

Ваш IF заявление является правильно выполнять чувствительны к регистру поиска. Проблема заключается в том, что ваш поиск расширений и замена повреждены, как указал Энроро, и правильная форма "!ARGS:-F=!" - это случай нечувствительный. При расширении ARGS он сначала ищет -F, не считая случая, и заменяет его ничем.

К сожалению, так работает поиск и замена. Не существует способа сделать его чувствительным к регистру.

Вы можете использовать следующие сделать чувствительный тест случай:

echo(!ARGS!|find "-F" >nul && echo Pro option -F was found. 
+0

Это новое для меня, спасибо! – Endoro

+0

Я создал единичный тест, подтверждающий этот ответ. Благодарю. https://gist.github.com/djangofan/5767940 – djangofan

2

Пожалуйста, посмотрите на мои примеры и выход (вызов <script> -F):

@echo off &setlocal 
SET "ARGS=%*" 
echo "%ARGS%" 
echo "%ARGS:-F=%" 

"-F" 
"" 

ваша версия:

@echo off &setlocal enabledelayedexpansion 
SET "ARGS=%*" 
echo "%ARGS%" 
echo "!%ARGS%:-F=!" 

"-F" 
"-F=" 
+2

Мне не нужно читать скриптовая книга. Эта ошибка - это что-то, что можно было бы сделать. Спасибо, что поняли эту проблему для меня. – djangofan

+0

ОК, если вы не хотите стать специалистом по написанию сценариев :-) Я сделал редактирование ..... – Endoro

+0

+1, хороший улов с поврежденным поиском и заменой синтаксиса, но это не помогает решить проблему без учета регистра. См. [Мой ответ] (http://stackoverflow.com/a/17033165/1012053) – dbenham

0
IF "%args:-F=-F%"=="%args%" (ECHO no sign of -f) ELSE (echo -f detected) 

должны работать для вас - это не для меня!


Интересный результат.

Вот мой тест рутина:

@ECHO OFF 
SETLOCAL 
CALL :test something -f 
CALL :test something -F 
CALL :test -f 
CALL :test -F 
GOTO :eof 
:test 
ECHO testing %* 
SET "args=%*" 
IF "%args:-F=-F%"=="%args%" (ECHO no sign of -f) ELSE (echo -f detected) 
GOTO :EOF 

И результаты:

testing something -f 
-f detected 
testing something -F 
no sign of -f 
testing -f 
-f detected 
testing -F 
no sign of -f 

Так - работает для меня. Возможно, это зависит от версии. Я использую W7/64.

4

Используйте IF /I для простоты ... переключатель /I, если указано, означает, что значение, отличное от регистра, не учитывает регистр.

SET "ARGS=%*" 
IF /I "%ARGS:-F=%" NEQ "%ARGS%" (
    ECHO Pro option -F was found and not allowed. 
    GOTO :ERROR 
) 

Кроме того, обычной практикой является использование == вместо NEQ, потому что позже используется для числовых сравнений.

т.е.

IF %ERRORLEVEL% EQU 0 (ECHO.Ok.)