本文目录:
- 1、网站脚本错误提示'dd'未定义是什么意思
- 2、什么是脚本病毒?WINDOWS下的PE病毒 ?
- 3、教你如何在win10下自动运行python程序脚本
- 4、怎样写脚本把windows服务改为手动?
- 5、windows bat脚本怎么写
网站脚本错误提示'dd'未定义是什么意思
脚本错误就是你的东西不支持现在你弄的东西.
“脚本错误”形成的原因是因为访问者所使用的浏览器不能完全支持页面里的脚本,而且出现频率并不低。遇到“脚本错误”时一般会弹出一个非常难看的脚本运行错误警告窗口,而事实上,脚本错误并不会影响网站浏览,因此这一警告可谓多此一举。要关闭警告则可以在浏览器的工具菜单选择Internet选项,然后单击高级属性页。进入到浏览标签,并选中“禁止脚本调试”复选框,以后你就不会再收到这些警告了。
什么是脚本病毒?WINDOWS下的PE病毒 ?
脚本病毒通常是JavaScript代码编写的恶意代码,
一般带有广告性质,会修改您的IE首页、修改注册表等信息,造成用户使用计算机不方便。
PE病毒是指所有感染Windows下PE文件格式文件的病毒.
PE病毒大多数采用Win32汇编编写.
PE病毒对于一个热衷于病毒技术的人来说,是必须掌握的.
只有在PE病毒中,我们才能真正感受到高超的病毒技术.
编写Win32病毒的几个关键
Api函数的获取
不能直接引用动态链接库
需要自己寻找api函数的地址,然后直接调用该地址
一点背景:在PE Loader装入我们的程序启动后堆栈顶的地址是是程序的返回地址,肯定在Kernel中! 因此我们可以得到这个地址,然后向低地址缩减验证一直到找到模块的起始地址,验证条件为PE头不能大于4096bytes,PE header的ImageBase值应该和当前指针相等.
病毒没有.data段,变量和数据全部放在.code段
编写Win32病毒的几个关键
偏移地址的重定位
Call delta
delta: pop ebp
sub ebp,offset delta
那么变量var1的真正偏移地址为:var1+ebp
对PE文件格式的了解
编写Win32病毒的几个关键
病毒如何感染其他文件
在文件中添加一个新节
该新节中添加病毒代码和病毒执行后的返回Host程序的代吗
修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的节,以便程序运行后先执行病毒代码.
PE病毒感染其他文件的方法还有很多,譬如PE病毒还可以将自己分散插入到每个节的空隙中等等,这里不在一一叙述.
PE文件格式一览
Section n
Section ...
Section 2
Section 1
Section table
PE header
DOS stub
DOS MZ header
PE header
Pe header 由三部分组成
字串 "PE\0\0"(Signature)
映像文件头(FileHeader)
可选映像头(OptionalHeader)
字串 "PE\0\0"
Signature 一dword类型,值为50h, 45h, 00h, 00h(PE\0\0). 本域为PE标记,我们可以此识别给定文件是否为有效PE文件.
这个字串在文件中的位置(e_lfanew),可以在DOS程序头中找到它的指针,它占用四个字节,位于文件开始偏移3CH字节中.
映像文件头
该结构域包含了关于PE文件物理分布的信息, 比如节数目,文件执行机器等.
它实际上是结构IMAGE_FILE_HEADER的简称.
映像文件头结构
IMAGE_FILE_HEADER STRUCT
___ Machine WORD
___ NumberOfSections WORD
___ TimeDateStamp dd
___ PointerToSymbolTable dd
___ NumberOfSymbols dd
___ SizeOfOptionalHeader WORD
___ Characteristics WORD
IMAGE_FILE_HEADER ENDS
映像文件头的基本信息
关于文件信息的标记,比如文件是exe还是dll
2
Characteristics *
7
可选头的大小
2
SizeOfOptionalHeader
6
符号数目
4
NumberOfSymbols
5
COFF符号表的偏移
4
PointerToSymbleTable
4
生成该文件的时间
4
TimeDataStamp
3
文件中节的个数
2
NumberOfSection **
2
机器类型,x86为14ch
2
Machine *
1
描述
大小(字节)
名字
顺序
可选映像头
optional header 结构是 IMAGE_NT_HEADERS 中的最后成员.包含了PE文件的逻辑分布信息.该结构共有31个域,一些是很关键,另一些不太常用.这里只介绍那些真正有用的域.
这儿有个关于PE文件格式的常用术语: RVA
RVA 代表相对虚拟地址.它是相对虚拟空间里的一个地址 .
举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h.每个RVA都是相对于模块的起始VA的.
可选映像头
文件中节对齐的粒度.
FileAlignment
内存中节对齐的粒度.
SectionAlignment
PE文件的优先装载地址.比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处.若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址.
ImageBase
PE装载器准备运行的PE文件的第一个指令的RVA.若要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行.
AddressOfEntryPoint *
描述
名字
可选映像头
NT用来识别PE文件属于哪个子系统.
Subsystem
一IMAGE_DATA_DIRECTORY 结构数组.每个结构给出一个重要数据结构的RVA,比如引入地址表等.
DataDirectory
所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸.可以以此值作为PE文件第一节的文件偏移量.
SizeOfHeaders
内存中整个PE映像体的尺寸.
SizeOfImage
win32子系统版本.若PE文件是专门为Win32设计的,该子系统版本必定是4.0否则对话框不会有3维立体感.
MajorSubsystemVersion
MinorSubsystemVersion
描述
名字
DataDirectory数据目录
一个IMAGE_DATA_DIRECTORY数组,里面放的是这个可执行文件的一些重要部分的RVA和尺寸,目的是使可执行文件的装入更快,数组的项数由上一个域给出.IMAGE_DATA_DIRECTORY包含有两个域,如下:
IMAGE_DATA_DIRECTORY
VitualAddress DD
Size DD
IMAGE_DATA_DIRECTORY ENDS
节表
节表其实就是紧挨着 PE header 的一结构数组.该数组成员的数目由 file header (IMAGE_FILE_HEADER) 结构中 NumberOfSections 域的域值来决定.节表结构又命名为 IMAGE_SECTION_HEADER.
结构中放的是一个节的信息,如名字,地址,长度,属性等.
IMAGE_SECTION_HEADER
本节原始数据在文件中的位置
4
PointerToRawData *
5
本节的原始尺寸
4
SizeOfRawData *
4
这个值+映像基地址=本节在内存中的真正地址.OBJ中无意义.
4
Virtual *
3
OBJ文件用作表示本节物理地址EXE文件中表示节的真实尺寸
4
PhysicalAddress或VirtualSize
2
节名
8
Name *
1
描述
大小(字节)
名字
顺序
IMAGE_SECTION_HEADER
节属性
4
Characteristics *
10
本节在行号表中的行号数目
2
NumberOfLinenumbers
9
本节要重定位的数目
2
NumberOfRelocations
8
行号偏移
4
PointerToLinenumbers
7
OBJ中表示该节重定位信息的偏移EXE文件中无意义
4
PointerToRelocations
6
描述
大小(字节)
名字
顺序
节
"节(Section)"跟在节表之后,一般PE文件都有几个"节".比较常见的有:
代码节
已初始化的数据节
未初始化的数据节
资源节
引入函数节
引出函数节
代码节
代码节一般名为.text或CODE,该节含有程序的可执行代码.
每个PE文件都有代码节
在代码节中,还有一些特别的数据,是作为调用映入函数之用.如:
Call MessageBoxA的调用,反汇编后该指令被换为call 0040101A,而地址0040101A仍在.text中,它放有一个跳转指令jmp dword ptr[0040304c],即这条跳转指令的目的地址处于.idata节中的0040304C处,其中放的才是MessageBoxA的真正地址,如下图:
已初始化的数据节
这个节一般取名为.data或DATA
已初始化的数据节中放的是在编译时刻就已确定的数据.如Hello World 中的字符串"Hello World!".
未初始化的数据节
这个节的名称一般叫.bbs.
这个节里放有未初始化的全局变量和静态变量.
资源节
资源节一般名为.rsrc
这个节放有如图标,对话框等程序要用到的资源.
资源节是树形结构的,它有一个主目录,主目录下又有子目录,子目录下可以是子目录或数据.
都是一个IMAGE_RESOURCE_DIRECTORY结构.结构如下:
IMAGE_RESOURCE_DIRECTORY 结构
以ID标识的资源数
2
NumberOfldEntries
6
以名字标识的资源数
2
NumberOfNamedEntries
5
次版本号
2
MinorVersion
4
主版本号
2
MajorVersion
3
资源生成时间
4
TimeDateStamp
2
通常为0
4
Characteritics
1
描述
大小(字节)
名字
顺序
引入函数节
一个引入函数是被某模块调用的但又不在调用者模块中的函数
这个节一般名为.idata,也叫引入表.
它包含从其它(系统或第三方写的)DLL中引入的函数,例如user32.dll,gdi32.dll等.
它的开始是一个IMAGE_IMPORT_DESCRIPTOR数组.这个数组的长度不定,但他的最后一项是全0,可以以此判断数组的结束.
引出函数节
什么是引出函数节
引出函数节是用来向系统提供导出函数的名称,序号和入口地址等信息,以便Windows装载器通过这些信息来完成动态链接的过程.
了解引出函数节对于学习病毒来说,是极为重要的.
Api函数地址的获取与引出函数节息息相关.
引出函数节
通过Api函数名查找其地址
(1)定位到PE文件头
(2)从PE文件头中的课选文件头中取出数剧目录表的第一个数据目录,得到导出表的地址.
(3)从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环.
(4)从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数.
(5)如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值,然后在AddressOfNameOrdinals指向的数组中以同样的索引值去除数组项的值,假如该值为m.
(6)以m值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址.
教你如何在win10下自动运行python程序脚本
写一个小的python程序,如test.py
由于python执行的比较快,窗口会一闪而过,所以加入while循环保持窗口。
在和test.py文件的同文件夹下 ,新建一个.bat文件,例如run.bat 这是由于python文件不是可执行文件,所以需要借助bat文件进行操作。
第二行是执行这个test.py文件
右键单击此电脑或我的电脑,点击 管理 -系统工具 -任务计划程序 -任务计划程序库
之后点击右侧创建基本任务
上述操作的图就不放了,参考链接:
进入创建基本任务后,名称随意取,描述可选填,点击下一步
触发器,什么时候触发脚本,这里先选择一次,点击系一部之后选择一次的时间,这里往后写几分钟,方便一会查看结果 点击下一步
操作这里默认启动程序就可以,点击下一步
选择要执行的脚本文件,选择浏览,选中run.bat文件点击打开 ,点击下一步
点击完成
在任务计划程序库中找到刚才建立的 测试 任务,在右下方有属性选项点击,更改红色圈出来的地方。 也可以在触发器中更改触发时间,或者新建触发条件
等待触发时间到,就会运行改脚本,按住Ctrl+C停止运行,测试成功
原文链接:
怎样写脚本把windows服务改为手动?
编写一个批处理文件,按照下列命令实例进行操作:
net start "服务名" (开启服务)
net stop "服务名" (关闭服务)
如果启动的服务名是词组时,服务名称两边要加双引号。
sc config 服务名 start= demand //手动
sc condig 服务名 start= auto //自动
sc config 服务名 start= disabled //禁用
sc start 服务名
sc stop 服务名
参考:
windows bat脚本怎么写
批处理之家
你就用记事本就可以编辑了。里面输入dos命令
最后,另存为*.bat的格式
【 echo 命令 】
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用 ^)结合来实现输入一
些命令到特定的文件中。
【 rem 命令 】
注释命令,类似于在C语言中的/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读
和你自己日后修改。
:: 也具有rem的功能
但::和rem还是有区别的,当关闭回显时,rem和::后的内容都不会显示。但是当打开回显时,rem和rem
后的内容会显示出来,然而::后的内容仍然不会显示。
Rem Message
Sample:@Rem Here is the description.
【 pause 命令 】
暂停命令。运行 Pause 命令时,将显示下面的消息:
Press any key to continue. . .(或:请按任意键继续. . .)
Sample:
@echo off
:begin
copy G:*.* d:\back
echo 请插入另一张光盘...
pause
goto begin
在这个例子中,驱动器 G 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张光盘
盘放入驱动器 G 时,pause 命令会使程序挂起,以便您更换光盘,然后按任意键继续处理。
【 call 命令 】
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的
标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法
call [[Drive:][Path] FileName ] [:label [arguments]]
参数
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。
【 start 命令 】
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
如:start calc.exe 即可打开Windows的计算器。
常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令
脚本内执行,该新行为则不会发生。
【 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
命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
【 set 命令 】
显示、设置或删除变量。
显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。
设置变量:set aa=abcd 此句命令便可向变量aa赋值abcd。如果变量aa已被定义,则aa的值被修改为abcd;若aa尚未定义,则此句命令即可定义新的变量aa,同时为变量aa赋予初始值abcd。
删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令为实质意义。
需要说明的是,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。
set命令具有扩展功能,如用作交互输入、字符串处理、数值计算等,属于高级命令范畴。
[编辑本段]批处理符号简介
【 回显屏蔽 @ 】
表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。
@用法举例:通过运行批处理文件对比pause和@pause命令即可明了@的效果。
【 重定向1 与 】
将输出信息重定向到指定的设备或文件。系统默认输出到显示器。
如:echo aaaaaa.txt 即可将本在显示器上显示的信息aaaaa输出到文件a.txt中,屏幕上没有任何显示。如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息aaaaa;若a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息aaaaa。
echo aaaaaa.txt 类似于echo aaaaaa.txt。区别在于:如果a.txt本已存在,a.txt会擦除a.txt中的原有内容,而a.txt并不擦除原有内容,仅在a.txt文件的末尾添加信息aaaaa。a.txt不存在时,二者没有差别。
【 重定向2 】
将输入信息来源重定向为指定的设备或文件。系统默认从显示器读取输入信息。
重定向使用举例:
=========================================
@echo off
echo abcdefg——这是文件a.txt中的信息a.txt
echo 请任意输入字符,以回车结束:
set /p ifo=
cls
echo 【 从屏幕获得的输入信息 】
echo %ifo%
set /p ifo=a.txt
echo 【 从文件a.txt获得的输入信息 】
echo %ifo%
pausenul
=========================================
读者观察命令与输出即可体会到重定向的功能和效果。
【 管道符号 | 】
将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。使用格式为:command_1|command_2
管道符号使用举例:
=========================================
@echo off
echo aaaaa.txt
del /p a.txt
pause
=========================================
@echo off
echo aaaaa.txt
echo y|del /p a.txt
pause
=========================================
对比以上两个批处理执行结果,读者即可明白管道符的用法和效果。
需要说明的是,上面del命令添加开关/p只是为了让读者明白管道符号的使用方法,实际删除文件时不加/p开关即可实现无提示直接删除。
【 转义符 ^ 】
将特殊符号转化为一般符号,即剥离特殊符号的特殊地位。特殊符号指:|
比如,如果我们想输出符号“”,直接用命令 echo 是不行的,必须修改为 echo ^ 。其余几个特殊符号类似需要有同样的处理。
转义字符使用举例:
=========================================
@echo off
echo aaaaa.txt
echo 第一句echo执行完毕
echo aaaa^a.txt
echo 第二句echo执行完毕
pause
=========================================
比较上面的两句echo,第一句echo将信息aaaa输出到了文件a.txt,而第二句echo则在直接屏幕上显示出aaaaa.txt
【 逻辑命令符 】
逻辑命令符包括:、、||
-它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败;
-当前面的命令成功执行时,执行后面的命令,否则不执行;
||-当||前面的命令失败时,执行||后面的命令,否则不执行。
=========================================
@echo off
echo ^|^|
reg add HKCU /v try /f||echo **成功**
reg add HKCU1 /v try /f||echo **失败**
echo ^^
reg delete HKCU /v try /fecho **成功**
reg delete HKCU /v try /fecho **失败**
echo ^
reg delete HKCU /v try /fecho **成功**
reg delete HKCU /v try /fecho **失败**
pause
=========================================
执行reg add或reg delete后,系统会给出执行结果;我们通过echo命令也给出了“执行结果”。对比系统和我们自己给出的结果,既可以验证逻辑命令的判断机理。
[编辑本段]常用DOS命令释义
【 文件夹管理 】
cd 显示当前目录名或改变当前目录。
md 创建目录。
rd 删除一个目录。
dir 显示目录中的文件和子目录列表。
tree 以图形显示驱动器或路径的文件夹结构。
path 为可执行文件显示或设置一个搜索路径。
xcopy 复制文件和目录树。
【 文件管理 】
type 显示文本文件的内容。
copy 将一份或多份文件复制到另一个位置。
del 删除一个或数个文件。
move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
ren 重命名文件。
replace 替换文件。
attrib 显示或更改文件属性。
find 搜索字符串。
fc 比较两个文件或两个文件集并显示它们之间的不同
【 网络命令 】
ping 进行网络连接测试、名称解析
ftp 文件传输
net 网络命令集及用户管理
telnet 远程登陆
ipconfig显示、修改TCP/IP设置
msg 给用户发送消息
arp 显示、修改局域网的IP地址-物理地址映射列表
【 系统管理 】
at 安排在特定日期和时间运行命令和程序
shutdown立即或定时关机或重启
tskill 结束进程
taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
tasklist显示进程列表(Windows XP Home Edition中没有)
sc 系统服务设置与控制
reg 注册表控制台工具
powercfg控制系统上的电源设置
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
[编辑本段]语句结构释义
类似于C语言,批处理也有它的语句结构。批处理的语句结构主要有选择结构(if语句)、循环结构(for语句)等。
【 if语句(选择结构) 】
if语句实现条件判断,包括字符串比较、存在判断、定义判断等。通过条件判断,if语句即可以实现选择功能。
1、字符串比较
if语句仅能够对两个字符(串)是否相同、先后顺序进行判断等。其命令格式为:
IF [not] string1 compare-op string2 command1 [else command2]
其中,比较操作符compare-op有以下几类:
== - 等于
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。
字符串比较示例:
===============================================
@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
if /i %str1% LSS %str2% (echo str1^str2) else (echo str1^=str2)
echo.
set /p choice=是否显示当前时间?(y/n)
if /i not %choice% EQU n echo 当前时间是:%date% %time%
pausenul
===============================================
对于最后一个if判断,当我们输入n或N时的效果是一样的,都不会显示时间。如果我们取消开关/i,则输入N时,依旧会显示时间。
另外请注意一下几个细节:1-echo str1^str2和echo str1^=str2;2-echo.。
2、存在判断
存在判断的功能是判断文件或文件夹是否存在。其命令格式为:
IF [NOT] EXIST filename command1 [else command2]
===============================================
@echo off
if exist %0 echo 文件%0是存在的!
if not exist %~df0 (
echo 文件夹%~df0不存在!
) else echo 文件夹%~df0存在!
pausenul
===============================================
这里注意几个地方:
1-存在判断既可以判断文件也可以判断文件夹;
2-%0即代表该批处理的全称(包括驱动器盘符、路径、文件名和扩展类型);
3-%~df0是对%0的修正,只保留了其驱动器盘符和路径,详情请参考for /?,属高级批处理范畴;
4-注意if语句的多行书写,多行书写要求command1的左括号必须和if在同一行、else必须和command1的右括号同行、command2的左括号必须与else同行、command1和command2都可以有任意多行,即command可以是命令集。
3、定义判断
定义判断的功能是判断变量是否存在,即是否已被定义。其命令格式为:
IF [not] DEFINED variable command1 [else command2]
存在判断举例:
===============================================
@echo off
set var=111
if defined var (echo var=%var%) else echo var尚未定义!
set var=
if defined var (echo var=%var%) else echo var尚未定义!
pausenul
===============================================
对比可知,"set var="可以取消变量,收回变量所占据的内存空间。
4、结果判断
masm %1.asm
if errorlevel 1 pause edit %1.asm
link %1.obj
先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面;否则用link程序连接生成的obj文件,这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause edit %1.asm部分)。
另外,和其他两种用法一样,这种用法也可以表示否定。用否定的形式仍表达上面三句的意思,代码变为:
masm %1.asm
if not errorlevel 1 link %1.obj
pause edit %1.asm
【 for语句(循环结构) 】
for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。
1、无开关
无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:
FOR %%variable IN (set) DO command
其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。
无开关for语句举例:
===============================================
@echo off
for %%i in (a,"b c",d) do echo %%i
pausenul
===============================================
2、开关/L
含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:
FOR /L %%variable IN (start,step,end) DO command
其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。
含开关/L的for语句举例(创建5个文件夹):
===============================================
@echo off
for /l %%i in (1,2,10) do md %%i
pause
===============================================
上例将新建5个文件夹,文件夹名称依次为1、3、5、7、9。可以发现,%%i的结束值并非end的值10,而是不大于end的一个数。
3、开关/F
含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为:
FOR /F ["options"] %%variable IN (set) DO command
其中,set为("string"、'command'、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。各选项的意义参见for /f。一般情况下,使用较多的是skip、tokens、delims三个选项。
含开关/F的for语句举例:
===============================================
@echo off
echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a
echo **Options tokens ^ delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c
pause
===============================================
@echo off
echo 本文件夹里面的文件有:
for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (
if not "%%a"=="DIR" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b
)
pause
===============================================
@echo off
echo 本文件夹里面的文件有:
dirc:\file.txt
for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (
if not "%%a"=="DIR" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b
)
del c:\file.txt
pause
===============================================
对于后面的两个例子,其中options里面的delims= 是可以删除的,因为只要添加了/F开关系统就将delims的值默认为空格。
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。本例中也可以改为4,不过文件名中有空格的文件,只能显示空格以前部分
同时我们也看到了,for语句的do后面的command也是可以分行的,只需要保证command的左括号和do在同一行就可以了。
4、开关/D或/R
含开关/D或/R的for语句是与目录或文件有关的命令,一般情况下很少使用。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹,故而列举此例。
含开关/R的for语句举例(文件夹遍历):
===============================================
@echo off
setlocal enabledelayedexpansion
FOR /R d: %%i IN (.) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
pause
exit
===============================================
握了这套命令,那么你就离批处理达人不远了!
【ddwindows脚本】的内容来源于互联网,如引用不当,请联系我们修改。
网友留言: