中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [讨论]批处理结合sql 上一主题 | 下一主题
coldface
初级用户





积分 71
发帖 70
注册 2010-7-19
状态 离线
『楼 主』:  [讨论]批处理结合sql

需求如下:
ipmask数据库中保存了一些省份和ip的信息,想通过批处理查询sql,并按照搜索的预定信息输出到特定文件中,ISPID保存了ISP以及对应的ID,ProvinceID包含了省份和对应的ID。
ISPID文件内容:
DIANXIN 2
TIETONG 3

ProvinceID.txt文件内容:
anhui 1
beijing 2
我想实现比如说执行一次对安徽电信的查询(即SELECT where isp=2 and province=1),把结果输出到以anhui_dianxin命名文件下。注意文件中拼音与数字的对应关系。每执行一次就把结果输出到对应的命名文件下
如下是我写的一个查询,但是查询下来不是按照预想的输出的,那个select语句在for中执行写入到文件的内容都一样,如何解决这个问题?
谢谢!
@echo off&setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=1 delims= " %%j in (ISPID.txt) do (
for /f "tokens=1 delims= " %%k in (ProvinceID.txt) do (
echo.>acl_%%j_%%k_1.txt

for /f "tokens=2 delims= " %%a in (ISPID.txt) do (
for /f "tokens=2 delims= " %%b in (ProvinceID.txt) do (
sqlcmd  -U XX -P XX -d ipmask -Q "SELECT [net],[net mask] FROM [ipmask].[dbo].[result] where isp=%%a and province=%%b" -o acl_%%j_%%k_1.txt
)
)
)
)

2010-9-5 02:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

可以写个函数来获取ID对应的ISP或者省份。

  Quote:
D:\clark>type get_ISP.bat
@echo off
for /f "tokens=1,2" %%i in (ISPID.TXT) do (
  if /i "%%j" == "%~1" echo %%i
)
D:\clark>type ISPID.txt
DIANXIN 2
TIETONG 3
D:\clark>get_ISP.bat 3
TIETONG



2010-9-5 14:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
coldface
初级用户





积分 71
发帖 70
注册 2010-7-19
状态 离线
『第 3 楼』:  

哦?呵呵 谢谢,我去试试。
还可以这样的呀,呵呵

2010-9-5 14:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
coldface
初级用户





积分 71
发帖 70
注册 2010-7-19
状态 离线
『第 4 楼』:  

其实主要的疑点是查询上,怎么对应查询,比如读取ISPID 1,然后select 其它的省ID,然后写入到文件,版主你发的那个可以解决对应文件的写入,但是对查询那块不能实现啊。主要是for嵌套的问题

2010-9-5 15:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 5 楼』:  

从你写的脚本内容来看,大体可以知道,你有两点没弄明白

1、“setlocal ENABLEDELAYEDEXPANSION”,在什么情况下才需要用?本例中并不需要这个。

2、for中的变量可以迭代,若指定第一个变量为%%a,那么可以在for后续的循环体中用%%b代表第二个变量,%%c代表第三个,依此类推。

建议把for循环的帖子好好看看,弄懂为止
可能你完全弄懂需要花费3个小时的时间,但总比你求助一次要花半小时,以后遇到10次for循环的问题要好,因为弄懂之后,不会为再次出现相同的问题而浪费时间。
@echo off
for /f "tokens=1,2" %%a in (ISPID.TXT) do (
  for /f "tokens=1,2" %%c in (ProvinceID.txt) do (
    echo.> acl_%%a_%%c_1.txt
    sqlcmd  -U XX -P XX -d ipmask -Q "SELECT [net],[net mask] FROM [ipmask].[dbo].[result] where isp=%%b and province=%%d" -o acl_%%a_%%c_1.txt
  )
)
pause


2010-9-5 15:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
coldface
初级用户





积分 71
发帖 70
注册 2010-7-19
状态 离线
『第 6 楼』:  

对对,谢谢。我那会想出来了,这个%%b就是类似于C语言下的a++。
谢谢!

2010-9-5 18:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: