检查批处理中的一个变量是否与另一个变量的开头匹配

检查批处理中的一个变量是否与另一个变量的开头匹配

在批处理脚本中,我需要根据一个变量是否与另一个变量的开头匹配来重定向脚本流。具体来说,我想做这样的事情:

IF %CD% BEGINSWITH %USERPROFILE% (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

我很难在网上找到解决这个问题的方法,或者至少是任何对我来说有意义的方法。如果可行,请演示一下这个可行解决方案是如何以及为什么起作用的。

答案1

Iszi 的回答通常看起来会起作用,但在许多情况下它可能会给出错误的结果。

  • 如果大小写有差异,FINDSTR 搜索可能无法正确匹配。使用/I选项可解决此问题。

  • 如果配置文件名称包含空格,FINDSTR 会将搜索字符串视为两个或多个搜索字符串。最好使用该/C:"searchString"选项。

  • %USERPROFILE%如果包含正则表达式元字符(如),FINDSTR 将执行正则表达式搜索。可以通过使用选项或选项.强制进行文字搜索来解决此问题。/L/C:"searchString"

  • FINDSTR 中的反斜杠可能有点棘手,因为 FINDSTR 会将其用作转义字符。将所有反斜杠转义为 更安全\\

  • 如果当前目录名称包含特殊字符(如),ECHO 命令可能会失败。&CD命令将安全地打印当前目录,而不必担心特殊字符。

此外,由于 FINDSTR 被用作测试,并且没有兴趣查看匹配的行,因此输出应该重定向到 NUL。

最后,可以通过用条件&&||运算符替换 IF 语句来简化解决方案。

下面的代码应该总是有效的:

cd|findstr /bic:"%userprofile:\=\\%" >nul&&echo You can do stuff here!||echo You don't belong here!

更新 - 不同驱动器号大小写的示例

CD以下是 Windows 7 cmd.exe 会话,演示了(或)报告的驱动器号的大小写如何%CD%变化:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\>set userprofile
USERPROFILE=C:\Users\Dave

C:\>cd c:\users\Dave

c:\Users\Dave>cd
c:\Users\Dave

c:\Users\Dave>echo CD=%CD%
CD=c:\Users\Dave

c:\Users\Dave>cd..

c:\Users>cd C:\users\Dave

C:\Users\Dave>cd
C:\Users\Dave

C:\Users\Dave>echo CD=%CD%
CD=C:\Users\Dave

C:\Users\Dave>

答案2

我最终自己解决了这个问题。我不太清楚为什么我没有在其他地方注意到这个解决方案。

ECHO %CD%|FINDSTR /B "%USERPROFILE%"
IF %ERRORLEVEL% EQU 0 (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

通常,FINDSTR在给定的文本文件中搜索字符串。但是,它也可以接受来自管道的输入。在这里,我们使用ECHO将当前目录 ( %CD%) 放入管道,然后指示在管道数据的开头 ( )FINDSTR查找用户的配置文件文件夹("%USERPROFILE%"- 必须使用引号)/B

由于FINDSTR返回ERRORLEVEL,我们可以用后面的语句检查这一点IF,然后进行相应的处理。

相关内容