返回列表 发帖

[原创] 批处理中转义符号和引号之间的恶魔法则

今天算了忙上了18个小时了......在研究批进度条时发现引号和转义之间的暧昧关系..终于在历时4个小时的整理中把这个教程弄完......这里要谢谢batman提供的帮助:
第一次发,不知道怎么格式才好.就发我自己学习时最常用的代码加语句测试方式.
教程如下:
@echo off
title 引号与转义符号的恶魔规则()
color 5a
echo.
echo.
echo by.............【极度沉沦】................(辅导batman)
echo.
echo.
echo 在搜索百度.goole及相关批论坛均无发现....
echo.
echo.今晚在咨询师傅时:师傅说真是活到老学到老.他们以前都没有注意这方面
echo.
echo 在""中的特殊字符不需要加转义符号否则失去意义
echo.
echo 加了的效果
set "a=echo 12345&echo ^>nul"
%a%
pause
echo 没有加的效果
set "a=echo 12345&echo >nul"
%a%
pause
echo.如果加的^个数是偶数2k就相当与转换成k个普通的符号^没有转义的意思,如果加的^个数是奇数2k+1就相当与前2k转换成k个普通的^而最后个为转义字符
echo.
echo.
echo 以下是偶数的效果
set "a=echo 12345&echo ^^^^123"
%a%
pause
echo 以下是奇数的效果
set "a=echo 12345&echo ^^^123"
%a%
pause
echo.
echo.
echo 接下来是''与""中^的区别
echo.
echo.
echo 如果特殊符号在''单引号中则全部的特殊符号都得加上转义符号
echo.
echo.
echo ''单引号中加入转义符号的效果
for /f "delims=" %%a in ('ipconfig /all^|findstr /i "ip"') do echo %%a
pause>nul
echo.
rem echo ''单引号中不加入转义符号的效果
rem for /f "delims=" %%a in ('ipconfig /all|findstr /i "ip"') do echo %%a
rem pause>nul(执行出错)
echo 普通时候不需要考虑转义情况(指没有""双引号,单引号'')
ipconfig /all|findstr /i "ip"
pause>nul
echo.
echo 单引号的应用举例1
for /f %%a in ('^(echo 1234^&echo 435648^&echo 43123^)^|findstr  "123"^|findstr "43"') do echo %%a
pause>nul
echo.
echo 单引号的应用举例2
echo.
for /f %%a in ('^(echo 1234^&echo 5648^&echo 4312^)^|findstr  "12"^|findstr "34"') do echo %%a
pause>nul
echo.看看以下进度条...区别就在其中了
echo 引号类循环..................进度
set "a=set /p=■<nul&ping/n 1 127.1 >nul"
echo.
echo  程序正在初始化. . .
echo.
for /l %%i in (0 1 39) do %a%
pause>nul
@echo off
title 初始化进行中
color 1f
echo 在双引号内的特殊符号不需要加转义符号(相当于默认就加上了)
set "a=set /p=■<nul&ping/n 1 127.1 >nul&"
echo.
echo  程序正在初始化. . .
echo.
%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%
pause>nul
@echo off
title 初始化进行中
color 1f
echo 为了echo显示内容在引用set的变量是我们必须使用转义符号把符号转换成普通含义
set a=set /p=■^<nul^&ping/n 1 127.1 ^>nul^&
echo.
echo  程序正在初始化. . .
echo.
%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%
pause>nul
@echo off
title 初始化进行中
color 1f
echo 先输出空格...再逐一替换...........
set a=set /p=■^<nul^&ping/n 1 127.1 ^>nul^&
echo.
echo  程序正在初始化. . .
echo.
set/p=  <nul&%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%%a%
echo   100%%
pause>nulCOPY

我写这个教程是为了让更多初学者少走弯路....欢迎高手们指正问题.............................
菜鸟发贴,欢迎大家发现问题,好及时改正.

[ 本帖最后由 woxingwoshu007 于 2009-4-22 21:35 编辑 ]
3

评分人数

第一次发,不知道怎么格式才好


红色代码看着太刺眼,能否改成黑色?

高手们绕道


万一哪位“高手”想给你指出一些问题怎么办?绕到哪里去?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

楼主有意思哦。。。
“echo 在搜索百度.goole及相关批论坛均无发现....”
在别的论坛发帖求助得到答案,别的论坛也有相关文章,居然说“均无发现”?

而且那个求助帖状态还是[未解决](不只一个帖子是这样)。

我并不是为那个论坛叫屈(哪个论坛对我来说都一样),只是觉得楼主这种行为有点不妥。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 3楼 的帖子

晕..其中有一个帖子求助的就是我自己(我为了这个问题一开始多方求助..汗颜).....谢谢提议以后会改正

[ 本帖最后由 woxingwoshu007 于 2009-4-22 21:36 编辑 ]

TOP

回复 2楼 的帖子

太喜欢你了..巡查..每次我发贴都会收到你的指教..我虚心接受...我开心我快乐在这里成长学习ing..................顶batcher

TOP

我来帮楼主说两句(并不是因为楼主尊称我为师傅,汉。。。):
    第一、我认为楼主这种肯于钻研的精神是极为可嘉的,现在很多新手学东西就是缺少这股子钻劲;
    第二、楼主整理出来的这篇贴子还是具有实际意义的,里面的内容我觉得才是我们应该讨论的;
    第三、至于楼主所触犯的论坛规则,还请楼主及时改正;
    第四、对于新人我们应给予更多的是鼓励和引导,而不是义正严辞的批评。
***共同提高***

TOP

回复 6楼 的帖子

嗯..我只是希望自己能够学好知识..当然也能帮助到别人....欢迎一切指正我虚心接受

TOP

说真的我真没有看懂呐!

TOP

在搜索百度.goole及相关批论坛均无发现....

这句话好像确实有点不太妥,建议改改,事实上相关话题其他论坛曾经有过更深入讨论
我记得好像是“非常批处理”论坛的某个教程,具体链接一时找不到了。
技术问题请到论坛发帖求助!

TOP

收藏了……我以前在研究过转义字符,觉得比较吃力

TOP

运行出错了,[code]C:\Documents and Settings\Administrator\桌面>...鍐嶉

TOP

这些东西我原来都没注意到,谢啦
你好吗

TOP

本帖最后由 cjiabing 于 2012-1-19 23:46 编辑

回复 12# sxw


    万恶的搜狗输入法!

    说实在的,这些东西很常见,没什么特殊的。
    在For中,一些引号在usebackq的规则下功能被改变,原来双引号在for中用来解析字符串,使用Usebackq后专门用来解析带空格的路径,而单引号则被用来解析字符串,而通常单引号在FOR中是用来执行命令的。
   
@echo off
for /f "tokens=1 delims=[]" %%a in ('cmd /c "wmic process where name="cmd.exe" get CommandLine" ^| find /i "%~f0" ^| find /i /n "%~f0"') do set /a num=%%a-1
echo 本程序一共打开了 %num% 个。
pauseCOPY


@echo off
set "v=&|"
for /f "tokens=*" %a in ("%v%") do echo;%aCOPY

双引号会强力终止各种符号的作用,而直接显示它们。当然,这里面可能用了两对双引号,其他一些字符,以及一些特殊情况的组合会导致双引号失效,这里就不举例了。
给你看看一个最变态的:
@echo off
for /f "tokens=2,10 delims=: " %%a in ('"Tasklist /v  /fi "IMAGENAME eq cmd.exe" /FO TABLE /NH"') do (
    if /i %%b==BatMPlayerSearch  Taskkill /f /t /pid %%a
)
::外面加了两层,最外层的是单引号,里层的是双引号,里层使用双引号的目的就是为了消除"IMAGENAME eq cmd.exe"这对双引号导致的错误!
pauseCOPY
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

返回列表