我正在尝试在DOS批处理脚本中进行区分大小写的字符串比较。我无法弄清楚如何在IF语句中开启大小写区分功能。以下是我的操作,但它也匹配了小写的“-f”,我想避免这种情况:
SET "ARGS=%*"
IF "%ARGS:-F=%" NEQ "%ARGS%" (
ECHO Pro option -F was found and not allowed.
GOTO :ERROR
)
我正在尝试在DOS批处理脚本中进行区分大小写的字符串比较。我无法弄清楚如何在IF语句中开启大小写区分功能。以下是我的操作,但它也匹配了小写的“-f”,我想避免这种情况:
SET "ARGS=%*"
IF "%ARGS:-F=%" NEQ "%ARGS%" (
ECHO Pro option -F was found and not allowed.
GOTO :ERROR
)
使用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.)
==
而不是 NEQ
吗?据我所知,NEQ
意为 "Not EQual to",而 ==
意为 "EQUal to"。 - PeterCo"!ARGS:-F=!"
" 是不区分大小写的。在展开 ARGS 时,它首先寻找 "-F",忽略大小写,并将其替换为无内容。echo(!ARGS!|find "-F" >nul && echo Pro option -F was found.
<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="
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。
%args:-F=-F%
进行了一个不区分大小写的搜索,将 -F
替换为大写的 -F
。然后 if
语句进行了区分大小写的比较,与未修改的 %args%
进行比较。 - Jesse Chisholm
IF
语句是区分大小写的;只有使用/I
开关时才应该不区分大小写。在你的IF
语句之前,你是否已经输出了"!%ARGS%:-F=!"
和"!%ARGS%!"
的值,以查看它们包含了什么? - LittleBobbyTables - Au Revoir