|
maya0su
中级用户
积分 241
发帖 131
注册 2005-9-28
状态 离线
|
『楼 主』:
[讨论]数据查询与数据库操作脚本
今天去一公司,在等待的过程中,突然有一电话问营业员某某的电话,只见那个营业员用鼠标拖着拖动条一个一个找那个名字,然后报上电话号码!
忽然觉得很可笑,就想有没有一个批处理可以解决这个问题呢?
在回来的公车上,就一直琢磨这个问题……可是等我把这个问题解决后,又觉得这个批处理的根本就没有存在的意义,因为不论是word还是excel甚至是记事本都有查找字符串的功能……哎……
不过既然写出来了,就把代码贴出来……供大家一笑……呵呵……
@echo off
set /p uu=请输入你要查找的姓名或电话号码:
type config.cfg |find /i "%uu%"
echo.
echo.
echo.
pause
exit
说明:config.cfg为CS的设置文件,估计大家知道这个,而那三个echo.是为了在寻找并显示之后,有一段空白空间,好让pause的显示不影响正常显示输出,容易观看一些!
[ Last edited by willsort on 2006-8-22 at 03:21 ]
|
房东说:这娃是个好孩子! |
|
2006-8-15 23:09 |
|
|
mornsmile
初级用户
积分 147
发帖 23
注册 2005-1-23
状态 离线
|
『第
2 楼』:
你说的cs是指反恐吗,那跟电话什么关系
|
|
2006-8-16 07:28 |
|
|
xjmxjm1234
中级用户
论坛第一菜鸟
积分 361
发帖 166
注册 2006-4-15
状态 离线
|
『第
3 楼』:
cs 是寄存器吗?
Quote: | 好让pause的显示不影响正常显示输出,容易观看一些! |
|
用 pause > nul 不就行了吗?
Quote: | 不过既然写出来了,就把代码贴出来……供大家一笑……呵呵…… |
|
没关系,批命令最重要的不是精通,创新才是。
|
Diskette Operating System |
|
2006-8-16 13:11 |
|
|
无奈何
荣誉版主
积分 1338
发帖 356
注册 2005-7-15
状态 离线
|
『第
4 楼』:
我觉得编写脚本的目的就是方便的解决一些实际问题,只要是需要脚本编写肯定是满足特定需求的,其他的考量就是看看是否实用。
有一段时间我需要频繁的查一些地方的邮编和电话区号,我就做了下面的脚本。为了格式化输出及增强输入的容错性使用了gawk.exe。由于制作的不是太用心,所以不是太满意也就没有拿出来献丑。
使用方法是:比如要查我的老家 泰安 的邮编可以这样
1、YBQH 泰安
2、YBQH tai an
3、YBQH taian
4、YBQH ta
5、YBQH 0538
也可以空参数运行,按提示输入。其中按拼音字头会返回很多非所需结果。其他文件见附件。由于今天无法上传附件,上传系统好像也有问题,需要的话通知我一下。
YBQH.bat
Quote: |
- ::简易邮编区号查询程序
- ::BY 无奈何@cn-dos.net
- @echo off
- title 邮编区号查询
- echo.
- gawk -f find.awk %*
- goto next
- :loop
- echo.
- gawk -f find.awk
- :next
- echo.
- set j=
- set /p j= 按“0”键或空格键继续;其他任意键退出....
- if "%j%" == " " goto loop
- if "%j%" == "0" (goto loop) else exit
- goto :end
- :end
无奈何发表于 2006-08-16 21:51 |
|
find.awk
BEGIN {
IGNORECASE = 1
FS="\t"
if (ARGV[1] != ""){
for (i = 1; i <= ARGC; i++) {
imput=imput " " ARGV[i]
}
} else {
printf "请输入待查询的关键字:"
getline imput < "-"
}
gsub(/^ +| +$/,"",imput)
str=toupper(imput)
gsub(/ +/,"",str)
if (str == "") {
print "\n\t\t关键字请不要留空!"
exit
}
printf "\n\n%-10s%-16s%10s%10s\n","所属省市","地区","电话区号","邮政编码"
printf "================================================\n"
while((getline < "YBQH.txt") > 0){
if (($0~str)||(gensub(/ +/,"","g",$3)~str)) {
printf "%-10s%-16s%10s%10s\n",$1,$2,$5,$6
flag=1
}
}
print "\n"
if (flag==0)
print "\t\t无此关键字记录!\n"
}
|
☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul
|
|
2006-8-16 22:19 |
|
|
hanbsome
初级用户
积分 36
发帖 14
注册 2006-4-29
状态 离线
|
『第
5 楼』:
强 这样的批处理都搞出来了 佩服
|
|
2006-8-16 22:43 |
|
|
maya0su
中级用户
积分 241
发帖 131
注册 2005-9-28
状态 离线
|
『第
6 楼』:
CS是反恐的配置文件,不过这里我是用那个代替电话本的!
我有个不好习惯,就是总是把实际的文件都贴出来,而不是真正我设想的文件
看了无奈何版主的代码,我觉得我的代码还是需要再完善一点的
其实代码的有用与无用无关紧要,最主要的是,我们需要去思考,是不是能让电脑让生活更简单……
|
房东说:这娃是个好孩子! |
|
2006-8-16 22:52 |
|
|
3742668
荣誉版主
积分 2013
发帖 718
注册 2006-2-18
状态 离线
|
『第
7 楼』:
Quote: | 可是等我把这个问题解决后,又觉得这个批处理的根本就没有存在的意义,因为不论是word还是excel甚至是记事本都有查找字符串的功能……哎…… |
|
你也不用太妄自菲薄了,且不说不管有用没用,每写一次脚本对写脚本的能力都会有所提高,单是脚本的灵活多样性,就不是大众化的程序所能比拟的。当然,没有大众化的应用程序,那么脚本的功能也会受到很大的影响。其实我的主要观点是:不要把脚本和应用程序放在对立的面上,而是应该考虑怎么能让脚本结合应用程序更大地发挥它们的作用。
例如,以下是把我以前的几个脚本拼凑起来的东东:
[1] BAT文件部分:
@echo off
:start
setlocal
cls
echo 1.添加记录
echo 2.查询记录
echo 3.保存记录为csv格式
echo 4.保存为数据库
echo 5.从网页查看数据
echo 其他任意键退出...
set /p var=选择:
set var=%var:~0,1%
call :%var% %0 2>nul || goto :eof
endlocal
goto start
:1
setlocal
cls
echo 输入记录:
set /p str=
echo %str% >>%1
if exist 电话号码数据库.mdb wscript.exe 数据库脚本.vbs /a %str%
endlocal
goto :eof
:2
setlocal
cls
echo 输入查询条件:
set /p str=
cls
more +52 %1 | findstr %str% || echo 记录不存在!
echo.&echo 按任意键回到主菜单! & pause>nul
endlocal & dir >nul
goto :eof
:3
setlocal >记录.csv
for /f "skip=52 tokens=1,2" %%i in (%~fsnx1) do echo %%i,%%j >>记录.csv
endlocal
goto :eof
:4
wscript.exe 数据库脚本.vbs /c %1 && echo 操作完毕!
pause
goto :eof
:5
wscript.exe 数据库脚本.vbs
goto :eof 注意:代码末尾有个回车,文件名可以随意。
[2] VBS文件部分:
Set objArgs = WScript.Arguments
strDataName = "电话号码数据库.mdb"
strTableName = "MyTelTable"
On Error Resume Next
If WScript.Arguments.Count <> 0 Then
Select Case objArgs(0)
Case "/c" bat2mdb
Case "/a" If Not AddRecord(objArgs(1),objArgs(2)) Then bat2mdb
Case Else PrintData
End Select
Else
PrintData
End If
'****************************************************************************
'bat2mdb
'****************************************************************************
Sub bat2mdb()
CreateDataBase
With CreateObject("Scripting.FileSystemObject").OpenTextFile(objArgs(1))
For i = 1 to 52
.skipline
Next
Do While .AtEndOfStream <> True
On Error Resume Next
strArray = Split(.ReadLine)
AddRecord strArray(0),strArray(1)
Loop
End With
End sub
'****************************************************************************
'创建数据库文件
'****************************************************************************
Sub CreateDataBase()
On Error Resume Next
CreateObject("Adox.Catalog").Create ( _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source =" & strDataName )
'建立一个新表
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open _
"Provider= Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=" & strDataName
objConnection.Execute( "CREATE TABLE " & strTableName & _
"(Name TEXT(10) , Tel TEXT(20) )" )
End Sub
'****************************************************************************
'添加数据
'****************************************************************************
Function AddRecord(strName,strTel)
On Error Resume Next
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
AddRecord = objConnection.Open( _
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strDataName )
objRecordSet.Open _
"SELECT * FROM " & strTablename, objConnection, 3, 3
objRecordSet.AddNew
objRecordSet("Name") = strName & space(1)
objRecordSet("Tel")= strTel & space(1)
objRecordSet.Update
End Function
'****************************************************************************
'获得HTML代码
'****************************************************************************
Function GetStrHtml()
strHTML = "<table border='1' style='border-collapse: collapse' " & _
"bordercolor='#111111' width='100%' id='Table1' >"
strHTML = strHTML & "<tr><td>姓名</td><td>电话</td></tr>"
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open _
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strDataName
objRecordSet.Open _
"SELECT * FROM " & strTablename, objConnection, 3, 3
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
strHTML = strHTML & "<tr>"
for i = 1 to objrecordset.fields.count
strHTML = strHTML & "<td>" & objrecordset.fields(i - 1) & "</td>"
next
strHTML = strHTML & "</tr>"
objRecordSet.MoveNext
Loop
GetStrHtml = strHTML & "</table>"
End Function
'****************************************************************************
'显示数据
'****************************************************************************
Sub PrintData()
Set objIE = Wscript.CreateObject("InternetExplorer.Application")
With objIE
.menubar = 0
.addressbar = 0
.toolbar = 0
.statusbar = 0
.resizable = 0
.width = 400
.height = 500
.navigate "about:blank"
.left = fix((.document.parentwindow.screen.availwidth-.width)/2)
.top = fix((.document.parentwindow.screen.availheight-.height)/2)
.visible = 1
end With
With objIE.Document
.Write "<HTML><HEAD><TITLE>电话数据库</TITLE></HEAD>"
.Write "<BODY STYLE='font:14pt arial; color:white;"
.Write "filter:progid:DXImageTransform.Microsoft.Gradient"
.Write "(GradientType=0, StartColorStr=#800000, EndColorStr=#DB7093)'>"
.Write "<DIV id='WriteStr'></DIV>"
.Write "<HR COLOR=#DB7093></FONT></CENTER></BODY></HTML>"
end With
Set objDiv = objIE.Document.All.WriteStr
objDiv.innerHTML = GetStrHtml()
End Sub 注意:保存的文件名必须为: 数据库脚本.vbs
本来打算把vbs文件放在bat里面echo出来的,由于代码太长了,所以就分开为了两个文件。由于代码由我以前的几个脚本拼凑而来,所以难免有所不足,大家可以自行修改了耍耍。
附件
1: 脚本.rar (2006-8-17 20:44, 2.05 K, 下载附件所需积分 1 点
,下载次数: 37)
|
|
2006-8-17 20:44 |
|
|
zrz000
初级用户
积分 44
发帖 16
注册 2006-8-15
状态 离线
|
『第
8 楼』:
又学到了不少..以后要多上来看看///
|
|
2006-8-18 18:39 |
|
|
maya0su
中级用户
积分 241
发帖 131
注册 2005-9-28
状态 离线
|
『第
9 楼』:
RE:3742668
请问如下
more +52 %1 | findstr %str% || echo 记录不存在!
1. more +52 %1 是什么意思?
2. || echo 记录不存在! 为什么要用二个管道符?
麻烦请解释一下!
谢谢
|
房东说:这娃是个好孩子! |
|
2006-8-20 11:17 |
|
|
namejm
荣誉版主
batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
『第
10 楼』:
Quote: | Originally posted by maya0su at 2006-8-20 11:17:
请问如下
more +52 %1 | findstr %str% || echo 记录不存在!
1. more +52 %1 是什么意思?
2. || echo 记录不存在! 为什么要用二个管道符?
麻烦请解释一丠... |
|
1、从第52行之后开始显示文件内容;
2、||并非两个管道符号的连用,而是表示如果前面的语句执行失败,则执行之后的语句;类似的还有&&,表示前面的语句执行成功之后才执行后面的语句;
[ Last edited by namejm on 2007-2-5 at 10:41 AM ]
|
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。 |
|
2006-8-20 13:32 |
|
|
maya0su
中级用户
积分 241
发帖 131
注册 2005-9-28
状态 离线
|
『第
11 楼』:
@echo off
title 电话本查找工具
color 0A
:start
cls
echo.
echo.
echo 查找电话或姓名----1
echo 添加电话或姓名----2
echo 退出本程序--------3
echo.
echo.
set /p var=选择:
set var=%var:~0,1%
call :%var% %0 2>nul || goto :eof
:1
cls
set /p uu=请输入你要查找的姓名或电话号码:
type 电话本.txt | find /i "%uu%" || echo 没有找到你要查找的姓名和电话
echo.
echo.
echo.
pause
goto :start
:2
cls
set /p nn=请输入你要添加的姓名和电话:
echo %nn% >>电话本.txt
echo 添加完毕.
echo.
echo.
echo.
pause
goto :start
:end
exit
在继续完善之后,我想知道,如何给这个批处理上加上,“删除”这个选项?
|
房东说:这娃是个好孩子! |
|
2006-9-4 08:36 |
|