中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 批处理:通讯录 上一主题 | 下一主题
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『楼 主』:  批处理:通讯录

看了 zouzhxi DOS版的通讯录,有了部分构思:

20 楼最新修改:
11-20修改:采用模块方式减少相同功能脚本,增加联系人是否存在判断功能,修改单项结尾、查看全部联系人检索方式


namejm 版主的查找显示(修改了单项结尾检索方式):
@echo off
:: 要求词库的格式是:单词独占一行(不区分大小写);
:: 翻译的内容另起一行(不允许出现纯字母行),可以有多行。
:begin
cls
set input=
set line=
set /p input=请输入要查找的单词(要退出请直接回车):
if not defined input exit
for /f "tokens=1* delims=:" %%i in ('findstr /nirc:"^%input%" Tel.db') do (if /i "%%j"=="%input%" set line=%%i)
if not "%line%"=="" (goto display) else (
echo _________________________________
echo.
echo 没有找到 %input% 的记录
echo _________________________________
echo.
pause
goto begin)

:display
echo _________________________________
echo.
echo %input%:
for /f "skip=%line% delims=" %%i in (Tel.db) do (
    if "%%i"=="::" goto end
    echo     %%i
)
:end
echo _________________________________
echo.
pause
goto begin
删除某项记录的批处理
@echo off
echo.
set /p 删除人员=  删除人员:
>TelN.db echo ::电话本数据库
>>TelN.db echo --------------------------------------------------
>>TelN.db echo.
setlocal EnableDelayedExpansion
for /f "delims=" %%i in (Tel.db) do (
  if "%%i" == "::" set /a Num+=1
)

set Delete=echo
for /f "skip=3 delims=" %%i in (Tel.db) do (
  if "%%i" == "%删除人员%" set Delete=rem&&set /a N-=1
    !Delete! %%i>>TelN.db
  if "%%i" == "::" !Delete!.>>TelN.db&&set /a N+=1&&cls&&echo.&&echo   !N!/%Num%&&set Delete=echo
)
pause
del Tel.db
ren TelN.db Tel.db
exit
Tel.db 电话本数据库
::电话本数据库
--------------------------------------------------

张三
联系人姓名:张三
联系人电话:张三
联系人地址:张三
联系人单位:张三
::

李四
联系人姓名:李四
联系人电话:李四
联系人地址:李四
联系人单位:李四
::

王五
联系人姓名:王五
联系人电话:王五
联系人地址:王五
联系人单位:王五
::
新增单项
set 联系人姓名=
set 联系人电话=
set 联系人单位=
set 联系人地址=
set...
set /p 联系人姓名=联系人姓名:
set /p 联系人电话=联系人电话:
set /p 联系人地址=联系人单位:
set /p 联系人单位=联系人地址:
set /p...

>>Tel.db echo %联系人姓名%
>>Tel.db echo 联系人姓名:%联系人姓名%
>>Tel.db echo 联系人电话:%联系人电话%
if not "%联系人单位%"=="" >>Tel.db echo 联系人单位:%联系人单位%
if not "%联系人地址%"=="" >>Tel.db echo 联系人地址:%联系人地址%
if...
>>Tel.db echo ::
>>Tel.db echo.
[ Last edited by zxcv on 2006-11-21 at 03:20 AM ]

   此帖被 +7 点积分        点击查看详情   
评分人:【 redtek 分数: +5  时间:2006-11-16 00:48
评分人:【 ccwan 分数: +2  时间:2006-11-16 01:39


2006-11-16 00:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 2 楼』:  

set 联系人姓名
set 联系人电话
set 联系人单位
set 联系人地址

环境变量没有定义,貌似应为
set 联系人姓名=
set 联系人电话=
set 联系人单位=
set 联系人地址=


不过做得很不错,值得加分。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-16 01:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 3 楼』:  

建议再加入全部浏览的命令,因为我就比较喜欢全部显示后再从中查找。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-16 01:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by ccwan at 2006-11-15 13:39:
set 联系人姓名
set 联系人电话
set 联系人单位
set 联系人地址

环境变量没有定义,貌似应为
set 联系人姓名=
set 联系人电话=
set 联系人单位= ...

漏了^_^,谢谢指正

  Quote:
Originally posted by ccwan at 2006-11-15 13:45:
建议再加入全部浏览的命令,因为我就比较喜欢全部显示后再从中查找。

简单啊,加入一个选项跳转执行“notepad Tel.db”,直接浏览库文件^_^

2006-11-16 01:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 5 楼』:  

呵呵,加一个start好不好?不喜欢黑窗口一直开着。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-16 03:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 6 楼』:  

我觉得这样还不如直接用记事本来的快

2006-11-16 03:28
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 7 楼』:  

re:vkill
其实这样只是提供一种思路,让大家明白一些命令的用法。并非一定要使用这种通讯录。
有好多软件只是完成几个简单的命令,还做得很复杂呢。^_^
vkill兄别见怪。

   此帖被 +1 点积分     点击查看详情   
评分人:【 redtek 分数: +1  时间:2006-11-16 03:42




三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-16 03:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 8 楼』:  

基本应用,不用先建立“Tel.db”

通讯录.bat
@echo off
title 通讯录
mode con cols=80 lines=25
set DisPlay=
:Main
cls
echo.
echo   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
echo   ※                                                                        ※
echo   ※                     ☆欢迎使用命令提示符版通讯录☆                     ※
echo   ※                                                                        ※
echo   ※              zxcv@bbs.cn-dos.net    zh59@bbs.blueshow.net              ※
echo   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
echo.
echo     ※ 增加新联系人(N) ※ 删除联系人(D) ※ 修改联系人(M) ※ 查看Tel.db(V) ※
echo.
set input=
set line=
set /p input=  选择(直接输入联系人查询)%DisPlay%:
if not exist Tel.db call :Tel.db
if "%input%"=="" set DisPlay=&goto Main
for %%n in (n N) do if "%input%"=="%%n" goto New
for %%n in (d D) do if "%input%"=="%%n" goto Del
for %%n in (m M) do if "%input%"=="%%n" goto Modify
for %%n in (v V) do if "%input%"=="%%n" goto db

for /f "tokens=1* delims=:" %%i in ('findstr /nirc:"^%input%" Tel.db') do (if /i "%%j"=="%input%" set line=%%i)
if not "%line%"=="" (goto display) else (
echo   ________________________________________
echo.
echo   没有找到 %input% 的记录
echo   ________________________________________
echo.
pause
set DisPlay=
goto Main)

:display
echo   ________________________________________
echo.
for /f "skip=%line% delims=" %%i in (Tel.db) do (
    if "%%i"=="::" goto end
    echo     %%i
)
:end
echo   ________________________________________
echo.
pause
set DisPlay=
goto Main

:Tel.db
>Tel.db echo ::电话本数据库
>>Tel.db echo --------------------------------------------------
>>Tel.db echo.
goto :eof

:New
echo.
set 联系人姓名=
set 联系人电话=
set 联系人单位=
set 联系人地址=
set /p 联系人姓名=  联系人姓名:
if "%联系人姓名%"=="" goto Main
set /p 联系人电话=  联系人电话:
set /p 联系人地址=  联系人单位:
set /p 联系人单位=  联系人地址:

>>Tel.db echo %联系人姓名%
>>Tel.db echo 联系人姓名:%联系人姓名%
>>Tel.db echo 联系人电话:%联系人电话%
if not "%联系人单位%"=="" >>Tel.db echo 联系人单位:%联系人单位%
if not "%联系人地址%"=="" >>Tel.db echo 联系人地址:%联系人地址%
>>Tel.db echo ::
>>Tel.db echo.
set DisPlay=(增加新联系人: %联系人姓名%)
goto Main

:Del
echo.
set N=
set Num=
set /p 删除联系人=  删除联系人:
if "%删除联系人%"=="" set DisPlay=&goto Main

>TelN.db echo ::电话本数据库
>>TelN.db echo --------------------------------------------------
>>TelN.db echo.
set Delete=echo
setlocal EnableDelayedExpansion

for /f "skip=3 delims=" %%i in (Tel.db) do (
  if "%%i" == "%删除联系人%" set Delete=rem
    !Delete! %%i>>TelN.db
  if "%%i" == "::" !Delete!.>>TelN.db&&set Delete=echo
)
echo.
move/y Tel.db TelBak.db
ren TelN.db Tel.db
set DisPlay=(联系人 %删除联系人% 已删除)
goto Main

:Modify
echo.
set 修改联系人姓名=
set /p 修改联系人姓名=  修改联系人姓名:
if "%修改联系人姓名%"=="" set DisPlay=&goto Main
echo.
echo   修改:
echo.
set 联系人姓名=
set 联系人电话=
set 联系人单位=
set 联系人地址=
set /p 联系人姓名=  联系人姓名:
if "%联系人姓名%"=="" goto Main
set /p 联系人电话=  联系人电话:
set /p 联系人地址=  联系人单位:
set /p 联系人单位=  联系人地址:

set 删除联系人=%修改联系人姓名%
>TelN.db echo ::电话本数据库
>>TelN.db echo --------------------------------------------------
>>TelN.db echo.
set Delete=echo
setlocal EnableDelayedExpansion

for /f "skip=3 delims=" %%i in (Tel.db) do (
  if "%%i" == "%删除联系人%" set Delete=rem
    !Delete! %%i>>TelN.db
  if "%%i" == "::" !Delete!.>>TelN.db&&set Delete=echo
)
echo.
move/y Tel.db TelBak.db
ren TelN.db Tel.db

>>Tel.db echo %联系人姓名%
>>Tel.db echo 联系人姓名:%联系人姓名%
>>Tel.db echo 联系人电话:%联系人电话%
if not "%联系人单位%"=="" >>Tel.db echo 联系人单位:%联系人单位%
if not "%联系人地址%"=="" >>Tel.db echo 联系人地址:%联系人地址%
>>Tel.db echo ::
>>Tel.db echo.
set DisPlay=(联系人 %修改联系人姓名% 已修改)
goto Main

:db
start notepad Tel.db
goto Main
其实修改联系人是删除联系人与增加新联系人联合处理的

[ Last edited by zxcv on 2006-11-15 at 03:55 PM ]

附件 1: IE 通讯录.gif (2006-11-27 04:04, 19.24 K, 下载附件所需积分 1 点 ,下载次数: 3)


附件 2: 新增联系人.gif (2006-11-27 04:06, 20.39 K, 下载附件所需积分 1 点 ,下载次数: 3)


附件 3: 联系人资料.gif (2006-11-27 04:06, 40.41 K, 下载附件所需积分 1 点 ,下载次数: 3)


2006-11-16 03:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zouzhxi
中级用户

蝴蝶之吻


积分 430
发帖 177
注册 2006-9-20
来自 广东深圳
状态 离线
『第 9 楼』:  

回楼上:
你有代码好像没有双向查询功能,

  Quote:
知道名字,不知道号码,这个查询功能已经有了.
可是只知道号码,不知道名字,这个查询功能就没有.
因为我们写通讯录的时候,不止10个100个,多了,就记不住(处于模糊状态).

[ Last edited by zouzhxi on 2006-11-16 at 05:32 AM ]



Butterfly Kiss Blog
计算机DIY联盟论坛
2006-11-16 05:31
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (234693993)  编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 10 楼』:  

拜托!难道要求全责备?
说过是一种思路了,自己举一反三嘛!



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-16 05:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zouzhxi
中级用户

蝴蝶之吻


积分 430
发帖 177
注册 2006-9-20
来自 广东深圳
状态 离线
『第 11 楼』:  

我只是说,能不能实现双向模糊查询这一功能.,没有责备的意思。。。



Butterfly Kiss Blog
计算机DIY联盟论坛
2006-11-16 05:40
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (234693993)  编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by zouzhxi at 2006-11-16 05:40:
我只是说,能不能实现双向模糊查询这一功能.,没有责备的意思。。。

这个完全可以,不过"数据库"的格式决定你代码的简单是否,如果用sed代码更好写,和公交线路查询的差不多,~
http://www.cn-dos.net/forum/viewthread.php?tid=24668&fpage=1帖子11楼是sed版的

2006-11-16 06:14
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 13 楼』:  

修改:联系人或电话双向查询、查看全部联系人及电话

通讯录.bat
@echo off
title 通讯录
mode con cols=80 lines=25
set DisPlay=
setlocal EnableDelayedExpansion
:Main
cls
echo.
echo   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
echo   ※                                    ※
echo   ※           ☆欢迎使用命令提示符版通讯录☆           ※
echo   ※                                    ※
echo   ※       zxcv@bbs.cn-dos.net  zh59@bbs.blueshow.net       ※
echo   ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
echo.
echo     ※ 新增(N) ※ 删除(D) ※ 修改(M) ※ 查看全部(A) ※ 查看 Tel.db(V) ※
echo.
set input=
set line=
set /p input=  选择(直接输入联系人或电话查询)%DisPlay%:
if not exist Tel.db call :Tel.db
if "%input%" == "" set DisPlay=&goto Main
if /i "%input%" == "n" goto New
if /i "%input%" == "d" goto Del
if /i "%input%" == "m" goto Modify
if /i "%input%" == "a" goto All
if /i "%input%" == "v" goto db

for /f "tokens=1,2,3* delims=:" %%i in ('findstr /nirc:"%input%" Tel.db') do (
  if "%%j" == "%input%" set line=%%i
  if "%%k" == "%input%" set line=%%i)
if not "%line%" == "" (goto display) else (
echo   ________________________________________
echo.
echo   没有找到 %input% 的记录
echo   ________________________________________
echo.
pause
set DisPlay=
goto Main)

:display
echo   ________________________________________
echo.
for /f "skip=%line% delims=" %%i in (Tel.db) do (
    if "%%i" == "::" goto end
    echo     %%i
)
:end
echo   ________________________________________
echo.
pause
set DisPlay=
goto Main

:Tel.db
>Tel.db echo ::电话本数据库
>>Tel.db echo --------------------------------------------------
>>Tel.db echo.
goto :eof

:New
echo.
set 联系人姓名=
set 联系人电话=
set 联系人单位=
set 联系人地址=
set /p 联系人姓名=  联系人姓名:
if "%联系人姓名%" == "" goto Main
set /p 联系人电话=  联系人电话:
set /p 联系人地址=  联系人单位:
set /p 联系人单位=  联系人地址:

>>Tel.db echo %联系人姓名%:%联系人电话%:::
>>Tel.db echo 联系人姓名:%联系人姓名%
>>Tel.db echo 联系人电话:%联系人电话%
if not "%联系人单位%" == "" >>Tel.db echo 联系人单位:%联系人单位%
if not "%联系人地址%" == "" >>Tel.db echo 联系人地址:%联系人地址%
>>Tel.db echo ::
>>Tel.db echo.
set DisPlay=(增加新联系人: %联系人姓名%)
goto Main

:Del
echo.
set N=
set Num=
set /p 删除联系人=  删除联系人:
if "%删除联系人%" == "" set DisPlay=&goto Main

>TelN.db echo ::电话本数据库
>>TelN.db echo --------------------------------------------------
>>TelN.db echo.
set Delete=echo

for /f "skip=3 delims=" %%i in (Tel.db) do (
    call :DelName %%i
  if "!数据库!" == "%删除联系人%" set Delete=rem
    !Delete! %%i>>TelN.db
  if "%%i" == "::" !Delete!.>>TelN.db&&set Delete=echo
)
echo.
move/y Tel.db TelBak.db
ren TelN.db Tel.db
set DisPlay=(联系人 %删除联系人% 已删除)
goto Main

:Modify
echo.
set 修改联系人姓名=
set /p 修改联系人姓名=  修改联系人姓名:
if "%修改联系人姓名%" == "" set DisPlay=&goto Main
echo.
echo   修改:
echo.
set 联系人姓名=
set 联系人电话=
set 联系人单位=
set 联系人地址=
set /p 联系人姓名=  联系人姓名:
if "%联系人姓名%" == "" goto Main
set /p 联系人电话=  联系人电话:
set /p 联系人地址=  联系人单位:
set /p 联系人单位=  联系人地址:

set 删除联系人=%修改联系人姓名%
>TelN.db echo ::电话本数据库
>>TelN.db echo --------------------------------------------------
>>TelN.db echo.
set Delete=echo
setlocal EnableDelayedExpansion

for /f "skip=3 delims=" %%i in (Tel.db) do (
    call :DelName %%i
  if "!数据库!" == "%删除联系人%" set Delete=rem
    !Delete! %%i>>TelN.db
  if "%%i" == "::" !Delete!.>>TelN.db&&set Delete=echo
)
echo.
move/y Tel.db TelBak.db
ren TelN.db Tel.db

>>Tel.db echo %联系人姓名%:%联系人电话%:::
>>Tel.db echo 联系人姓名:%联系人姓名%
>>Tel.db echo 联系人电话:%联系人电话%
if not "%联系人单位%" == "" >>Tel.db echo 联系人单位:%联系人单位%
if not "%联系人地址%" == "" >>Tel.db echo 联系人地址:%联系人地址%
>>Tel.db echo ::
>>Tel.db echo.
set DisPlay=(联系人 %修改联系人姓名% 已修改)
goto Main

:All
cls
echo.
echo   通讯录所有联系人:
echo.
set N=
for /f "skip=3 delims=" %%i in (Tel.db) do (
    set All=%%i
  if "!All:~-3!" == ":::" set /a N+=1&set AllShow=!All::::=!&&echo     !AllShow::=: !
    set /a P=!N!%%19
  if "!P!" == "0" if "!All:~-3!" == ":::" call :AllPaus)
echo.
pause
goto Main

:db
start notepad Tel.db
goto Main

:DelName
for /f "tokens=1* delims=:" %%n in ("%1") do set 数据库=%%n
goto :eof

:AllPaus
echo.
set Paus=
set /p Paus=  回车继续(B返回主界面)...
if /i "%Paus%" == "b" goto Main
cls
echo.
echo   通讯录所有联系人:
echo.
goto :eof
[ Last edited by zxcv on 2006-11-15 at 11:14 PM ]

   此帖被 +5 点积分       点击查看详情   
评分人:【 redtek 分数: +5  时间:2006-11-18 00:02


附件 1: 修改联系人资料.gif (2006-11-27 04:07, 22.48 K, 下载附件所需积分 1 点 ,下载次数: 4)


附件 2: 所有联系人资料.gif (2006-11-27 04:08, 49.41 K, 下载附件所需积分 1 点 ,下载次数: 3)


2006-11-16 10:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 14 楼』:  

  对于
for %%n in (n N) do if "%input%" == "%%n" goto New
之类的for语句,可以用
if /i "%input%"=="n"
来替换,以达到简化代码的目的。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-16 11:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 15 楼』:  

if /i "%input%"=="n"
忘了这个

谢谢 namejm 版主提醒

2006-11-16 11:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: