在批处理脚本中,我需要根据一个变量是否与另一个变量的开头匹配来重定向脚本流。具体来说,我想做这样的事情:
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
,然后进行相应的处理。