Windows批处理中字符串比较大小写敏感问题

3

我正在尝试在DOS批处理脚本中进行区分大小写的字符串比较。我无法弄清楚如何在IF语句中开启大小写区分功能。以下是我的操作,但它也匹配了小写的“-f”,我想避免这种情况:

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

3
默认情况下,DOS的IF语句是区分大小写的;只有使用/I开关时才应该不区分大小写。在你的IF语句之前,你是否已经输出了"!%ARGS%:-F=!""!%ARGS%!"的值,以查看它们包含了什么? - LittleBobbyTables - Au Revoir
这听起来有点奇怪,因为EQ和NEQ(以及==)默认情况下是区分大小写的,除非指定了“/i”标志。 - Gabriele Giuseppini
更具体地说,我遇到的错误是“字符(”不期望出现”,或类似的消息。通过使用“NOT ==”方法替换“NEQ”,该消息得以解决。 - djangofan
4个回答

7

使用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

5
您的 IF 语句已经正确地执行了区分大小写的搜索。问题在于您的扩展搜索和替换已经损坏,正如 Endoro 指出的那样,正确的形式为 ""!ARGS:-F=!"" 是不区分大小写的。在展开 ARGS 时,它首先寻找 "-F",忽略大小写,并将其替换为无内容。
不幸的是,这就是搜索和替换的工作方式。没有方法使它区分大小写。
您可以使用以下内容进行区分大小写的测试:
echo(!ARGS!|find "-F" >nul && echo Pro option -F was found.

我创建了一个单元测试来证明这个答案。谢谢。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
+1,对于损坏的搜索和替换语法的发现很好,但这并不能解决不区分大小写的问题。请参见我的答案 - dbenham

1
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接