中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-20 01:48
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]身份证号码信息查询器[07-3-6更新] 查看 4,269 回复 14
楼 主 [原创]身份证号码信息查询器[07-3-6更新] 发表于 2007-03-05 06:47 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  使用方法:请把附件中的date.txt与本代码保存在同一目录下使用。
  注意事项:本数据库源于中华人民共和国国家统计局2006年12月31日的最新数据,在此之前,若因行政区划有变动而造成原有的行政区划代码被取消、变更,会导致部分合法ID被认为非法。

@echo off
:: 功能:
:: 1、根据号码查询性别、出生日期和户籍所在地
:: 2、15位号码升18位
:: 3、根据户籍所在地和出生日期批量生成身份证号码
::
:: 已知bug:
:: 1、输入检测不严格
:: 2、生成ID的速度较慢
::
:: Code by JM 2007-3-4 CMD@XP
::
:: 更新历史:
::
:: 07.3.6
::   更正了15位号码升18位时始终显示非法号码的错误;

mode con lines=20 cols=50
title 身份证号码信息查询器
setlocal enabledelayedexpansion

set check_num=10X98765432

:Main
cls
set flag=
set IDflag=
echo.&echo.&echo.&echo.
echo 1、通过18位号码查询基本信息
echo.
echo 2、15位号码升18位
echo.
echo 3、生成指定地区的身份证号码
echo.&echo.&echo.
echo __________________________________________________
echo.
set choice=
set /p choice= 请输入功能代码(退出请直接回车):

if "%choice%"=="1" goto Get_Info
if "%choice%"=="2" goto UpDate
if "%choice%"=="3" goto Creat_ID
if defined choice goto Main
exit

:Get_Info
cls
echo.&echo.&echo.&echo.&echo.
set ID=
set /p ID= 请输入18位身份证号码:
call :Check_ID %ID%
if defined flag (
call :PickUp_Info
) else call :ERR
echo 按任意键返回主界面...
pause>nul
goto Main

:UpDate
cls
echo.&echo.&echo.&echo.&echo.
set IDflag=15
set ID=
set /p ID= 请输入15位身份证号码:
set ID_15=%ID%
set ID=%ID:~0,6%19%ID:~6%
call :Check_ID %ID%
if defined flag (
call :PickUp_Info
) else call :ERR
echo 按任意键返回主界面...
pause>nul
goto Main

:Creat_ID
cls
echo.&echo.
echo   地名只能检索到县级及其之上的行政区划;必须
echo.
echo 按照行政级别的顺序输入,可以跳级输入,多个关键
echo.
echo 字用空格分隔。比如:四川 成都 青羊区 或者
echo.
echo 四川 青羊区 或者 成都 。
echo.
echo    生日必须是6位数字的格式,比如:20070130 。
echo.
echo __________________________________________________
echo.
set place=
set birthday=
set exp=
set /p place= 请输入地区关键字:
echo.
set /p birthday= 请输入8位格式的出生日期:
if "%birthday:~7,1%"=="" (call :ERR & pause & goto Main)
if not "%birthday:~0,8%"=="%birthday%" (call :ERR & pause & goto Main)
set /a day=1%birthday% 2>nul||(call :ERR & pause & goto Main)
if not "%day:~1%"=="%birthday%" (call :ERR & pause & goto Main)

cls
echo.&echo.
echo 符合条件的号码有^(中途可按 Ctrl^+C 暂停执行^):
echo.
for %%i in (%place%) do set exp=!exp!.*%%i
for /f "tokens=1*" %%i in ('findstr "%exp:~2%" date.txt') do (
set ID_place=%%i
set ID_tmp=!ID_place:~0,1!
for /l %%j in (1,1,9) do (
if !ID_tmp! equ %%j call :IDs
)
)
if not defined flag (
echo.&echo.&echo.
echo 数据库中检索不到关键字为 %place% 的地名!
echo.&echo.&echo.
)
echo 按任意键返回主界面...
pause>nul
goto Main

rem ==== 检测号码是否合法 ====
:Check_ID
set ID=%1
set ID_tmp=%1
if defined IDflag (
if "%ID:~16,1%"=="" set flag=&goto :eof
if not "%ID:~0,17%"=="%1" set flag=&goto :eof
) else (
if "%ID:~17,1%"=="" set flag=&goto :eof
if not "%ID:~0,18%"=="%1" set flag=&goto :eof
if /i "%ID:~-1%"=="x" set ID_tmp=%ID:~0,-1%
)
set /a ID_tmp_1=1!ID_tmp:~0,6! 2>nul||(set flag=&goto :eof)
set /a ID_tmp_2=1!ID_tmp:~6,8! 2>nul||(set flag=&goto :eof)
set /a ID_tmp_3=1!ID_tmp:~14! 2>nul||(set flag=&goto :eof)
if not "!ID_tmp_1:~1!!ID_tmp_2:~1!!ID_tmp_3:~1!"=="!ID_tmp!" set flag=&goto :eof
set sum=0
set str_wi=7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
for /l %%i in (0,1,16) do (
set ai=!ID:~%%i,1!
call :Get_Num %%i !str_wi!
set /a product=!ai!*!wi! 2>nul
set /a sum+=!product!
)
set /a mod=%sum%%%11
set last_num=!check_num:~%mod%,1!
if defined IDflag (
set ID=%ID%%last_num%
set flag=1
goto :eof
)
if /i "%ID:~-1%"=="%last_num%" (
set flag=1
) else set flag=
goto :eof

:Get_Num
:: 提取 %str_wi% 中对应位置上的数值
for /l %%i in (1,1,%1) do shift
set wi=%2
goto :eof

:PickUp_Info
set char=%ID:~-2,1%
set /a mod=%char%%%2
if %mod% equ 0 (
set SEX=女
) else set SEX=男
for /f "tokens=1*" %%i in ('findstr "%ID:~0,6%" date.txt') do (
set flag=exist
cls
echo.&echo.&echo.&echo.
if defined IDflag (
echo 身份证号码:%ID_15%
echo.
echo 升位后号码:%ID%
) else echo 身份证号码:%ID%
echo.
echo 性 别: %SEX%
echo.
echo 出生日期:%ID:~6,4% 年 %ID:~10,2% 月 %ID:~12,2% 日
echo.
echo 户籍所在地:%%j
echo.&echo.&echo.&echo.
)
if not "%flag%"=="exist" call :ERR
goto :eof

rem ==== 生成合法的号码 ====
:IDs
for /l %%i in (0,1,999) do (
for %%j in (0 1 2 3 4 5 6 7 8 9 X) do (
set ID=00%%i%%j
call :Check_ID %ID_place%%birthday%!ID:~-4!
if defined flag echo %ID_place%%birthday%!ID:~-4!
)
)
goto :eof

rem ==== 出错提示 ====
:ERR
echo.&echo.
echo 非法号码
echo.&echo.&echo.
goto :eof


[ Last edited by namejm on 2007-3-6 at 10:01 PM ]
本帖最近评分记录 (共 4 条) 点击查看详情
评分人分数时间
huzixuan +2 2007-03-05 06:56
jmz573515 +8 2007-03-05 07:29
lotus516 +4 2007-03-09 11:16
xycoordinate +2 2007-03-09 23:11
附件
数据库及背景知识.rar (26.43 KiB, 下载次数: 298)
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2 发表于 2007-03-05 07:03 ·  中国 安徽 芜湖 电信
高级用户
★★
积分 537
发帖 219
注册 2006-10-31 21:08
19年会员
UID 69036
性别 男
来自 芜湖
状态 离线
请有想造假证的同志 端正一下自己的想法!
江湖远
碧空长
路茫茫

一个人漫无目的的奔跑,风,刺骨的冷....
3 发表于 2007-03-05 07:30 ·  中国 辽宁 本溪 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线
真是不错的东东.
4 发表于 2007-03-05 07:46 ·  中国 甘肃 兰州 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
能查到详细的地址就好了
5 发表于 2007-03-05 08:46 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
Originally posted by vkill at 2007-3-4 18:46:
能查到详细的地址就好了

能查到对方的详细资料、三位数据、相片更好


PS:数据库里没有我旧版的地区号码:4525
6 发表于 2007-03-05 09:22 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
每次都要重新检索一边……

第一次的时候就把他们(前6位)存入变量。。。不是速度就提升了?
7 发表于 2007-03-05 10:39 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
Originally posted by slore at 2007-3-4 20:22:
每次都要重新检索一边……

第一次的时候就把他们(前6位)存入变量。。。不是速度就提升了?

批处理内变量越多,执行效率越慢
如果存入变量,有4000左右,加载的时间也不少
我试过7000个的,加载后速度慢了好多;用findstr搜索速度很快,我把7000个数据做成文件,findstr几乎马上可以搜索
8 发表于 2007-03-05 10:40 ·  中国 江苏 无锡 电信
初级用户
积分 57
发帖 23
注册 2006-10-29 08:23
19年会员
UID 68753
性别 男
状态 离线
楼主的P处理真是玩到可以登峰造极的境界了!
9 发表于 2007-03-08 23:26 ·  中国 湖北 武汉 武昌区 电信
初级用户
积分 20
发帖 9
注册 2007-03-08 22:23
19年会员
UID 81104
性别 男
状态 离线
因为身份证的编码是有规律的 这个批处理就是利用了这个规律来查和生成或转换的
不可能提详细的信息
法律上也不允许
10 发表于 2007-03-09 01:53 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
Originally posted by zh159 at 2007-3-4 21:39:

批处理内变量越多,执行效率越慢
如果存入变量,有4000左右,加载的时间也不少
我试过7000个的,加载后速度慢了好多;用findstr搜索速度很快,我把7000个数据做成文件,findstr几乎马上可以搜索


那直接一个data文件夹里面是 前6位.txt的文本,文本内容对应的地址^

那么直接type这个速度怎么样呢>
11 发表于 2007-03-09 09:21 ·  中国 广东 中山 电信
初级用户
积分 128
发帖 16
注册 2007-01-26 04:00
19年会员
UID 77697
性别 男
状态 离线
namejm 版主厉害啊!!偶试试!
12 发表于 2007-03-09 11:16 ·  中国 江西 赣州 电信
高级用户
★★
论坛上抢劫的
积分 551
发帖 246
注册 2006-09-21 12:35
19年会员
UID 63270
状态 离线
哈哈,有意思啊!
13 发表于 2007-03-09 11:28 ·  中国 广东 东莞 电信
初级用户
积分 107
发帖 48
注册 2006-11-30 12:06
19年会员
UID 72174
性别 男
状态 离线
楼主历害啊,服了!
玩P处理到这种境界!
14 发表于 2007-03-09 23:11 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
下载&研究
15 发表于 2009-06-21 06:06 ·  中国 广东 阳江 电信
新手上路
积分 16
发帖 14
注册 2006-06-23 05:58
20年会员
UID 57436
状态 离线
历害~~~~~~~~~~
论坛跳转: