[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解決]批处理如何查找指令里的百分号或感叹号字符串?

举个例子
例如我想查找 echo %var% 这指令里,有没有存在%字?
  1. @echo off
  2. echo echo %var%|findstr "%%" && (echo .有%%符号)
  3. pause
复制代码
可是这样的话,再一开始的 %var% 时,%var%已经被替换成变量值了,这样就无法测得有无%符号
我知道这个例子是可以直接用转义来修改他

但是小弟现在的问题是,要判断很多不确定的随机指令

例如有个123.txt文件
  1. @echo off
  2. echo %hahahaha%
  3. echo hahahaha
  4. echo %var%
  5. echo var
复制代码
2,4行都有用到%,那就能侦测输出说 2,4行含有%字元

[ 本帖最后由 strong12345 于 2009-8-20 17:56 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

我發現找 "%" 問題是小 , 但是就是找不了  "!"
保存為文件123.txt
  1. @echo off
  2. echo %var%
  3. echo !var!
  4. pause
复制代码
例子1︰找% (成功)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type 123.txt') do (
  4. echo %%a|findstr "%%">nul && (echo yes)
  5. echo %%a|findstr "%%">nul || (echo no)
  6. )
  7. pause
  8. exit
复制代码
例子2︰找! (失敗...)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type 123.txt') do (
  4. echo %%a|findstr "\!">nul && (echo yes)
  5. echo %%a|findstr "\!">nul || (echo no)
  6. )
  7. pause
  8. exit
复制代码

[ 本帖最后由 strong12345 于 2009-8-19 08:39 编辑 ]

TOP

这里变量延迟可以不打开

TOP

......可是小弟的程序,之前必须用到很多变量延迟....
在此指令前先关闭变量延迟,执行完后再打开吗??

TOP

回复 4楼 的帖子

个人觉得找!最好在关闭延迟的情况下。
Still with wax

TOP

  1. @echo off
  2. rem if here, echo lines including %% and ! are:
  3. setlocal enabledelayedexpansion
  4. echo 包含%%和^^^!的行:
  5. for /f "delims=:" %%a in ('findstr /n "%% ^!" 123.txt') do echo %%a
  6. pause
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

请问版主 findstr /n 参数的意义是什么?
我在findstr /? 里并没有看到 /n 参数的介绍?

TOP

小弟改成 查找前先 setlocal disabledelayedexpansion
查找后再 setlocal enabledelayedexpansion
这样真的就可以了

另外再查找 ! 时,小弟用 ^! 转义不行,要用 \! 才行....

TOP

回复 6楼 的帖子

为什么在引号里出现!只需要一个^呢?有感叹号不是需要预处理两次的么?
Still with wax

TOP

回复 7楼 的帖子

你用的什么操作系统?
  /N         Prints the line number before each line that matches.
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 9楼 的帖子

开启变量延迟后要得到字符!,则要求在预处理后得到的是^!,以便再次处理时让^对!进行转义,因此可以使用以下几种形式:
echo ^^!
echo ^^^!
echo "^!"

第二句中!前面的^是对一个普通字符(预处理时!的确只是普通字符)进行转义,使它变得“更加普通”,虽然没必要,但没什么影响(而且还能以防万一后面是个特殊字符)。类似echo ^h^i,只要你喜欢。

在引号中,预处理时^会失去转义作用。因为"本身有转义作用,会使其中的特殊字符失去特殊性。


再如开启变量延迟后检验闰年:
setlocal enabledelayedexpansion
set year=1900
set /a "isleap = ^!(%year% %% 400) | ^!(%year% %% 4) & ^!^!(%year% %% 100)"
if !isleap!==1 (each %year% is leap year^^!) else echo n
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 11楼 的帖子

这个都理解,问题是在楼主自己个的代码之上换成
  1. echo %%a|findstr ^^! 2>nul && echo yes
复制代码
为什么不行呢?还有我试过"^!",^^^^!都不行,不知道为什么。
Still with wax

TOP

回复 12楼 的帖子

开启变量延迟后对for的变量%%i也会进行再次处理,见此帖:
http://www.bathome.net/viewthread.php?tid=4580

另外,echo %%a|findstr 这种方式本身存在隐患,如果%%a中包含特殊字符会产生问题。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

这个两次处理我考虑到了,但是还是不行,不知道为什么。
Still with wax

TOP

echo %%a|findstr (且不说其他特殊字符带来的问题)
开启变量延迟后,echo %%a 的结果基本不会包含“!”(情况特殊时还是有可能),叫findstr到哪里去找?(那个链接不知道你看没有)
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表