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

我也来试试

我的思路跟 more 一样的,只是增加判断第一行就含有abcd时,就没有上一行;判断最后一行含有abcd时,就没有下一行。还有个前提a.txt中不能有空行的,否则就跑题了。
要求一:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set/a m=0
  4. for /f %%a in (a.txt) do (
  5. set/a n=!m!
  6. set/a m+=1
  7. set t!m!=%%a
  8. set str=%%a
  9. if "!str:~0,4!"=="abcd" (
  10. if !n!==0 (call echo 上  一  行:没有上一行) else (call echo 上  一  行:%%t!n!%%)
  11. echo abcd开头行:%%a
  12. echo.))
  13. pause
复制代码

要求二
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set/a m=0
  4. for /f %%a in (a.txt) do (set/a m+=1&set t!m!=%%a)
  5. for /l %%b in (1 1 !m!) do (
  6. set/a a=%%b-1&set/a b=%%b+1
  7. call set str=!t%%b!
  8. if "!str:~0,4!"=="abcd" (
  9.   if !a!==0 (call echo 上  一  行:没有上一行) else (call echo 上  一  行:%%t!a!%%)
  10.   call echo abcd开头行:%%t%%b%%
  11.   if !b! gtr !m! (call echo 下  一  行:没有下一行) else (call echo 下  一  行:%%t!b!%%)
  12.   echo.))
  13. pause
复制代码


[ 本帖最后由 sjzong 于 2009-5-2 16:49 编辑 ]

TOP

re 9楼 和14楼

9楼:disuo兄的代码,的确厉害用一个for就可以实现了!!佩服!其中代码中的第7行中的“!a1”,应该改为“!a1!”。
14楼:keen兄的思路还是值得学习的,但是这个代码中的 findstr /n "abcd" a.txt' 显示的是a.txt所有还有abcd的行,跟本题题意以abcd开头有点偏差了!!

[ 本帖最后由 sjzong 于 2009-5-2 17:40 编辑 ]

TOP

回复 17楼 的帖子

findstr /n "abcd" a.txt的确是找到的是所有含有abcd的行。

来个VBS的:
  1. '直接做的要求二。要回答要求一:把代码中的"& ArrLine(i+1) & vbCrLf"去掉就行了
  2. '没有考虑第一行和最后一行是abcd的情况
  3. Set objFSO = CreateObject("Scripting.FileSystemObject")
  4. Set objTextFile = objFSO.OpenTextFile("a.txt", 1)
  5. AllStr = objTextFile.ReadAll
  6. ArrLine = Split(AllStr, vbCrLf)
  7. For i = 0 To Ubound(ArrLine)
  8.     If Left(ArrLine(i), 4) = "abcd" Then
  9.         newStr = newStr & ArrLine(i-1) & vbCrLf & ArrLine(i) & vbCrLf & ArrLine(i+1) & vbCrLf
  10.     End If
  11. Next
  12. WSH.Echo newStr
复制代码

[ 本帖最后由 keen 于 2009-10-13 15:54 编辑 ]
(*^_^*)

TOP

原帖由 more 于 2008-6-13 14:14 发表
要求一:显示a.txt中以 abcd 开头的行和它的上一行。@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('type a.txt') do (
   set /a n+=1,m=n-1
   set _!n!=%%a
   set str=%%a
   if " ...



能否讲解一下你的代码呢,有些看不懂,谢谢

TOP

我也刚学批处理,试着来帮楼上解释一下,如不正确还望有人能帮我指正一下,别让我误导了人家,呵呵!

setlocal enabledelayedexpansion      开启延迟变量开关
for /f "delims=" %%a in ('type a.txt') do (    获取a.txt文件中的一行给变量%%a.  "delims=" 没有分隔符就是获取整行,如果有分隔符如: "delims= " 就是遇到
                                                                 空格结束,忽略空格后的字符,'type a.txt' 应该是以查看方式打开a.txt文件,
   set /a n+=1,m=n-1     以数字表达式方式给n,m赋值,n+=1 for 语句循环一次加1.
   set _!n!=%%a        把%%a 的值传递给n ,!n! 应该是立刻刷新变量的值, _   下划线用于储藏空间,作为变量的输出 ( 只对紧跟其后的变量有效)
                                  呵呵,这 个下划线不太熟悉!!
   set str=%%a       把变量%%a 的值传递给str
   if " ...

[ 本帖最后由 fhsyj 于 2009-10-22 15:52 编辑 ]

TOP

也来一个,呵呵
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "skip=2 delims=[]" %%a in ('find /n "abcd" a.txt') do (
  4.       set temp_=
  5.       for /f "delims=" %%b in (a.txt) do (
  6.            set /a temp_+=1
  7.            set /a temp_a=!temp_!+1
  8.            set /a temp_b=!temp_!-1
  9.            if !temp_a! == %%a echo 上一行:%%b
  10.            if !temp_b! == %%a echo 下一行:%%b
  11.       )
  12. )
  13. pause
复制代码

TOP

借鉴7楼的要求一的做法,做了要求二^^
  1. rem 要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行
  2. @echo off&setlocal enabledelayedexpansion
  3. set /a i=1
  4. for /f "delims=" %%a in (a.txt) do (
  5.    set /a i+=1,j=i+1,k=j+1
  6.    set  _!k!=%%a
  7.    call set str=%%_!j!%%
  8.     if "!str:~,4!"=="abcd" ( call echo 上一行:%%_!i!%%&call echo 此行:%%_!j!%%&call echo 下一行:%%_!k!%% )
  9.     )
  10. pause>nul
复制代码

[ 本帖最后由 zgq0301 于 2009-11-14 18:48 编辑 ]

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. echo 每个上一行:
  3. for /f "delims=:" %%i in ('findstr /n ^^abcd text.txt') do set/at=%%i-2&more +!t! text.txt>tmp&set/pt=<tmp&echo !t!
  4. echo.&echo 每个上下行&echo.
  5. for /f "delims=:" %%i in ('findstr /n ^^abcd text.txt') do set/at=%%i-2&more +!t! text.txt>tmp&set/pt=<tmp&echo !t!&more +%%i text.txt>tmp&set/pt=<tmp&echo !t!
  6. del tmp&pause
复制代码

TOP

  1. 第一题
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in (1.txt) do (set a=%%i
  5. if "!a:~0,4!"=="abcd" (echo !b!&echo %%i)
  6. set b=%%i)
  7. pause
复制代码
  1. 第二题
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in (1.txt) do (
  5. if !a!==b (echo !c!&echo !d!&echo %%i&set a=)
  6. set w=%%i&if "!w:~0,4!"=="abcd" (set a=b)
  7. if !a!==b (set d=%%i) else (set c=%%i)
  8. )
  9. pause
复制代码

TOP

嗯丶…这个可以用到for 语句!

TOP

要求一:显示a.txt中以 abcd 开头的行和它的上一行。要求二:显示a.txt中以 abcd 开头的行和它的上一行及下 ...
more 发表于 2008-6-13 14:14


谁能解释一下这个 _!n!的用法吗?

类似于C里面的指针?

为什么只能放在call里输出

TOP

一.
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     echo;%%a|findstr "^abcd">nul&&(
  4.     echo;%%a
  5.     if not "!num!"=="" echo;!num!
  6.     )
  7.     set num=%%a
  8. )
  9. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     if !n!==2 echo;%%a&set n=
  4.     echo;%%a|findstr "^abcd">nul&&(
  5.     echo;%%a&set /a n+=2
  6.     if not "!num!"=="" echo;!num!
  7.     )
  8.     set num=%%a
  9. )
  10. pause
复制代码

TOP

本帖最后由 尘丶 于 2015-8-10 17:21 编辑

  1. @echo off&setlocal enabledelayedexpansion
  2. setlocal enabledelayedexpansion
  3. (for /l %%a in (1,1,30) do set/p n%%a=)<1.txt
  4. for /f "delims=" %%a in (1.txt) do (
  5. set num=%%a&set /a n+=1&set /a s=!n!-1&set /a k=!n!+1
  6. if "!num:~,4!"=="abcd" (
  7.     call,echo;上一行:%%n!s!%%
  8.     echo;%%a
  9.     call,echo;下一行:%%n!k!%%
  10.   )
  11. )
  12. pause
复制代码

TOP

返回列表