Board logo

标题: [出题]娱乐一下~ [打印本页]

作者: pusofalse     时间: 2008-6-19 21:34    标题: [出题]娱乐一下~

10道题,如下,是我从学习批处理以来积攒的几个比较经典的题目,供新手练习,老手复习。有兴趣的可以来做一下~无兴趣的请无视。^_^

Q1:判断系统中有无123用户,无则添加用户名为123,密码为"123 &^"的普通用户

Q2:
a.txt:
abcdefg
123abcd
abcd123
abcdefg
asdfghabcda
1234

输出a.txt中所有以abcd开头的行
输出第一个以abcd开头的行
输出第二个以abcd开头的行


Q3:输出000-999到num.txt,最少两种方法

Q4:输入端口号,输出对应进程。如输入135,则输出svchost.exe的详细信息,要求代码同时兼容TCP与UDP端口

Q5:判断光驱所在的盘符,最少两种方法

Q6:编写批处理,6秒钟内找出局域网内主机ID为1-50之间所有在线的主机,网络ID未知。

Q7:输出九九乘法表

Q8:
倒序输出b.txt中的内容,如b.txt:
a
b
c
d
e
f
g
倒序输出:
g
f
e
d
c
b
a

Q9:字母排序,输入任意字母,进行排序 如输入z a u i b,则输出 a b i u z

Q10:计算任意字母之和,如输出azy,输出52 输入cd,输出7
作者: WANKOILZ     时间: 2008-6-19 22:18
Q8:
@echo off
for /f "tokens=1* delims=:" %%i in ('findstr/n ".*" b.txt^|sort/r') do echo.%%j
pause>nul
[ Last edited by WANKOILZ on 2008-6-19 at 10:31 PM ]
作者: fantakenshin     时间: 2008-6-19 22:23
新来的

完全不会做的说~~~
作者: pusofalse     时间: 2008-6-19 22:26


  Quote:
Originally posted by WANKOILZ at 2008-6-19 10:18 PM:
Q8:
@echo off
for /f "tokens=1* delims=:" %%i in ('findstr/n ".*" b.txt^|sort/r') do echo %%j
pause>nul

高! 用sort排序。。。可惜,我对sort完全不懂~ 集合中为何不直接sort/r b.txt?为何先要读取出行数呢~? 我试了下直接排序完全可以啊~ 也完全可以不用for
作者: WANKOILZ     时间: 2008-6-19 22:33
这样可以显示空行,而直接用sort会忽略空行。
作者: pusofalse     时间: 2008-6-19 22:37
原来如此~^_^ 谢谢指教~
作者: HAT     时间: 2008-6-20 08:37
Q1:判断系统中有无123用户,无则添加用户名为123,密码为"123 &^"的普通用户
@echo off
net user 123 >nul 2>nul
if "%errorlevel%" neq "0" (
  net user 123 "123 &^" /add
)

作者: HAT     时间: 2008-6-20 08:46
Q2:
a.txt:
abcdefg
123abcd
abcd123
abcdefg
asdfghabcda
1234

输出a.txt中所有以abcd开头的行
输出第一个以abcd开头的行
输出第二个以abcd开头的行
@echo off
rem 输出a.txt中所有以abcd开头的行
for /f "delims=" %%a in ('findstr "^abcd" "a.txt"') do (
  echo %%a
)
rem 输出第一个以abcd开头的行
echo.
for /f "delims=" %%a in ('findstr "^abcd" "a.txt"') do (
  echo %%a
  goto :next
)
:next
rem 输出第二个以abcd开头的行
echo.
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('findstr "^abcd" "a.txt"') do (
  set /a row+=1
  if "!row!" equ "2" (
    echo %%a
    goto :eof
  )
)

作者: HAT     时间: 2008-6-20 09:03
Q3:输出000-999到num.txt,最少两种方法
@echo off
type nul>num.txt
for /l %%a in (0,1,999) do (
  if %%a lss 10 (
    >>num.txt echo 00%%a
  ) else if %%a lss 100 (
    >>num.txt echo 0%%a
  ) else (
    >>num.txt echo %%a
  )
)

@echo off
type nul>num.txt
set str=1000
:add
>>num.txt echo %str:~-3%
set /a str+=1
if %str% lss 2000 goto :add

作者: HAT     时间: 2008-6-20 09:17
Q5:判断光驱所在的盘符,最少两种方法
@echo off
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  fsutil fsinfo drivetype %%a: | findstr /i "CD">nul && echo 光驱盘符:%%a
)

@echo off
for /f "tokens=2 delims==" %%a in ('wmic LogicalDisk where "DriveType='5'" get * /value ^| findstr /i "^DeviceID"') do echo 光驱盘符:%%a

作者: bat-zw     时间: 2008-6-20 10:50    标题: 上来晚了

真高兴又能上联盟了,这阵子生活中真像少了什么东西似的,这下好了。。。
解答Q9,还是用sort快点:
@echo off
set code=abcdefghijklmnopqrstuvwxyz
cd.>temp.txt
:begin
set /a a=%random%%%26
call,set a=%%code:~%a%,1%%
findstr "%a%" temp.txt>nul&&goto begin||echo %a%>>temp.txt
set var=%var% %a%
set /a n+=1
if %n% lss 10 goto begin
echo 排序前为:%var:~1%
echo.
for /f "delims=" %%i in ('sort temp.txt') do call,set str=%%str%% %%i
echo 排序后为:%str:~1%
pause>nul&del temp.txt
[ Last edited by zw19750516 on 2008-6-20 at 11:36 AM ]
作者: bat-zw     时间: 2008-6-20 11:12
解答Q7(九九法则表):
@echo off&setlocal enabledelayedexpansion
set "var=+ - * /"
for /f "tokens=1-4 delims= " %%a in ("%var%") do call :lp %%a %%b %%c %%d
pause>nul&goto :eof
:lp
for /l %%i in (1,1,9) do (
    for /l %%j in (1,1,%%i) do (
        set /a a=%%i%1%%j
        if !a! lss 10 set a= !a!
        set str=!str! %%i%1%%j=!a!
        if %%i equ %%j echo !str!&set "str="
    )
)
if "%1" equ "/" goto :eof
shift
goto lp
[ Last edited by zw19750516 on 2008-6-20 at 03:05 PM ]
作者: bat-zw     时间: 2008-6-20 12:06
Q10:
@echo off&setlocal enabledelayedexpansion
set codes=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 a
set code=%codes: =%
:begin
set /a a=%random%%%26,b=%random%%%10+1
set a=!code:~%a%,1!
echo %var%|findstr "%a%">nul&&goto begin
set var=%var%%a%
set /a n+=1
if %n% lss %b% goto begin
set n=0
echo 随机生成的字母组为:%var%
echo.
:lp
set a=%var:~,1%
set str=%str% %a%
set var=%var:~1%
if defined var goto lp
set str=%str:~1%
for %%a in (%codes%) do (
    call,set /a n+=1
    for %%i in (%str%) do (
        if "%%a" equ "%%i" set /a num+=!n!
    )
)
echo 字母组的数位和为:%num%
pause>nul

作者: bat-zw     时间: 2008-6-20 12:25
解答Q6:
@echo off
set t=%time%
for /f "tokens=14-16 delims=:." %%i in ('ipconfig /all^|findstr /c:"IP Address"') do set str=%%i.%%j.%%k.
set str=%str:~1%&arp -d
for /l %%i in (1,1,50) do start /min ping /n 1 %str%%%i>nul
arp -a|findstr "dynamic"
echo %t%
echo %time%
pause>nul
[ Last edited by zw19750516 on 2008-6-20 at 12:53 PM ]
作者: pusofalse     时间: 2008-6-20 16:43
两位前辈的思路。。真是太棒了~
虽说出题,但里面有几道题我也不会~
第8楼,hat前辈的第一段代码。。。输出所有以abcd开头的行~ 貌似有点思维定向了~
作者: HAT     时间: 2008-6-20 16:51


  Quote:
Originally posted by pusofalse at 2008-6-20 04:43 PM:
两位前辈的思路。。真是太棒了~
虽说出题,但里面有几道题我也不会~
第8楼,hat前辈的第一段代码。。。输出所有以abcd开头的行~ 貌似有点思维定向了~

改变一下思维可以吗?
findstr "^abcd" "a.txt"

作者: pusofalse     时间: 2008-6-20 17:46
1.因为不会用errorlevel,所以只能用笨办法了。
for /f "delims=" %%a in ('net user^|findstr "123"') do (
for %%i in (%%a) do (
if "%%i" equ "123" set user=123
))
if not defined user net user 123 "123 &^" /add

2.跟hat前辈的完全一样。。
3.for /l %%a in (1000 1 1999) do set var=%%a&>>num.txt call,echo %%var:~1%%

set n=-1
:1
set/a n+=1
set m=0000%n%
>>num.txt echo %m:~-3%
if %n% lss 999 goto 1
pause>nul

4.
call :lp tcp 7
call :lp udp 6
pause&goto :eof
:lp
for /f "skip=4 tokens=3,%2 delims=: " %%a in ('netstat -anop %1') do echo %%a &tasklist /fi "pid eq %%b"

5.又跟HAT前辈想一块去了。。

6.开启5个进程同时ping 进程1ping1-10 进程2 ping 11-20 用start给每个进程传递主机ID的参数。。。当然只ping1次

7。
@echo off
:1
set/a n+=1
if %n% gtr 9 pause>nul&exit
for /l %%a in (1 1 %n%) do call :lp %%a %n%

:lp
set/a res=%1*%2
set/p=%1*%2=%res%  <nul
if %1 equ %2 (echo.&goto 1) else goto :eof

8:
不会用sort,再用笨办法- -|||
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do set/a n+=1&set !n!=%%a
for /l %%i in (%n% -1 1) do echo !%%i!
pause>nul

9:输入任意字母,然后新建文件,分别以这些个字母命名,然后dir/b/on一下

10.
@echo off
setlocal enabledelayedexpansion
for %%a in (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) do (
  set/a n+=1
  set %%a=!n!
)
set/p var=
for %%a in (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) do set var=!var:%%a=%%a !
echo %var%
pause
for %%a in (%var%) do set/a res+=!%%a!
echo %res%
pause>nul
作者: pusofalse     时间: 2008-6-20 17:48    标题: 这是我的解题思路

汗。。。我何时发了两次。。。- -|||

[ Last edited by pusofalse on 2008-6-20 at 06:41 PM ]
作者: PPdos     时间: 2008-6-20 21:02
第四题较有挑战性 我单发一帖吧
作者: pusofalse     时间: 2008-6-20 21:13
第四题,我觉得必须用pid作为中介。。。不知还有没有别的方法。。。
作者: wxcute     时间: 2008-6-21 23:35
Q3:输出000-999到num.txt,最少两种方法

只写了一种(通用,max为最大值,改成你要的数字就行。)
@echo off
cd/d %~dp0

cd.>num.txt
set/a n=0
set/a x=1
set/a max=999
set/a num=%max%

:ui
 set/a num/=10
 if not %num% equ 0 set/a x*=10&&call :add_num wx_1&&goto :ui
set/a wx=%wx_1%+1

setlocal enableDelayedExpansion
:show_list
 set nn=%x%%n%
 echo !nn:~-%wx%,%wx%!>>num.txt
 call :add_num n
 if %n% gtr %max% goto :eof
 goto :show_list

:add_num
 set/a %1+=1
 goto :eof

作者: bat-zw     时间: 2008-6-21 23:43


  Quote:
Originally posted by wxcute at 2008-6-21 23:35:
Q3:输出000-999到num.txt,最少两种方法

只写了一种(通用,max为最大值,改成你要的数字就行。)
@echo off
cd/d %~dp0

cd.>num.txt
set/a n=0
set/a x=1
s ...

我晕,楼上的是不是搞得太复杂了,本来一句命令就可以搞定的,如下:
@echo off&for /l %%i in (1000,1,1999) do set str=%%i&call,echo %%str:~1%%>>num.txt
或者:
@echo off&for /l %%i in (0,1,999) do set str=00%%i&call,echo %%str:~-3%%>>num.txt
[ Last edited by zw19750516 on 2008-6-21 at 11:51 PM ]
作者: wxcute     时间: 2008-6-22 12:57
回zw19750516
我是想让P自动计算位数,如:

max=9就输出0-9
max=14就输出00-14
max=495就输出000-495

作者: 26933062     时间: 2008-6-22 13:09
::输出第一个以abcd开头的行
@echo off
for /f "delims=" %%a in ('findstr "^abcd" a.txt') do (
   if not defined flag echo %%a
   set flag=%%a
)
::输出第二个以abcd开头的行
@echo off
for /f "delims=" %%a in ('findstr "^abcd" a.txt') do (
   if defined flag echo %%a&pause&exit
   set flag=%%a
)
pause
Q7:输出九九乘法表
@echo off&set .23= &set ".24= "
for /l %%a in (1,1,9) do (
   setlocal enabledelayedexpansion
   for /l %%b in (1,1,%%a) do (
     set /a h=%%a*%%b
     set "m=!m! %%b×%%a=!h!!.%%b%%a!"
   )
   echo.!m!&endlocal   
)
echo\&pause
Q8:倒序输出a.txt中的内容,当a.txt内容位数不一样时就不能用sort了。
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
   set %%a=%%b&set w=%%a
)
for /l %%a in (%w% -1 1) do echo.!%%a!
pause
Q9:字母排序,输入任意字母,进行排序 如输入z a u i b,则输出 a b i u z
@echo off
set var=a z c f y b
for %%a in (%var%) do set .%%a=a
for /f "delims=.=" %%a in ('set .') do echo %%a
pause
Q10:计算任意字母之和
@echo off&setlocal enabledelayedexpansion
for %%a in (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) do (
   set /a nnn+=1&set %%a=!nnn!&set .!nnn!=%%a
)
set /a www=%random%%%5+1
for /l %%a in (1 1 %www%) do (
  set /a www=!random!%%25+1
  call set /a max+=%%.!www!%%
  call set num=!num!%%.!www!%%
)
echo 随机生成的字母组为 !num!
echo 字母组的数位和为   !max!
pause>nul

作者: HAT     时间: 2008-6-22 19:06


  Quote:
Originally posted by 26933062 at 2008-6-22 01:09 PM:
Q9:字母排序,输入任意字母,进行排序 如输入z a u i b,则输出 a b i u z
@echo off
set var=a z c f y b
for %%a in (%var%) do set .%%a=a
for /f "delims=.=" %%a in ('set .') do echo %%a
pause

Nice job!
作者: qzwqzw     时间: 2008-6-23 13:39
Q1:判断系统中有无123用户,无则添加用户名为123,密码为"123 &^"的普通用户
直接利用应用程序自己的错误处理就可以了
net user 123 "123 &^" /add

Q2:
a.txt:
abcdefg
123abcd
abcd123
abcdefg
asdfghabcda
1234

输出a.txt中所有以abcd开头的行
findstr "^abcd" a.txt

输出第一个以abcd开头的行
findstr "^abcd" a.txt>tmp.dat
set /p tmp=<tmp.dat
echo %tmp%

输出第二个以abcd开头的行
for /f "tokens=1* delims=:" %%i in ('findstr "^abcd" a.txt^|findstr /n ".*"^|findstr "^2:"') do echo %%j
作者: qzwqzw     时间: 2008-6-23 13:56
Q3:输出000-999到num.txt,最少两种方法

for /l %%i in (0,1,9) do for /l %%j in (0,1,9) do for /l %%k in (0,1,9) do echo %%i%%j%%k>>num.txt

if "%1"=="$$$" (>>num.txt echo %2) else (for /l %%i in (0,1,9) do call %0 $%1 %2%%i)

[ Last edited by qzwqzw on 2008-6-23 at 02:02 PM ]
作者: qzwqzw     时间: 2008-6-23 14:27
Q4:输入端口号,输出对应进程。如输入135,则输出svchost.exe的详细信息,要求代码同时兼容TCP与UDP端口

for /f "tokens=1-3,*" %%a in ('netstat -ano^|find ":123 "') do echo.%%a %%b %%c & tasklist /v /fi "pid eq %%d"
或者

netstat -ab