批处理FOR命令,高手进……

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理FOR命令,高手进……相关的知识,希望对你有一定的参考价值。

本人正在学习批处理,对FOR命令看不懂,哪位高手给小弟讲解一下,主要是有例子就好半了,……谢谢了。
例子看不懂……简单的行吗,不行就算啦……

参考技术A WINXP下FOR命令已经变得非常强大了,用法有多种,由于网页问题,下面的内容显示后可能有变化。

一、FOR命令基本的功能是:对一组文件中的每一个文件执行某个特定命令。命令格式如下:

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一个单一字母可替换的参数。
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters
             为特定命令指定参数或命令行开关。

在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

二、如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:

FOR /D %variable IN (set) DO command [command-parameters]

    /D含义:如果集中包含通配符,则指定与目录名匹配,而不与文件    名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    /R含义:检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    /L含义:该集表示以增量形式从开始到结束的一个数字序列。 因此,(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 [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]

    filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前,每份文件都已被打开、读取并经过处理。 处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:

        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:                    在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。

    某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    会分析 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 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。

补充:
上面不止一个例子。
参考技术B 以下是我个人的理解..

begin----------------------------------------------------
:: 无参数
for %%d in (str1 str2 str3 str4) do (echo %%d)

这个 for 会循环 4 次
我理解为 把 in 后面的 内容依次 给 %%d
do 后面就是执行语句..

实例:
例如我要 得到当前系统的 所有盘符 就可以 用这个,.

for %%d in (b c d e f g h i j k l m n o p q r s t u ...)do (
if exist %%d: (
echo 存在盘符:%%d
)
)
----------------------------------------------------end

begin----------------------------------------------------
:: /d 和 /r
for /d %%d in (c:\*) DO (echo %%d)
::↑罗列c盘的所有文件夹
for /r %%r in (c:\*) DO (echo %%r)
::↑罗列c盘的所有文件夹和自文件夹

没怎麽用过,就知道用来罗列文件夹!
----------------------------------------------------end

begin----------------------------------------------------
:: /l
for /l %l in (128,1,512) do (echo %l)
你懂JS吗? 这就相当於 javascript 裏面的.
<script>for(l=128;l<513;l++)document.write(l+'<br>');</script>
/*
128 是起始值
1 是步长
512 是终值
*/
或者 VBS 裏面的
<script language=vbscript>
for l = 128 to 512
document.write(l&"<br>")
next
</script>

理解其中一个 /l 也能了解了..
----------------------------------------------------end

begin----------------------------------------------------
for /f "[options]" %%f in (file\'command'\"string") do ([执行的命令,要充分的利用%%f哦])
[begin--------"[options]"--------]
boot.ini(begin)//////////////////////////////
[boot loader]
timeout=3
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="This is my Computer." /noexecute=optin /fastdetect
//////////////////////////////boot.ini(end)
eol=?
::↑不会用...
skip=?
::↑一般用在读取一个文件上,忽略行数吧..例如
for /f "skip=3" %%f in (%SystemDrive%\boot.ini) do @echo %%f
::会读取%SystemDrive%\boot.ini文件,幷且忽略前3行.
delims=?
::↑像上面那个skip配合这个delims就可以拿到一个文本裏面的指定内容了,
::例如,我只要拿到第4行[operating systems]中的operating :
for /f "skip=3 delims=[s]" %%i in (%SystemDrive%\boot.ini) do @echo %%i
tokens=?
::↑?为一个数值,配合delims,表示碰到这个符号不操作就跳过?次,到?的时候就可以取!例如
for /f "skip=4 tokens=4 delims= " %%i in (%SystemDrive%\boot.ini) do @echo %%i
::这样就拿到Computer...
usebackq
::↑/f 中加了这个,表示可以获取一个命令返回的值得.例如
for /f "usebackq" %%e in (`dir "c:\*.htm" /s /b`) do (echo %%e)
::这样%%e就会获得命令dir "c:\*.htm" /s /b返回的值,(*****这个最有用)!
for /f "usebackq delims=*" %%e in (`dir "c:\*.htm" /s /b`) do (echo %%e)
::↑加了delims=*可以把长文件名的也罗列出来!
[--------"[options]"--------end]
----------------------------------------------------end

电脑高手进 显卡问题 回答马上加分

我的显卡是GF2mx400 64m的
内存256
CPU1.8GHZ
玩QQ 飞车都卡死了 谁知道是什么原因??
只要玩3D 的网游都卡的不行 象巨人 神泣 问道 CS都卡 有什么办法吗?
现卡3D加速器有什么用?? 我想下载一个能用吗???
机子能快点吗??
暂时换不了机子

加一个内存条就啥都能玩了是吗??

象穿越火线之类的 ??/

驱动级模拟
在DOS时代,当用户按下或者放开一个键时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开windows的设备管理器,可以查看到键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口,用来发出控制信号。也就是,从&H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表示是按下键还是释放键。当按下键时,最高位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写入数据就可以模拟按键了!用过QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那我们先看看如果用QB该怎么写代码:
假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样
OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
OUT &H60,&H50 '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键
那么要释放这个键呢?像这样,发送该键的断码:
OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
OUT &H60,(&H50 OR &H80) '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键
好了,现在的问题就是在VB中如何向端口写入数据了。因为在windows中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的WINDOWS2000端口操作驱动程序组件(可以到http://www.internals.com/)。它不仅可以操作端口,还可以操作内存;不仅能在VB下用,还可以在DELPHI、VC等其它环境下使用,性能特别优异。下载该组件,解压缩后可以看到几个文件夹,其中Release文件夹下的3个文件就是我们需要的,这3个文件是WinIo.sys(用于win xp下的驱动程序),WINIO.VXD(用于win 98下的驱动程序),WinIo.dll(封装函数的动态链接库),我们只需要调用WinIo.dll中的函数,然后WinIo.dll就会安装并调用驱动程序来完成相应的功能。值得一提的是这个组件完全是绿色的,无需安装,你只需要把这3个文件复制到与你的程序相同的文件夹下就可以使用了。用法很简单,先用里面的InitializeWinIo函数安装驱动程序,然后就可以用GetPortVal来读取端口或者用SetPortVal来写入端口了。好,让我们来做一个驱动级的键盘模拟吧。先把winio的3个文件拷贝到你的程序的文件夹下,然后在VB中新建一个工程,添加一个模块,在模块中加入下面的winio函数声明:

Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long
Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean
Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean
Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean
Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean

' ------------------------------------以上是WINIO函数声明-------------------------------------------

Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

'-----------------------------------以上是WIN32 API函数声明-----------------------------------------

再添加下面这个过程:
Sub KBCWait4IBE() '等待键盘缓冲区为空
Dim dwVal As Long
Do
GetPortVal &H64, dwVal, 1
'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中
'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度
Loop While (dwVal And &H2)
End Sub
上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。
然后再添加如下过程,这2个过程用来模拟按键:

Public Const KBC_KEY_CMD = &H64 '键盘命令端口
Public Const KBC_KEY_DATA = &H60 '键盘数据端口

Sub MyKeyDown(ByVal vKeyCoad As Long)
'这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '发送数据前应该先等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度
KBCWait4IBE
SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键

End Sub

Sub MyKeyUp(ByVal vKeyCoad As Long)
'这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键

End Sub

定义了上面的过程后,就可以用它来模拟键盘输入了。在窗体模块中添加一个定时器控件,然后加入以下代码:
Private Sub Form_Load()

If InitializeWinIo = False Then
'用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false
MsgBox "驱动程序加载失败!"
Unload Me
End If
Timer1.Interval=3000
Timer1.Enabled=True
End Sub

Private Sub Form_Unload(Cancel As Integer)
ShutdownWinIo '程序结束时记得用ShutdownWinIo函数卸载驱动程序
End Sub

Private Sub Timer1_Timer()
Dim VK_A as Long = &H41
MyKeyDown VK_A
MyKeyUp VK_A '模拟按下并释放A键
End Sub
[/quote]
运行上面的程序,就会每隔3秒钟模拟按下一次A键,试试看,怎么样,是不是对所有程序都有效果了?
需要注意的问题:
要在VB的调试模式下使用WINIO,需要把那3个文件拷贝到VB的安装目录中。
键盘上有些键属于扩展键(比如键盘上的方向键就是扩展键),对于扩展键不应该用上面的MyKeyDown和MyKeyUp过程来模拟,可以使用下面的2个过程来准确模拟扩展键:
Sub MyKeyDownEx(ByVal vKeyCoad As Long) '模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息

KBCWait4IBE '等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键

End Sub

Sub MyKeyUpEx(ByVal vKeyCoad As Long) '模拟扩展键弹起
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息

KBCWait4IBE '等待键盘缓冲区为空
SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键

End Sub

还应该注意的是,如果要从扩展键转换到普通键,那么普通键的KeyDown事件应该发送两次。也就是说,如果我想模拟先按下一个扩展键,再按下一个普通键,那么就应该向端口发送两次该普通键被按下的信息。比如,我想模拟先按下左方向键,再按下空格键这个事件,由于左方向键是扩展键,空格键是普通键,那么流程就应该是这样的:
[quote]MyKeyDownEx VK_LEFT '按下左方向键
Sleep 200 '延时200毫秒
MyKeyUpEx VK_LEFT '释放左方向键

Sleep 500
MyKeyDown VK_SPACE '按下空格键,注意要发送两次
MyKeyDown VK_SPACE
Sleep 200
MyKeyUp VK_SPACE '释放空格键
参考技术A 我想主要原因是你的内存太小了。
我的显卡也是64的,但内存是512的,你说的游戏除了 巨人 我都玩过,跟朋友玩魔兽争霸还是我做主机,从来没有出现过卡的情况(要定期优化自己的电脑)。

还有看看你的缓存是多大的,可以根据自己的内存设置大一些的缓存(我的电脑——属性——高级——性能下 设置——高级——更改——选种设置缓存的盘——重新设置初始大小和最大值——点击设置——确定),就OK了。

不过我觉得你还是扩大内存吧。
而且3D加速器这类东西其实对机器有很大损伤的。

祝你早日解决问题。本回答被提问者采纳
参考技术B 内存太小,就连流畅运行XP都几乎不行,网络游戏对内存要求比较高,所以你主要的问题是内存太小了,设置虚拟内存是可以但不能明显改善卡机的状况,甚至更慢,因为大量调用虚拟内存会导致硬盘频繁读取磁盘,硬盘的速度根本够不上内存,所以会把电脑拖慢,对磁盘的寿命也有影响。

加一条512内存的作用比较大。
参考技术C 你的机器确实有点老了,建议你加条内存吧,看看有没有合适的512的,估计很少,没有也弄条256的吧,然后把显卡换下吧,看楼主现在的卡,估计最多只能换个GF4的卡,现在较新的卡接口不一样,支持不了,楼主的主板估计是AGP4X的接口,这样呢,估计把画面质量调低点还是勉强可以玩的,主要是这些卡都最多只能支持大DX8.0 参考技术D 内存太小了,想不卡都不行。换成1G的想玩什么都行。

你可以适当的整理一些没用的文件,删除了。 再就是玩游戏的时候不要开其他的东西像你这样的配置。

以上是关于批处理FOR命令,高手进……的主要内容,如果未能解决你的问题,请参考以下文章

DELPHI问题,高手进

用Autoit编程软件,如何读取屏幕上的信息?Autoit高手进!

批处理参数详解

bat中的“for”的用法。~

能不能在c语言中调用批处理命令,并让批处理执行窗口后台运行?求编程高手帮助!

批处理命令 不显示dos窗口