批处理练习

本文介绍了批处理编程中的一些实战技巧,包括如何实现两文本同行交替输出、查找字符数最多的文本行、文本左右对齐排版以及解决约瑟夫环问题。代码要求不生成临时文件,高效且简洁。此外,还提供了批处理重命名特殊文件名的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

批处理实现两文本同行交替输出

窗体顶端

窗体底端

有两个文本如下(实际中并不知道两文本各有多少行)

文本1.txt

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ccccccccccccccccccccccccccccccccccccccc
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ggggggggggggggggggggggggggggggggggggggg
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

文本2.txt

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

要求用批处理输出如下(两文本交替输出)

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ccccccccccccccccccccccccccccccccccccccc
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
ggggggggggggggggggggggggggggggggggggggg
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

要求:
1
尽量不生成临时文件
2
代码要高效
3
代码尽量简洁
目的:
唯一的目的在于共同提高!

 

@echo off

set "n=-1"&set "flag=a"

:begin

set /a n+=1

if %n% equ 0 (set "m=") else (set "m=skip=%n%")

for /f "%m% delims=" %%i in (1.txt) do echo %%i&if defined flag goto next

set no=a

:next

for /f "%m% delims=" %%i in (2.txt) do echo %%i&goto begin

if not defined no set "flag="&goto begin

pause>nul

 

@echo off&setlocal enabledelayedexpansion

set "num=0"

for %%a in (1.txt 2.txt) do (

    for /f "delims=" %%i in (%%a) do (

        set /a n+=1

        if !n! gtr !num! set "num=!n!"

        set /p=%%i <nul>>temp.txt

    )

    echo.>>temp.txt&set "n=0"

)

:lp

set /a n+=1

for /f "tokens=%n%" %%i in (temp.txt) do echo %%i

if %n% neq %num% goto lp

del /q temp.txt&pause>nul

 

 

批处理查找字符数最多的文本行

窗体底端

有文本a.txt如下:
aaaaaaa aaaa bbbbbb ccccccccccc dddd
aa aaaaaaa bbbbbbbb cccccccccc ddddddddddddd eeeeeee
aaaaaaaaaaaa bbbbbbbbbbb cccccccccccccccccccc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aa
aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
aaaaaaaaa ccccccccc bbbbbbbbbbbbb ddddddddddddddddd

通过批处理查找出文本中字符数(不含空格)最多的行并输出,很明显就是复制内容到剪贴板代码:
aaaaaaaaa ccccccccc bbbbbbbbbbbbb ddddddddddddddddd

要求:
1
不生成临时文件
2
代码简洁,高效,通用性好
3
加分仍以思路为重

@echo off

Setlocal Enabledelayedexpansion

set n=0

for /f "delims=" %%i in (a.txt) do (

set "ke=%%i"

set ke1=!ke: =!

set m=0

call :1

)

echo %wang%

pause

goto :eof

:1

if not "!ke1:~%m%,1!"=="" set /a m+=1&goto 1

if %m% gtr %n% set n=%m%&set wang=%ke%

goto :eof

 

 

 

@echo off

set num=0

for /f "delims=" %%i in (a.txt) do  set "str=%%i"&call,set "str=%%str: =%%"&call :lp "%%i"

call,echo %%_%num%%% %num%个字符

pause>nul&goto :eof

:lp

set "str=%str:~1%"&set /a n+=1

if defined str goto lp

if %n% geq %num% set "num=%n%"&set "_%num%=%~1"

set "n=0"

 

 

文本左右对齐排版

1.txt内容如下。复制内容到剪贴板代码:
111111111111111111111 98912
张三

222222222222222222 150020
李四四
333333333333333333333 360000
王五
444444444444444444 2332
赵六六
555555555555555555 222
田七
666666666666666666666 999999
舞吧通过批处理输出为:复制内容到剪贴板代码:

111111111111111111111 98912
张三

222222222222222222 150020
李四四
333333333333333333333 360000
王五
444444444444444444 2332
赵六六
555555555555555555 222
田七
666666666666666666666 999999
舞吧代码要求,不生成任何临时文件。
代码简洁,视思路与代码加分!
------------------------------------------------------------------------------------------
本题只是给出一个简单的文本通过批处理排版,而要求代码的通用,正如batman版主所说,会是一个繁琐的过程,于是就题解题,不必考虑代码的通用。

 

@echo off

Setlocal Enabledelayedexpansion

set n=0

for /f "tokens=1,2*" %%i in (1.txt) do (

      set "ke=%%i %%j"

      set m=0

      call :1             

)

for /f "tokens=1,2*" %%i in (1.txt) do (

      set "ke1=%%i %%j"

      set ke2=%%i           

      set m1=0

      call :2

      echo !ke2! %%j %%k           

)

pause

goto :eof

:1

  if not "!ke:~%m%,1!"=="" set /a m+=1&goto 1

  if %m% gtr %n% set n=%m%

  goto :eof 

 

:2

  if not "!ke1:~%m1%,1!"=="" set /a m1+=1&goto 2

  set /a dd=n-m1

  for /l %%a in (1,1,%dd%) do set "ke2=!ke2! "    

  goto :eof

 

 

 

@echo off&setlocal enabledelayedexpansion

set "kong=           "

for /f "delims=" %%a in (1.txt) do (

    for %%i in (%%a) do (

        set "str=%%i"&set /a n+=1

        if !n! equ 2 (

           set "str=%kong%!str!"

           set /p=!str:~-10! <nul

           ) else (

           set "str=!str!%kong%"

           set /p=!str:~,20! <nul

    ))

    set "n=0"&echo.

)

pause>nul

 

 

 

 

@echo off

setlocal enabledelayedexpansion

for /f "tokens=1,2*" %%a in ('type temp.txt') do (

   set "mo=%%a"&set "niu=%%b"&set "m=0"&set "n=0"&set "very="

   call :ming0 %%a %%b %%c

)

echo.&pause&exit

:ming0

if not "!mo:~%m%,1!"=="" (set "momo=!mo:~%m%,1!"&set /a "m+=1"&goto :ming0)

:ming1

if not "!niu:~%n%,1!"=="" (set "niuniu=!niu:~%n%,1!"&set /a "n+=1"&goto :ming1)

set /a "ming=30-%m%-%n%"

for /l %%i in (1 1 %ming%) do set "very=!very! "

echo %1 %very% %2 %3

 

 

 

 

@echo off

mode con cols=100 lines=20

setlocal enabledelayedexpansion

for /l %%a in (1,1,80) do set kong= !kong!

for /f "eol= tokens=1,2,3" %%a in ('type 1.txt') do (

set lie1-2=%%a%%b%kong%

set lie1-2=!lie1-2:~0,80!

set lie1-2=%%a!lie1-2:%%a%%b=!%%b

echo,!lie1-2!   %%c

)

pause

 

 

 

 

批处理重命名特殊文件名

文件夹下有三个由字母、数字、汉字、特殊字符组成文件名的文件同时批处理自身也在其中:
b!a!1235@_ s%#8i   c.rar
h^e12 0~%l%!p!@. s321-
的文件.txt
%o%%% !O!ffi9~  ce$- Wor8d29
文档.docx
重命名.bat

要求运行批处理将这三个文件文件名中的数字、汉字、特殊字符全部(含空格)去掉,而重命名为只含字母的文件,但
后缀名不能更改,同时批处理自身名字不能更改,重命名后:
basic.rar
helps.txt
oOfficeWor.docx
重命名.bat
要求:代码简洁、通用、效率不至于太低。

 

@echo off

for %%a in (*.*) do (

    if "%%~nxa" neq "%~nx0" (

        set "name=%%~na"

        setlocal enabledelayedexpansion

        set name1=!name!

        call :lp

        ren "!name!%%~xa" "!nam!%%~xa"

        set "nam="

        endlocal

)

)

pause

:lp

if defined name1 (

set "var=!name1:~,1!"

if "!var!" leq "Z" (

if "!var!" geq "a" (

set "nam=!nam!!var!"

))

set "name1=!name1:~1!"

goto lp

)

 

 

@echo off

set "code=a b c d e f g h i j k l m n o p q r s t u v w x y z"

for /f "delims=" %%a in ('dir /s /a-d /b') do (

if "%%~nxa" neq "重命名.bat" (

set "str=%%~na"&set "file=%%a"&set "var=%%~na"

setlocal enabledelayedexpansion

for %%i in (%code%) do set "str=!str:%%i=!"

set "str=!str: =!"&call :lp

ren "!file!" !files!%%~xa

endlocal

))

goto :eof

:lp

set /a n+=1

for /f "tokens=%n% delims=%str% " %%a in ("%var%") do (

if "%%a" neq "" set "files=!files!%%a"&goto lp

)

 

 

批处理解约瑟夫环应用题

窗体底端

题目:
  有二十九个女生(分别用129号来称呼)围成一圈玩报数游戏,规则是这样的:从1开始数数,当数到3的这个人就退出游戏,而她后面的人接着从1数。。。如此一直到最后剩下一个人,现在知道最初是从13号女生开始的游戏,问最后剩下的会是第几号女生?
要求:
  1 用批处理解答
  2 代码简洁高效
  3 代码通用且不生成临时文件

 

@echo off

set "str=13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12"

:again

for /f "tokens=1,2,4*" %%a in ("%str%") do (

   if not "%%c"=="" (set "str=%%c %%d %%a %%b"&goto :again) else (echo %%b&pause&exit)

)

 

@echo off

setlocal enabledelayedexpansion

for /l %%a in (12 -1 1) do set "str= %%a !str!"

for /l %%a in (29 -1 13) do set "str= %%a !str!"

 

:main

set "ie=0"

for %%a in (%str%) do set /a ie+=1

if %ie% neq 1 (

        for %%a in (%str%) do (

                set /a num+=1

                if !num! equ 3 (

                        set "num=0"

                        set "str=!str: %%a =!

                    )

            )

        goto main

    )

echo %str%

pause

 

 

@echo off&setlocal enabledelayedexpansion

for /l %%a in (13,1,29) do set "str=!str! #%%a#"

for /l %%a in (1,1,12) do set "str=!str! #%%a#"

:lp

for %%a in (!str!) do (

     set /a n+=1

     if !n! equ 3 set "str=!str: %%a=!"&set /a n=0

)

for /f "tokens=2" %%a in ("%str%") do if "%%a" neq "" goto lp

echo 最后剩下的是%str:#=%&pause>nul

 

 

批处理实现文本内容居中显示

a.       txt

代码:
[Promise don't come easy]

I should have known all along.
There was something wrong.
I just never read between the lines.
Then I woke up one day and found you on your way.
Leaving nothing but my heart behind.
What can I do to make it up to you.
Promises don't come easy.
But tell me if there's a way to bring you back home to stay.
Well I'd promises anything to you.
I've been walkin' around with my head hanging down.
Wondrin' what I'm gonna do.
'Cause when you walked out that door.

要求,CMD原始窗口中,不调节窗口大小,不生成临时文件,居中显示文本内容。输出如下:

代码:

                          [Promise don't come easy]

                        I should have known all along.

                          There was something wrong.

                     I just never read between the lines.

              Then I woke up one day and found you on your way.

                     Leaving nothing but my heart behind.

                     What can I do to make it up to you.

                          Promises don't come easy.

         But tell me if there's a way to bring you back home to stay.

                      Well I'd promises anything to you.

             I've been walkin' around with my head hanging down.

                         Wondrin' what I'm gonna do.

                    'Cause when you walked out that door.

 

 

@echo off

copy /y 1.txt 2.txt>nul

echo.>>2.txt&echo end>>2.txt

for /f "tokens=1,2* delims=: " %%i in ('findstr /n /o .* 2.txt') do (

    set "_%%i=%%j"&set ".%%i=%%k"

  if %%i geq 2 call :lp %%i

)

del /q 2.txt&pause>nul&goto :eof

:lp

set /a n=%1-1

set /a num=_%1-_%n%-2

set /a kl=(80-num)/2

for /l %%i in (1,1,%kl%) do set /p= <NUL

call,set /p=%%.%n%%%<NUL&ECHO.

批处理去除指定字符前所有的0

如文本1.txt:

代码:

0000acb0h
0b0c00a000s
0000h00ga00
a0000000

通过批处理将文本所有字符串字符a前的0去除输出如下:

代码:

acb0h
bca000s
hga00
a0000000

要求:代码简洁、高效、通用,不生成临时文件

 

 

@echo off

for /f "delims=" %%. in (1.txt) do (

   set "str=%%."

   call,set "str=%%str:*a=%%"

   for /f "delims=a" %%{ in ("%%.") do (

         set "var=%%{"

        call,echo.%%var:0=%%a%%str%%

  ))

pause>nul

 

 

@echo off

for /f "tokens=1,2 delims=a" %%i in (1.txt) do (

     if "%%j" neq "" (

        set "str=%%i"

        call,set "str=%%str:0=%%"

        call,echo %%str%%a%%j

        ) else (

        echo a%%i

     )

)

pause>nul

窗体底端

窗体底端

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值