在CMD脚本中改变事情。
我对原因的快速而简单的理解:
批处理按预期运行,即使在管道的另一侧,也没有必要在“main”上加倍百分号,因为没有发生扩展,它是一个普通的变量。
也就是说,您编写的操作顺序是正确的,但是每行都在单独进行,我认为您只是离问题太近了,没有注意到或者我没有理解问题?
我不确定这是否清楚地说明了,因此我计划逐步审查我认为正在发生的事情:
“set“vData =...;%%main%%\Programs\Go\Bin”“
存储在内存中的结果:“...;%main%\Programs\Go\Bin”
“ECHO”%vData%“产生的结果为:“...;%main%\Programs\Go\Bin”
添加主要部分
set "main=C:\Main"
存储在内存中的结果为: "C:\Main
"
ECHO
%main%
的结果为: "C:\Main
"
ECHO
'%%main%%' 的结果为: "%C:\Main%
"
现在定义了 Main,让我们再次 Echo vData:
存储在内存中的结果仍然是: "...;%main%\Programs\Go\Bin
"
ECHO
"%vData%"
的结果为: "...;%main%\Programs\Go\Bin"
CALL ECHO
ing "%vData%"
的结果为:
"...;C:\Main\Programs\Go\Bin"
因此,这一侧依赖于扩展,但 FindStr 侧不依赖于扩展,因为 %main% 已经被定义,所以它在第一次传递时就被扩展了。
当被 CMD 解释器解析时,我认为顺序将如下所示:
Given your original Find String:
echo/%vData%| findstr /I /C:"%%main%%\\Programs\\Go\\Bin"
Becomes:
echo/...;%main%\Programs\Go\Bin| findstr /I /C:"%C:\Main%\\Programs\\Go\\Bin"
Becomes:
echo/...;C:\Main\Programs\Go\Bin | (findstr /I /C:"%C:\Main%\\Programs\\Go\\Bin")
或者,当被CMD解释器解析时,我认为顺序将如下:
Given the modified Regex String:
echo/%vData%| findstr /I /C:"%main%\\Programs\\Go\\Bin"
Becomes:
echo/...;%main%\Programs\Go\Bin| findstr /I /C:"C:\main\\Programs\\Go\\Bin"
Becomes:
echo/...;C:\Main\Programs\Go\Bin | (findstr /I /C:"C:\Main\\Programs\\Go\\Bin")
如果您的担忧是实际上在一个变量中存储了%%Main%%
,比如说%_Regex%
变量:
那么一般来说,您需要将管道符号另一侧的语句用括号括起来或者按我的经验调用findStr。
例如:
@(
SETLOCAL
ECHO OFF
)
rem // Set variable `vData` to literally contain `...;%main%\Programs\Go\Bin`:
set "vData=...;%%main%%\Programs\Go\Bin"
rem // Set variable `_Regex` to literally contain `%main%\\Programs\\Go\\Bin`:
SET "_Regex=%%main%%\\Programs\\Go\\Bin"
rem // Set variable `_Regex` to literally contain `C:\Main`:
set "main=C:\Main"
ECHO(&ECHO(Variable Contents After Main Set:&ECHO(
echo(Normal: vData = "%vData%"
echo(Normal: _Regex = "%_Regex%"
echo(Normal: main = "%main%"
CALL echo(CALLed: vData = "%vData%"
CALL echo(CALLed: _Regex = "%_Regex%"
ECHO(&ECHO(Testing the Results of The FindString Methods:
ECHO(==============================================&ECHO(
ECHO( Original ^%%^%%main^%%^%% Method:
echo/%vData%| findstr /I /C:"%%main%%\\Programs\\Go\\Bin"
ECHO(==============================================&ECHO(
ECHO( Using the ^%%_Regex^%% Stored Variable:
echo/%vData%| findstr /I /C:"%_Regex%"
ECHO(==============================================&ECHO(
ECHO( Using just ^%%main^%%:
echo/%vData%| findstr /I /C:"%main%\\Programs\\Go\\Bin"
ECHO(==============================================&ECHO(
ECHO( Using the CALL ^%%_Regex^%% Stored Variable:
echo/%vData%| CALL findstr /I /C:"%_Regex%"
ECHO(==============================================&ECHO(
ECHO( Using the (^%%_Regex^%%) Stored Variable:
echo/%vData%| ( findstr /I /C:"%_Regex%" )
ECHO(==============================================&ECHO(
结果:
C:\Admin>C:\Admin\TestFindStr.cmd
Variable Contents After Main Set:
Normal: vData = "...;%main%\Programs\Go\Bin"
Normal: _Regex = "%main%\\Programs\\Go\\Bin"
Normal: main = "C:\Main"
CALLed: vData = "...;C:\Main\Programs\Go\Bin"
CALLed: _Regex = "C:\Main\\Programs\\Go\\Bin"
Testing the Results of The FindString Methods:
==============================================
Original %%main%% Method:
==============================================
Using the %_Regex% Stored Variable:
==============================================
Using just %main%:
...;C:\Main\Programs\Go\Bin
==============================================
Using the CALL %_Regex% Stored Variable:
...;C:\Main\Programs\Go\Bin
==============================================
Using the (%_Regex%) Stored Variable:
...;C:\Main\Programs\Go\Bin
==============================================
这正是我根据CMD的经验所期望的。
C:\Admin>echo/%vData%| findstr /I /C:"%%main%%\\Programs\\Go\\Bin"
...;%C:\Main%\Programs\Go\Bin
C:\Admin>echo/%vData%
...;%%main%%\Programs\Go\Bin
- Ben Personick%%
转义在[tag:cmd]-上下文中不起作用。我正在使用Windows 7... - aschipfl