标题: [文本处理] 这段BAT代码的工作原理是什么 [打印本页]
作者: sincos2007 时间: 2019-5-12 10:07 标题: 这段BAT代码的工作原理是什么
代码:
- :test1
- setlocal EnableDelayedExpansion
-
- set "filename=temp1.txt"
- set "str1=" & <"%filename%" set /p "str1="
-
- echo output 1
-
- set str1
- echo !str1!
- echo %str1%
-
- echo output 2
-
- set "str2=%str1%"
- set str2
- echo !str2!
- echo %str2%
-
- endlocal
- goto :eof
复制代码
temp1.txt内容:
- abc %%var1%% ^!^!var2^!^! mmm !var3!
复制代码
代码输出:
- output 1
- str1= abc %%var1%% ^!^!var2^!^! mmm !var3!
- abc %%var1%% ^!^!var2^!^! mmm !var3!
- abc %%var1%% var3
- output 2
- str2= abc %%var1%% !!var2!! mmm
- abc %%var1%% !!var2!! mmm
- abc %%var1%% mmm
复制代码
谁能完整讲解一下这段代码是如何工作的,为什么有这样的输出?
谢谢!
作者: /zhqsystem/zhq 时间: 2019-5-13 01:08
原理和call传递类似进行实体数据传递,
这种代码最不好的地方就是临时文件过多
优点是实时生效,适合N个批处理同时做不同的处理传递数据
下列代码属于调用类获取示例:
@echo off
call:0 abc %%var1%% !!var2!! mmm !var3!
pause
goto:eof
:0
call:1 %*
rem:下列这种不严谨超过9个参数会出错建议获取整体分列变量重置调用
call:1 %9 %8 %7 %6 %5 %4 %3 %2 %1
goto:eof
:1
echo,%1 %2 %3 %4 %5 %6 %7 %8 %9
shift
if /i "%1"=="" goto:eof
goto:1
作者: sincos2007 时间: 2019-5-15 10:10
代码输出第四行为什么会有这样的输出
作者: hongrk 时间: 2019-5-29 22:39
回复 3# sincos2007
我是这样理解的:
此行代码为:echo %str1%
执行前,先进行一次预处理,变为:echo abc %%var1%% !!var2!! mmm !var3!
执行时不会再扩充%,故前面是一样的。第一个感叹号配对无效没了,第二、三两个感叹号之间的扩充因为var2未定义一起消失了,第四、五两个感叹号同理带着中间一串一起消失,最后一个感叹号也没得配对消失了,只剩下没被扩充的var3
因此最终回显结果是:abc %%var1%% var3
而且中间的空格是来自var1与var2之间的,和var3前面的那一段空格没有任何关系。你可以把var3前面的空格拉长再比较一下结果,就更好理解了。
关键在于对!扩充的理解。找准第一对能扩充的!,而不是第一对好像配对了的!。
如以下代码:setlocal enabledelayedexpansion&set a=123&echo !!a!&pause
最终显示结果会是123。事实上,a前后的感叹号再多都不会有影响。
而如果执行代码:setlocal enabledelayedexpansion&set a=123&echo ! !a!&pause
最终显示结果会是a。因为第一对!!中间有东西,于是扩充掉了,a就不能扩充了。
作者: hongrk 时间: 2019-5-29 22:46
第二部分好像差不多,不过一起分析一下吧。
第一句set,预处理后:set "str2=abc %%var1%% ^!^!var2^!^! mmm !var3!"
执行时把str2设为:abc %%var1%% !!var2!! mmm
前几个!有^转义,因此保留,最后一对直接扩充了。
第二句,就是把str2真正的结果直接给出来,和设的东西是一样的。
第三句,用!!包起来,只在执行的时候把!!扩充一下,因此里面的东西没有机会再扩充(除非set/a里面不用任何东西包起来的变量还会再扩一下),故结果和第二句没差。
第四句,执行前预处理,执行时遇到的命令是:echo abc %%var1%% !!var2!! mmm
于是!!继续扩充,具体原理与上一楼是一样的。%只在预处理的时候扩充的。
希望能帮到你。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |