记用BAT(批处理脚本)实现文件下载功能
windows应用场景下自动安装软件的批处理脚本
windows应用场景下自动安装软件的批处理脚本在Windows应用场景下,自动安装软件的批处理脚本批处理脚本是一种可以在Windows操作系统下自动化执行一系列命令和任务的脚本语言。
在Windows应用场景中,批处理脚本尤其适用于自动安装软件。
本文将介绍如何利用批处理脚本实现自动安装软件的步骤和示例。
一、准备工作在编写批处理脚本之前,我们需要做一些准备工作。
1. 确认软件安装文件的位置首先,我们需要确认待安装软件的安装文件所在位置。
可以是本地硬盘、网络共享文件夹或者其他存储介质。
在脚本中,我们将使用该路径来引用安装文件。
2. 了解软件的静默安装命令大部分软件都提供了静默安装的命令行参数,通过这些参数可以在安装过程中自动化完成各种设置,而无需人工干预。
我们需要查找并了解待安装软件的静默安装命令。
二、编写批处理脚本下面是一个示例批处理脚本,用于自动安装软件。
```batch@echo off <!-- 批处理命令,关闭输出 -->set installer_path="C:\Path\to\installer.exe" <!-- 软件安装文件的路径-->set install_command=%installer_path% /silent <!-- 软件的静默安装命令 -->if exist %installer_path% (echo Installing software...%install_command%echo Software installation complete.) else (echo Installer not found.)```以上脚本的执行流程如下:1. 第一行 `@echo off` 是一个特殊命令,用于关闭脚本的输出。
这样可以使脚本在执行过程中更加简洁。
2. 第二行 `set installer_path=...` 定义了一个变量 `installer_path`,用于存储软件安装文件的路径。
批处理文件BAT的命令及使用
批处理文件BAT的命令及使用bat是dos下的批处理文件。
.cmd是nt内核命令行环境的另一种批处理文件从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。
所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。
甚至有些应用程序仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全不同。
首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows 的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。
批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文件,这缘于windows系统这个新型解释平台的涉入,使得批处理的应用越来越"边缘化"。
所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动。
其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。
当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。
批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。
批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的exe文件才可以称之为c语言程序。
bat批处理文件语法
批处理文件(也称为批处理脚本)是一种用于Windows 系统的脚本文件,其文件扩展名通常为`.bat`。
批处理文件可以包含一系列命令和操作,用于自动化执行一系列任务。
以下是一些常见的批处理文件语法:1. 命令行命令:批处理文件可以包含一系列的命令行命令,这些命令将按照脚本中的顺序依次执行。
REM 这是注释,使用REM 关键字echo "Hello, World!" // 输出文本到控制台dir // 列出当前目录的文件和子目录copy file1.txt file2.txt // 复制文件2. 变量和参数:批处理文件可以使用变量和命令行参数来存储和操作数据。
set name=John // 设置变量echo %name% // 使用变量echo %1 // 使用第一个命令行参数3. 控制流语句:批处理文件支持一些基本的控制流语句,如条件语句和循环语句。
if exist file.txt (echo "File exists") else (echo "File does not exist")for %%i in (1 2 3) do (echo %%i)4. 函数和子程序:批处理文件可以定义和调用函数和子程序。
:myFunctionecho "This is my function"goto :eofcall :myFunction5. 注释:使用`REM` 或者`::` 关键字可以添加注释。
REM 这是一条注释:: 这也是一条注释上述是一些常见的批处理文件语法,可以帮助你开始编写简单的批处理脚本来执行一系列的任务。
批处理文件语法非常灵活,可以实现自动化的文件操作、系统管理等任务。
批处理文件BAT的命令及使用
批处理文件BAT的命令及使用1. echoecho命令用于在命令行窗口上显示文本或变量的内容。
用法:echo <文本>2. setset命令用于设置或显示环境变量。
用法:set <变量名称>=<值>3. ifif命令用于执行条件判断,根据条件的满足与否执行相应的操作。
用法:- 单个条件:if <条件> <命令>- 多个条件:if <条件1> <命令1> else if <条件2> <命令2> else <命令3>4. forfor命令用于循环操作,并可以对文件、文件夹、字符串等进行遍历操作。
用法:- 遍历文件/文件夹:for /r <路径> %变量 in (<通配符>) do <命令>- 数字循环:for /l %变量 in (<起始值>, <步长>, <结束值>) do<命令>5. callcall命令用于调用另一个批处理文件,并在调用完成后返回当前文件。
用法:call <批处理文件路径>6. startstart命令用于启动一个新的命令行窗口或程序,并可指定窗口标题、运行目录等选项。
用法:start <选项> <程序或文件路径>7. pausepause命令用于暂停批处理的执行,直到用户按下任意键才继续执行下一条命令。
用法:pause8. cdcd命令用于更改当前目录。
用法:cd <目录路径>9. mdmd命令用于创建一个新的目录。
用法:md <目录路径>10. deldel命令用于删除文件或文件夹。
用法:- 删除文件:del <文件路径>- 删除文件夹:del /s <文件夹路径>11. copycopy命令用于复制文件、文件夹或目录。
Windows下通过BAT执行文件下载任务
Windows下通过BAT执行文件下载任务近期为了进行备份策略的调整,需要将应用系统中部分的数据进行下载到另外搭建的备份服务器。
因备份服务器为windows,故查找相关资料和论坛上的帖子,梳理了一份适合自己系统的备份脚本(通过BAT文件执行FTP下载任务)。
详细需求为:每天到指定服务器下载名为:after"当天日期".dmp的数据库dump文件,输出脚本如下:1).ftpUser为ftp服务器的用户名:2).ftpPWD为ftp用户的密码;3).ftpIP为服务器地址;4).ftp脚本中的mget后面可以结合需求自定义下载规则。
[plain] view plain copyprint?1.@echo off2.rem Set User Name for Login to FTP Server3.set ftpUser=<USERNAME>4.5.rem Set Password for the FTP User6.set ftpPWD=<PASSWORD>7.8.rem Set the FTP Server IP9.set ftpIP=10.10.6.11110.11.rem Set the RemoteFolder Path12.set RemoteFolder=/app/backup13.14.rem Set LocalFolder Path15.set LocalFolder=D:\DataBackup16.17.rem Get Date For File Name18.nowDate=%date:~0,4%%date:~5,2%%date:~8,2%19.20.rem Define the ftp Command Scripts21.set ftpcmd=%LocalFolder%\1_Scripts\ftp1.txt22.> "%ftpcmd%" (23.echo user %ftpUser% %ftpPWD%24.echo cd "%RemoteFolder%"25.echo lcd "%LocalFolder%"26.echo bin27.echo mget after%nowDate%.dmp*28.echo bye29.)30.@echo on31.32.rem Start Download Files use the Command File. If yo u want Start a new CMD Session to run it, Use "start " before "ft p"33.ftp -n -i -s:"%ftpcmd%" %ftpIP% >%LocalFolder%\log.txt34.35.del %ftpcmd%36.pause。
bat .run命令使用方法
BAT (.run) 命令使用方法随着计算机技术的不断发展,批处理文件(或称BAT文件)成为了计算机操作中不可或缺的一部分。
BAT文件是一种文本文件,其中包含了一系列用于执行命令的代码。
在Windows操作系统中,可以使用.bat文件扩展名来命名批处理文件。
而在Unix系统中,通常使用.sh扩展名。
BAT命令是一种可以简化计算机操作的命令行工具。
通过编写BAT文件,用户可以在其中包含一系列的命令,以便一次性运行多个命令。
这种方式不仅可以提高工作效率,还可以避免重复性的操作和减少输入错误。
本文将介绍BAT命令的使用方法,帮助读者更好地掌握BAT文件的编写和运行。
一、编写BAT文件的基本步骤编写BAT文件的基本步骤如下:1. 打开文本编辑器。
可以使用Windows自带的记事本或其他文本编辑器,如Notepad++等。
2. 编写批处理命令。
在文本编辑器中输入需要执行的命令,每个命令占据一行。
3. 保存文件。
将文件保存为.bat格式,文件名可以任意命名,但需要以.bat结尾。
二、BAT文件的基本语法BAT文件的基本语法包括:1. 注释:可以在BAT文件中添加注释,以“REM”开头,后面跟着注释内容。
注释可以帮助他人理解和阅读代码,但不会被计算机执行。
2. 命令:可以在BAT文件中添加需要执行的命令,每个命令占据一行。
3. 变量:可以在BAT文件中定义和使用变量,以“SET”命令开头,后面跟着变量名和值。
三、BAT文件的常用命令BAT文件中可以包含各种Windows命令和程序的调用,常用的命令包括:1. 文件操作:包括复制文件、移动文件、删除文件等。
2. 目录操作:包括创建目录、删除目录、切换目录等。
3. 系统命令:包括运行程序、关闭程序、修改环境变量等。
4. 循环和条件:可以在BAT文件中使用循环和条件语句,实现复杂的逻辑处理。
四、BAT文件的运行方法BAT文件的运行方法包括:1. 双击运行:可以直接双击BAT文件来执行其中的命令。
清理垃圾bat
清理垃圾bat介绍清理垃圾bat是一个用于批处理脚本的工具,可以帮助用户轻松清理计算机上的垃圾文件。
垃圾文件是指那些在计算机上没有实际用途的临时文件、缓存文件、日志文件等。
这些文件会占用计算机的存储空间,降低计算机的性能。
清理垃圾bat会扫描计算机上的指定目录,并删除这些垃圾文件,从而提升计算机的性能。
安装清理垃圾bat是一个批处理脚本,不需要进行安装。
只需要将bat文件下载到计算机上即可开始使用。
使用方法使用清理垃圾bat非常简单。
只需要执行bat文件即可开始清理垃圾文件。
步骤如下:1.下载清理垃圾bat文件到计算机上。
**********************:your-username/c lean-junk.bat.git2.双击运行clean-junk.bat文件。
运行清理垃圾bat运行清理垃圾bat3.程序会提示输入要清理的目录。
输入要清理的目录,并按下回车键。
输入要清理的目录输入要清理的目录4.清理垃圾bat会开始扫描指定目录,并删除垃圾文件。
清理垃圾文件清理垃圾文件5.清理完成后,程序会显示清理了多少个文件,并提示清理操作已完成。
清理完成清理完成功能特点清理垃圾bat具有以下功能特点:•批处理脚本:清理垃圾bat是一个批处理脚本,可以在Windows操作系统上直接运行。
•用户友好:清理垃圾bat使用简单,只需要输入要清理的目录即可开始清理垃圾文件。
•清理目录可选:用户可根据需要选择要清理的目录,以便更加精确地清理垃圾文件。
•高效:清理垃圾bat会扫描指定目录下的所有文件,并删除那些被认定为垃圾文件的文件。
这可以帮助用户快速清理计算机上的垃圾文件,提升计算机的性能。
注意事项使用清理垃圾bat时需要注意以下事项:•谨慎选择要清理的目录:清理垃圾bat会删除指定目录下的所有垃圾文件。
因此,在运行清理垃圾bat之前,请仔细选择要清理的目录,并确保目标目录中仅包含要清理的垃圾文件。
•数据丢失风险:由于清理垃圾bat会删除文件,因此请确保要清理的目录中不包含任何重要的文件。
BAT批处理脚本教程
BAT批处理脚本教程1.BAT脚本的基本语法一个最简单的BAT脚本如下所示:```echo Hello, World!pause```2.变量和参数在 BAT 脚本中,可以使用变量来存储和操作数据。
变量的定义使用`set` 命令,如下所示:```set variable_name=value```使用变量的值时,需要使用 `%` 符号将变量名括起来,如`%variable_name%`。
脚本可以通过命令行参数接收外部传递进来的值。
使用`%n`表示第n 个参数,其中n是从1开始的整数。
3.控制流语句控制流语句用于根据条件执行不同的命令。
常用的控制流语句有`if` 和 `for`。
`if` 语句可以根据条件执行不同的命令块。
使用语法如下:```if conditionelse````for` 语句用于循环执行命令块。
使用语法如下:``````4.文件和文件夹操作BAT 脚本可以通过命令执行文件和文件夹的操作。
常用的文件和文件夹操作命令有 `copy`、`del`、`mkdir`、`rmdir`等。
`copy` 命令用于复制文件,语法如下:```copy source_file destination_file````del` 命令用于删除文件,语法如下:```del file````mkdir` 命令用于创建文件夹,语法如下:```mkdir folder````rmdir` 命令用于删除文件夹,语法如下:```rmdir folder```5.实例以下是一个简单的BAT脚本示例,用于批量重命名文件夹中的文件:```setlocal enabledelayedexpansionset folder_path=C:\Path\To\Folderset new_name=NewNamefor %%f in (%folder_path%\*) doset "filename=%%~nf"ren "%%f" "!filename:%folder_path%=%new_name%!"echo Done!pause```该脚本首先定义了要操作的文件夹路径和新名称。
bat 操作手册
bat 操作手册`bat` 是一个用于处理批处理文件的命令行工具,它提供了一种更简洁、易读的方式来编写批处理脚本。
以下是 `bat` 的操作手册,介绍了如何使用`bat` 命令以及其支持的各种语法和功能。
1. 基础语法基本语法如下:```phpbat <script_file>```其中 `<script_file>` 是包含批处理命令的脚本文件。
2. 命令行参数`-i`:交互模式,允许用户与脚本进行交互。
`-e`:执行脚本中的命令。
`-o`:将输出重定向到文件。
`-q`:安静模式,不显示命令的输出。
`-v`:详细模式,显示更详细的输出信息。
`-l`:限制执行的命令行长度。
3. 命令行参数的使用示例:将脚本中的输出保存到文件:```bashbat -o```4. 注释使用 `REM` 或 `::` 进行注释。
例如:```batchREM 这是一个注释:: 这也是一个注释```5. 变量和环境变量使用 `%variable%` 的形式定义变量。
例如:`set name=John`。
使用 `!variable!` 的形式访问变量的值。
例如:`echo %name%` 将输出"John"。
使用 `%PATH%` 等访问环境变量。
6. 控制结构`if`:条件语句。
例如:`if %name%==John echo Hello, John!`。
`for`:循环语句。
例如:`for %%i in (1 2 3) do echo %%i` 将输出 "1"、"2" 和 "3"。
`goto`:跳转语句。
例如:`goto :label` 将跳转到名为 "label" 的标签处。
`exit`:退出脚本。
例如:`exit /b` 将立即退出脚本,不关闭命令行窗口。
`call`:调用另一个脚本或函数。
经典bat批处理范例
经典bat批处理范例批处理脚本(通常以`.bat` 为扩展名)是在Windows 操作系统中运行的脚本文件,用于执行一系列命令。
以下是一个简单的经典批处理脚本范例,演示了一些常见的操作,如用户输入、条件语句、循环等。
```batch@echo offREM 这是一个经典的批处理脚本范例REM 获取用户输入set /p username=请输入您的用户名:REM 显示欢迎消息echo 欢迎, %username%! 这是一个经典批处理脚本。
REM 显示当前日期和时间echo 当前日期和时间: %date% %time%REM 检查操作系统版本verREM 使用条件语句if "%username%"=="admin" (echo 你是管理员用户。
) else (echo 你不是管理员用户。
)REM 使用循环set count=1:loopecho 这是第%count% 次循环。
set /a count+=1if %count% leq 5 goto loopREM 暂停以便查看输出pause```这个批处理脚本执行以下操作:1. 获取用户输入用户名。
2. 显示欢迎消息和当前日期时间。
3. 检查操作系统版本。
4. 使用条件语句检查用户是否为管理员。
5. 使用循环输出消息多次。
6. 最后,通过`pause` 命令使脚本暂停,以便用户查看输出。
请注意,批处理语法相对简单,但也有一些限制和注意事项。
在更复杂的情况下,可能需要考虑使用其他脚本语言或编程语言。
批处理bat详细教程 完整版
一、交互界面设计没啥说的,看看高手设计的菜单界面吧:@echo offclstitle 终极多功能修复:menuclscolor 0Aecho.echo ==============================echo 请选择要进行的操作,然后按回车echo ==============================echo.echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站echo.echo 2.病毒专杀工具,端口关闭工具,关闭自动播放echo.echo 3.清除所有多余的自启动项目,修复系统错误echo.echo 4.清理系统垃圾,提高启动速度echo.echo Q.退出echo.echo.:choset choice=set /p choice= 请选择:IF NOT "%choice%"=="" SET choice=%choice:~0,1%if /i "%choice%"=="1" goto ipif /i "%choice%"=="2" goto setsaveif /i "%choice%"=="3" goto kaijiif /i "%choice%"=="4" goto cleanif /i "%choice%"=="Q" goto enddecho 选择无效,请重新输入echo.goto cho只要学完本教程前面的章节,上面的程序应该能看懂了。
二、if…else…条件语句前面已经谈到,DOS条件语句主要有以下形式IF [NOT] ERRORLEVEL number commandIF [NOT] string1==string2 commandIF [NOT] EXIST filename command增强用法:IF [/I] string1 compare-op string2 command增强用法中加上/I就不区分大小写了!增强用法中还有一些用来判断数字的符号:EQU - 等于NEQ - 不等于LSS - 小于LEQ - 小于或等于GTR - 大于GEQ - 大于或等于上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。
BAT批处理命令使用实用教程
BAT批处理命令使用实用教程BAT批处理命令是Windows操作系统自带的一种脚本语言,通过编写批处理脚本可以实现一系列自动化的操作,提高工作效率。
本教程将介绍BAT批处理命令的常用语法和实用技巧,帮助读者快速掌握BAT批处理命令的应用。
一、基本语法1.注释:在批处理脚本中,可以使用REM关键字添加注释,注释内容将被忽略。
示例:REM这是一个注释2.变量:在批处理脚本中,可以使用变量来保存值。
变量名以一个英文字母开头,后续可以有字母、数字和下划线。
示例:SET name=JohnECHO %name%3.输入输出:使用ECHO命令可以在屏幕上输出文本,使用SET/P命令可以从用户处输入值。
示例:ECHO HelloSET /P name=Please enter your name:4.条件判断:使用IF命令可以根据条件执行不同的操作。
示例:IF %num% EQU 1ECHO The number is 1ELSEECHO The number is not 15.循环:使用FOR命令可以实现循环操作,常用的有FOR/F和FOR/R。
示例:FOR /F %%G IN (file.txt) DOECHO%%G二、实用技巧1.执行命令:使用CALL命令可以执行其他批处理脚本或外部命令。
示例:CALL script.batCALL dir2.文件操作:使用COPY命令可以复制文件,使用DEL命令可以删除文件。
示例:COPY file1.txt file2.txt3.目录操作:使用CD命令可以切换目录,使用MKDIR命令可以创建目录。
示例:CD C:\pathMKDIR new_dir4.网络操作:使用PING命令可以测试网络连接,使用NET命令可以管理网络。
示例:NET USE \\server\share5. 系统信息:使用VER命令可以查看Windows版本,使用TIME和DATE命令可以查看当前时间和日期。
BAT文件常用代码大全
BAT文件常用代码大全BAT文件是Windows操作系统中常用的批处理文件,它可以用来批量执行一系列的命令,从而实现自动化的操作。
在BAT文件中,常用的代码有很多种,包括文件操作、系统管理、网络操作等等。
本文将为大家介绍BAT文件常用代码大全,希望对大家有所帮助。
一、文件操作。
1. 创建文件夹。
在BAT文件中,可以使用mkdir命令来创建文件夹。
例如:mkdir new_folder。
2. 复制文件。
使用copy命令可以实现文件的复制操作。
例如:copy file1.txt file2.txt。
3. 删除文件。
使用del命令可以删除文件。
例如:del file.txt。
4. 移动文件。
使用move命令可以实现文件的移动操作。
例如:move file1.txt folder1。
5. 重命名文件。
使用ren命令可以实现文件的重命名操作。
例如:ren file1.txt new_file.txt。
二、系统管理。
1. 关闭计算机。
使用shutdown命令可以实现关闭计算机的操作。
例如:shutdown /s /t 0。
2. 重启计算机。
使用shutdown命令也可以实现重启计算机的操作。
例如:shutdown /r /t 0。
3. 注销用户。
使用shutdown命令还可以实现注销用户的操作。
例如:shutdown /l。
4. 查看系统信息。
使用systeminfo命令可以查看系统的详细信息。
例如:systeminfo。
5. 清理磁盘空间。
使用cleanmgr命令可以清理磁盘空间。
例如:cleanmgr。
三、网络操作。
1. Ping命令。
使用ping命令可以测试网络连接。
例如:ping 。
2. 显示IP配置。
使用ipconfig命令可以显示网络的IP配置信息。
例如:ipconfig。
3. 显示路由表。
使用route命令可以显示网络的路由表信息。
例如:route print。
4. 显示网络连接。
使用netstat命令可以显示网络的连接信息。
bat for 用法 -回复
bat for 用法-回复[Bat使用方法]Bat是一种批处理文件,也称为批处理脚本或批处理程序。
它是一种由批处理命令组成的文本文件,用于自动执行一系列命令或操作。
Bat文件可以用于在Windows操作系统上执行各种任务,包括自动化任务、设置环境变量、配置系统设置等等。
本文将详细介绍Bat文件的使用方法,并提供一些常用技巧和示例。
第一步:创建一个Bat文件首先,打开任何文本编辑器,如记事本或Notepad++等。
现在,我们可以开始编写我们的第一个Bat文件。
在Bat文件的开头,可以使用“@echo off”命令来关闭命令提示符窗口的命令回显。
下面是一个简单的例子:@echo offecho Hello Worldpause在这个例子中,第一行“@echo off”用于关闭命令提示符窗口中的命令回显。
第二行“echo Hello World”用于输出Hello World文本。
第三行“pause”用于暂停执行,直到用户按下任意键。
第二步:保存Bat文件保存Bat文件非常简单。
只需要将文件另存为纯文本格式,并使用".bat"作为文件扩展名。
确保文件名不包含任何特殊字符或空格。
例如,将上述示例保存为"hello.bat",然后选择保存位置即可。
第三步:运行Bat文件完成Bat文件的编写和保存后,可以直接运行它。
只需双击该文件,系统将自动打开一个命令提示符窗口,并开始执行Bat文件中的命令。
同样,也可以通过命令行界面手动运行Bat文件。
打开命令提示符窗口,然后使用Bat文件的完整路径来执行它。
例如,如果Bat文件在C:\目录下的hello.bat中,可以通过输入“C:\hello.bat”来运行它。
第四步:Bat文件的基本命令和语法Bat文件支持许多命令和语法,用于实现各种功能。
以下是一些常用的命令和语法示例:1. 注释:在Bat文件中,可以使用“REM”命令来添加注释。
记用BAT(批处理脚本)实现文件下载功能
记用BAT(批处理脚本)实现文件下载功能.txt如果青春的时光在闲散中度过,那么回忆岁月将是一场凄凉的悲剧。
杂草多的地方庄稼少,空话多的地方智慧少。
即使路上没有花朵,我仍可以欣赏荒芜。
[组图]记用BAT(批处理脚本)实现文件下载功能热荐【字体:小大】闲来无事之--记用BAT(批处理脚本)实现文件下载功能作者:ZV(ZVROP…文章来源: 点击数:4864 更新时间:2004-8-19作者:ZV(ZVROP)邮件:zvrop@主页:(被整顿掉老~~~~~>_<~~~~~~)网站:日期:2004-8-18转载请保全文档完整,谢谢写的仓卒繁多,错漏难免,还请各位给予斧正.有什么问题,可以给我发email.^_^...目录:一.写在前面的话二.故事的起因三.解决-腹稿四.解决-实战五.解决-打造六.包装七.小节八.后记九,参考文献正文开始:一.写在前面的话这篇文档讲述的并不是什么新鲜的技术,我只是起到将他们混和起来实现了自己需要的功能的作用,如果你对批处理和PE格式相当了解,那我的这篇文档就权且当作浏览温习吧...^_^...另外,由于我本人废话比较多,这也是不想给杂志写稿子的主要原因,给我干瘪瘪的3000字能讲出什么来,不如这样没有限制的爽快(当然也没什么报酬...一_一..),所以也为了防止你在看文章的途中睡着,请自备小锥子一把.....最后,这篇文档说是用批处理下载文件,其实它包含了很多方面的知识,如果有时间,不妨一看哈,^_^,开始买瓜了..二.故事的起因最初萌发这个想法的是不久前,在论坛(广告一下:)上的UNIX SHELL板块有个会员发了一篇帖子,内容是用BASH SHELL写的一个成批下载图片的脚本(其实是H图片...一_一..),接下来跟贴那个多啊...,有繁衍出PHP的,VBS的,C的,C#的,JAVA的,甚至交流到多线程,断点续传....引用花大哥的一句话"无语,为了MM照片,大家的动力都很足啊!"...汗~~..在发了一份PHP和C的代码后(感觉我动力特足~大色狼...一_一..),觉得很简单(因为用C 或者PHP等脚本来实现文件的下载本来就是很基础的东西)我就开始想用微软最原始的脚本--Batch(批处理)来尝试实现(本文标题中的"闲来无事"就是纪念此处,一_一.),这似乎有点不可思议,因为批处理几乎没有实现的支持网络的功能(当然,如果你说你能用TELNET下载到文件的我是很佩服的..一_一..),但也不是完全没有办法,毕竟WINDOWS里面能用的东西这么多,没有完不成的事情....在这种挑战的勾引下,我完成了用批处理下载文件的功能....现在让我一步一步回放我的思路,揭开用批处理下载文件的奥秘...三.解决-腹稿如果用批处理来下载文件的话,肯定会马上想到Cscript脚本(或者是JAVA脚本),那是当然,太多的批处理脚本实现一些本身并不可能实现的功能的时候都是采用ECHO出一个其他脚本的方法来解决.可是我们的目的就在于用批处理实现下载的功能,如果要用VBS来帮忙的话不如直接写VBS了.这个想法顺即告吹....再来,记得以前有流行过一阵用RUNDLL32来加载DLL中的API,似乎和我们需要的目的沾边,因为下载文件能用的API太多了,如果RUNDLL能调用,那最好不过了.于是我打开MSDN,找了一个API: URLDownloadToFileURLDownloadToFile函数原型:代码HRESULT URLDownloadToFile(LPUNKNOWN pCaller,LPCTSTR szURL,LPCTSTR szFileName,DWORD dwReserved,LPBINDSTATUSCALLBACK lpfnCB);URLDownloadToFile函数的一些信息:引用Header Urlmon.hImport library Urlmon.libMinimum availability Internet Explorer 3.0Minimum operating systems Windows NT 4.0, Windows 95根据这些,我们可以知道,这个API是在URLMON.DLL文件中的一个导出函数,简单的实现了把一个文件从WEB服务器下载本机的功能,其实用这个函数还不错的,至少它帮我们处理了断点续传,缓存等等的功能,比起直接使用SOCKET函数来实现或者用WININET里的函数来实现简单多得多了.URLDownloadToFile有五个参数:第一个参数是仅当调用者是一个ActiveX对象才使用,一般为NULL.第二个参数就是要下载文件的目标URL,完整路径.第三个是本地保存路径,也是完整路径第四个是保留,必须为0第五个是指向一个IBindStatusCallback接口的指针,这就类似一种回调机制,你可以参考这些来活动当前下载进度,选择是否继续下载等等.这里面我们只关心第二和第三个参数.其他的通通设置成0.(当然你写C的时候最好设置为NULL)嗯,敲了点键盘介绍了这个函数,是因为整篇的文档都和这个函数息息相关,有了这个函数,就可以呼叫RUNDLL32来调用它,但是很可惜,这个美好的计划马上也破裂了...我去微软看了他们的164787号文档(/default.aspx?...kb;en-us;164787),该文档阐述了RUNDLL32的调用方式和能被他调用的函数的格式:它们是这么说的:引用Rundll and Rundll32 programs do not allow you to call any exported function from any DLL. For example, you can not use these utility programs to call the Win32 API (Application Programming Interface) calls exported from the system DLLs. The programs only allow you to call functions from a DLL that are explicitly written to be called by them.这个是规定的格式:代码void CALLBACKEntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);很不幸,我们的URLDownloadToFile小兄弟并没有符合这些条件,被RUNDLL32无情的抛弃了(汗一滴..)...但是我们并没有因此而嫌弃它(汗一滴AGAIN..),毕竟,在后来实现的过程里,它是为我们的工作省下了不少功夫.到此,用RUNDLL32运行计划流产....(寒...)想了一根烟功夫,现在URLDownloadToFile有了,怎么才能调用这个函数呢?总不能模仿汇编PUSH 5个参数进栈,然后CALL吧,那这个函数的地址还要用LoadLibrary()和GetProcAddress()计算得来,那这两个函数的地址.....还是放弃...等等,如果用一个EXE来实现的话就简单很多了(至少EXE是不需要任何解释器的),对,写一个EXE来下载文件.可我们的目的是用BAT来下载呢,BAT文件能包裹EXE的数据吗?答案是肯定的...往下看..记得以前看过一篇文档<<Do All in Cmd Shell>>里面介绍过一种方法.先卖个关子.大家都知道,如果用ECHO加上重定向符来写文件的话,只能写入ASCII的一部分,也就可以显示出来的那些ASCII(也就是ASCII值小于128的那些),对于那些无法显示的字符就没有办法了.但是这让我们想起一个工具,一个微软历史上同样古老的,批处理的兄弟--DEBUG!现在思路清晰了:可以让批处理把ECHO不能显示的字符转化为16进制数据(比如EXE中的那些数据)保存在批处理中,然后用DEBUG写道文件里,最后用BAT调用生成的EXE,下载文件!(想完了这里,我感觉还是太麻烦,不知道哪位牛人对这个实现还有什么更加简单的办法吗??)四.解决-实战倘若就此编写一个可下载文件的EXE,然后直接用BAT包裹,定然会被同行耻笑,不单是因为那几千个字节的数据拖着大大臃肿的BAT文件,更加让为这种简单的想法立刻现形,为了不达到这些负面效果,也为了让这篇文档不至于干瘪瘪的让人感觉没什么看头(事实上是因为早些时候看过watercloud的一篇大作感悟颇深),我决定手工写一串16进制代码来代替机器编译的EXE.既美观了界面,又增强了技术性.....(一_一...简直是在卖作...)现在当务之急是要一个可以下载文件的EXE程序,实现这个目标只要一个URLDownloadToFile 即可,放在最后实现,先来写一个PE框架:大家都知道PE文件的格式吧,不懂的就去看看那个著名的电信黑客罗某某的书.(Who!?...~)先给出我们的PE框架,基于XP的FileAlignment对齐大小最小就支持到0x200(也就是10进制的512字节,以下有在前面加上0x的都表示16进制数值),我们的框架就打出512字节(注意,我下面留有空白表示各个PE部分,结合下面的文档,大家方便理解),这个框架里没有任何的代码或者数据:(ZV友情提示:下面是最枯燥的部分,各位手握锥子,要有一不怕苦,二不怕痛的精神看完它....)(如果定力不高的朋友,或者堆PE文件再熟悉不过的朋友,可以字节转到"JMP S1"处往下看.) (如果只想知道到底怎么回事,或者对这篇作文报浏览态度的朋友,可以直接转到"JMP S2"处继续浏览)(睡着了的继续睡觉....)代码Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F00000000 4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 MZ.............. 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 ............@...==============================================================================00000040 50 45 00 00 4C 01 02 00 00 00 00 00 00 00 00 00 PE..L........... 00000050 00 00 00 00 70 00 0F 010B 01 00 00 00 02 00 00 ....p........... 00000060 00 00 00 00 00 00 00 00 79 01 00 00 00 00 00 00 ........y....... 00000070 00 00 00 00 00 00 40 00 00 10 00 00 00 02 00 00 ......@......... 00000080 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 ................ 00000090 00 30 00 00 00 02 00 00 00 00 00 00 02 00 00 00 .0.............. 000000A0 00 01 00 00 00 00 00 00 00 01 00 00 00 10 00 00 ................ 000000B0 00 00 00 00 02 00 00 0000 00 00 00 00 00 00 00 ................ 000000C0 28 11 00 00 28 00 00 00==============================================================================00 00 00 00 00 00 00 00 (...(........... 000000D0 00 02 00 00 00 10 00 00 00 02 00 00 00 01 00 00 ................ 000000E0 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 60 ............`..` 000000F0 00 00 00 00 00 00 00 00 02 00 00 00 00 20 00 00 ............. .. 00000100 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000110 00 00 00 00 60 00 00 60 00 00 00 00 00 00 00 00 ....`..`........00000120 58 11 00 00 00 00 00 00 50 11 00 00 00 00 00 00 X.......P....... 00000130 00 00 00 00 6E 11 00 00 20 11 00 00 00 00 00 00 ....n... ....... 00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000150 58 11 00 00 00 00 00 0000 00 00 00 00 00 00 00 ................ 00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................这里简单介绍一下PE文件格式的组成:大致来分呢,PE格式文件可以分为这三个部分(就是上述框架中用"=="分割的三个部分): 引用+++++++++++++++++++++++++DOS信息部分 ++++++++++++++++++++++++++++++++++++++++++++++++++PE信息部分 ++++++++++++++++++++++++++++++++++++++++++++++++++数据部分 +++++++++++++++++++++++++下面来简单介绍每一部分的结构,首先的"DOS信息部分":引用++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++ ++ +[DOS文件头][0x40] + ++ +++++++++++++++++++++++++++++++++++++++ ++ + <==DOS信息部分+ +++++++++++++++++++++++++++++++++++++++ ++ +[DOS块][0x70,可变] + ++ +++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++这部分我觉得是最冗余的地方,首先DOS文件头的结构:代码typedef struct _IMAGE_DOS_HEADER { // DOS .EXE headerWORD e_magic; // Magic numberWORD e_cblp; // Bytes on last page of fileWORD e_cp; // Pages in fileWORD e_crlc; // RelocationsWORD e_cparhdr; // Size of header in paragraphsWORD e_minalloc; // Minimum extra paragraphs neededWORD e_maxalloc; // Maximum extra paragraphs neededWORD e_ss; // Initial (relative) SS valueWORD e_sp; // Initial SP valueWORD e_csum; // ChecksumWORD e_ip; // Initial IP valueWORD e_cs; // Initial (relative) CS valueWORD e_lfarlc; // File address of relocation tableWORD e_ovno; // Overlay numberWORD e_res[4]; // Reserved wordsWORD e_oemid; // OEM identifier (for e_oeminfo)WORD e_oeminfo; // OEM information; e_oemid specificWORD e_res2[10]; // Reserved wordsLONG e_lfanew; // File address of new exe header} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;其中最重要的就是e_lfanew,它指向了下面的"PE信息部分"的起始地址(也就是俗称的PE头部).其他的是一些DOS下运行这个PE文件必须的结构,比如看注解就明白,什么代码初始化堆栈段,初始化堆栈指针,入口IP,CS等等,都是在WIN32上没有用的东西,我就不翻译拉,这些都是说DOS下的,如果这个PE文件一开始就打定在WINDOWS下运行,这些乱写都无所谓,你甚至可以把你的名字都写进去(.....一_一..).当然,你这么作后这个文件就不能在DOS下运行了..不然当机是几乎可以肯定的....(寒....).需要记的除了e_lfanew是指向PE头的指针外还要记得这个DOS文件头结构长0x40,也就是64个字节.还有第一个参数e_magic,这个地方永远是"0x40 0x5a",也就是字符的"MZ".DOS块部分保存的就是一段DOS下可以执行的代码,比如现在大多编译器就简单的输出一个"This program cannot be run in DOS mode"的字符串,和"DOS信息部分"一样,如果你不打算在DOS执行这个EXE文件,那么这里完全可以删除,为什么?因为WIN32的PE装载器只关心"DOS信息部分"的e_lfanew指向的而已.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++。
BAT批处理全自动(静默)安装软件的方法(包含4种常见安装包格式)
BAT批处理全⾃动(静默)安装软件的⽅法(包含4种常见安装包格式)利⽤批处理安装常⽤软件,我们需要对以下⼏个知识点进⾏掌握:⼀.常⽤应⽤软件的封装类型:1.installshield型:installshield是⼀款商业级别的安装程序封装⼯具,许多⼤型商业软件都⽤它进⾏封装.例如:macromedia flash. pgtoshop等安装参数:-R ⽤于记录安装过程-s ⽤于进⾏软件的⾃动安装-f1 指定setup.iss应答⽂件的路径使⽤⽅法:1).先⽤在命令⾏下⽤-R参数进⾏软件的安装,其安装过程与正常安装没有本质的区别,但在软件安装结束后可以在c:\windows(winxp系统)或c:\winnt(win2k系统)⽬录下找到⼀个名为setup.iss的⽂件,它就是我们后⾯要⽤到的可以进⾏⾃动安装的重要应答⽂件.2).将以上的setup.iss⽂件与你的安装程序放在同⼀⽬录下,利⽤-s参数进⾏全⾃动安装.例如: start /wait x:\phtoshop\setup.exe -s -f1 "y:\setup.iss"(如果setup.iss⽂件与安装程序在同⼀⽬录,可以省去-f1参数)2.Inno setup 类型:Inno setup 是⼀款完全免费的安装程序封装⼯具,其功能和稳定性均可与商业封装⼯具媲美.安装参数: /silent(/verysilent) ⽤于软件的⾃动安装sp- ⽤于跳过安装程序的确认界⾯使⽤⽅法: start /wait x:\thunder5.exe /verysilent sp-说明:此安装参数的使⽤⽐较容易,但如果我们把它写⼊到批处理⽂件中进⾏⼤量的软件安装时,有的软件会在安装完成后⾃⾏启动,⽐如迅雷,为不影响系统性能,我们可以结合其他的命令终⽌其进程,例如:复制代码代码如下:@echo offstart /wait x:\thunder5.exe /verysilent sp-echo.taskkill.exe /F /IM Thunder5.exe3.Microsoft Windows Installer技术打包程序微软⾃家产品,许多软件⽣产⼚家现在都选择这种基于微软开发的封装⽅式参数:/ /QB(/QN)⽤于⾃动安装软件/REBOOT=suppress 安装后不重起使⽤⽅法: start /wait x:\setup.exe /QB REBOOT=Suppress4.Nullsoft SuperRMP Install System (NSIS)类型,例如:winamp使⽤参数: /S ⽤于⾃动安装软件例如: x:\winamp\setup.exe /S说明:此类软件安装后会给出⼀个⽂件关联确认窗⼝,⽬前⽆法跳过,但我可以给⼤家⼀个思路,就是结合VBS脚本中的Doskey命令来模仿键盘动作实现确认过程,到现在为⽌我个⼈还没有写出来,望⾼⼿帮忙完善⼆.测试⽅法与安装类型分析:1.测试⽅法:可以⽤⽬前⽐较流⾏的虚拟机进⾏测试2.安装类型分析:⼤部分安装程序可以通过⿏标右击安装程序___选择属性 ________版本来查看其封装类三.在批处理⽂件中的要求如果你打算⾃⼰结合WINXP光盘⼯具重新封装安装光盘,并且在利⽤winxp应答⽂件安装应⽤软件,你必须明⽩批处理⽂件的位置应防在那⾥,这些你可以去阅读有关此⽅⾯的⽂章.。
批处理bat文件实现复制、删除、创建文件夹、执行程序、打开文件
批处理bat文件实现复制、删除、创建文件夹、执行程序、打开文件.txt师太,你是我心中的魔,贫僧离你越近,就离佛越远……初中的体育老师说:谁敢再穿裙子上我的课,就罚她倒立。
批处理bat文件实现复制、删除、创建文件夹、执行程序、打开文件。
txt如果你看到面前的阴影,别怕,那是因为你的背后有阳光!我允许你走进我的世界,但绝不允许你在我的世界里走来走去。
1 建bat文件自动执行复制,删除命令。
例1:以下是复制cd.dll文件至windows\system32的bat文件内容:copy cd。
dll %windir%\system32例2:下面一行是卸载windows\system32目录中的cd.dll,即把上面复制的文件删除:del %windir%\system32\cd.dll例3:删除download文件夹中的文件,例子如下:del C:\DOWNLOAD\*。
*[注意]:这里的del命令只能删文件,不能删文件夹。
要删除文件夹得用rd命令,如下:rd Filemon这里filemon文件夹和该bat文件在同一目录下,就省去具体路径了.但rd只能删除空文件夹。
要删除文件夹及其里面的所有子目录和文件,用rd命令带/s /q参数,/s参数表示删除该文件夹及其下面的子目录和文件/q参数表示,不需要确认范例如下:rd 123 /s /q2 创建文件夹例:在E:\My documents下面一次创建3个新文件夹:Newfolder1,Newfolder2,Newfolder3@echo offmd ”E:\My documents\Newfolder1”md "E:\My documents\Newfolder2”md ”E:\My documents\Newfolder3"3 执行程序,打开文件例1:执行C盘下的WinWord.exe程序start C:\WinWord。
exe例2:用某个程序打开某个文件,如用TheWorld。
在windows上用bat自动拉取服务器上的文件
如果远程机器开了ftp服务,那么可以在win上用ftp命令拉取。
脚本如下FTP.bat:路径写在bat文件中,可以支持中文路径@echo off:记载每次执行的年月日到一个日志文件中 可以自行修改echo %date:~0,10%>>D:\Win7系统文件夹\Desktop\工作\日常检查\日志归档\我用的FTP\v1.1\ftp.log:进入D盘 cmd中的固定写法 必须先进入D盘才能进入到D盘下面的目录D::进入到D盘的某个目录 此处将作为ftp获取文件后的默认目录cd D:\Win7系统文件夹\Desktop\工作\日常检查\日志归档:ftp命令 参数引用ftp.txtftp s:D:\Win7系统文件夹\Desktop\工作\日常检查\日志归档\我用的FTP\v1.1\ftp.txt>>D:\Win7系统文件夹\Desktop\工作\日常检查\日志归档\我用的FTP\v1.1\ftp.log:退出exitftp.txt的内容如下 红色部分为注释 请删除prompt off关闭交互模式open 133.64.94.99连接到哪台机器oracle用户名Pdh2_ab密码cd /home/oraclemget sun_check_*log*批量获取sun_check_*log*格式的文件 *为通配符mdelete sun_check_*log*批量删除sun_check_*log*格式的文件 如果只删除一个文件 并知道具体文件名的话 也可以用delete命令 语法相同 但是delete命令只支持一次删一个 且不支持通配符close关闭该连接bye退出FTP模式如果有多台机器需要操作 则在txt文件中重复open到close的内容有些远程机器仅打开了sftp服务 win上并不支持该命令 此时想要达到童谣的目的,则需要安装winscp官档为https:///eng/docs/lang:chs 此软件免费 直接下载安装即可 中途一直下一步 和安装一个QQ一样简单 我安装的路径在 d:\Program Files\WinSCP新建一个sftp.bat文件 内容如下D:cd d:\Program Files\WinSCPwinscp.exe /console /command "option batch continue" "option confirm off" "option transfer binary" /script=D:\Win7系统文件夹\Desktop\工作\日常检查\日志归档\winscp\sftp.txt /log=D:\Win7系统文件夹\Desktop\工作\日常检查\日志归档\sftp.log:command后面跟的是所有使用到的命令参数每个参数用双引号引起来 以空格隔开 option batch continue默认批处理 option confirm off 关闭提示信息 option transfer binary使用二进制格式传送:script=后面跟的是txt文件位置 此参数可省略 把相关参数以命令的形式全部写在bat里 但是这样的话就必须全部写在一行里 看起来比较长 也比较费事 格式如winscp.exe /console /command "option batch continue" "option confirm off" "open sftp://user:pwd@ip:port" "option transfer binary" "put D:\需要上传的文件路径 /服务器文件存放目录" "exit" /log=:/log=输出log所在的位置:如果上面用到了txt配置参数 如我这里 则新建sftp.txt 内容如下open sftp://oracle:Pdh2_ab@133.64.94.99 hostkey=*get /home/oracle/sun_check_*log* D:\Win7系统文件夹\Desktop\工作\日常检查\日志归档\rm /home/oracle/sun_check_*log*参照FTP的txt相信能看懂 如果有多台机器 重复你需要的内容即可sftp第一次连接服务器的时候会提示你输入y确认key信息,否则连接失败。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
记用BAT(批处理脚本)实现文件下载功能.txt如果青春的时光在闲散中度过,那么回忆岁月将是一场凄凉的悲剧。
杂草多的地方庄稼少,空话多的地方智慧少。
即使路上没有花朵,我仍可以欣赏荒芜。
[组图]记用BAT(批处理脚本)实现文件下载功能热荐【字体:小大】闲来无事之--记用BAT(批处理脚本)实现文件下载功能作者:ZV(ZVROP…文章来源: 点击数:4864 更新时间:2004-8-19作者:ZV(ZVROP)邮件:zvrop@主页:(被整顿掉老~~~~~>_<~~~~~~)网站:日期:2004-8-18转载请保全文档完整,谢谢写的仓卒繁多,错漏难免,还请各位给予斧正.有什么问题,可以给我发email.^_^...目录:一.写在前面的话二.故事的起因三.解决-腹稿四.解决-实战五.解决-打造六.包装七.小节八.后记九,参考文献正文开始:一.写在前面的话这篇文档讲述的并不是什么新鲜的技术,我只是起到将他们混和起来实现了自己需要的功能的作用,如果你对批处理和PE格式相当了解,那我的这篇文档就权且当作浏览温习吧...^_^...另外,由于我本人废话比较多,这也是不想给杂志写稿子的主要原因,给我干瘪瘪的3000字能讲出什么来,不如这样没有限制的爽快(当然也没什么报酬...一_一..),所以也为了防止你在看文章的途中睡着,请自备小锥子一把.....最后,这篇文档说是用批处理下载文件,其实它包含了很多方面的知识,如果有时间,不妨一看哈,^_^,开始买瓜了..二.故事的起因最初萌发这个想法的是不久前,在论坛(广告一下:)上的UNIX SHELL板块有个会员发了一篇帖子,内容是用BASH SHELL写的一个成批下载图片的脚本(其实是H图片...一_一..),接下来跟贴那个多啊...,有繁衍出PHP的,VBS的,C的,C#的,JAVA的,甚至交流到多线程,断点续传....引用花大哥的一句话"无语,为了MM照片,大家的动力都很足啊!"...汗~~..在发了一份PHP和C的代码后(感觉我动力特足~大色狼...一_一..),觉得很简单(因为用C 或者PHP等脚本来实现文件的下载本来就是很基础的东西)我就开始想用微软最原始的脚本--Batch(批处理)来尝试实现(本文标题中的"闲来无事"就是纪念此处,一_一.),这似乎有点不可思议,因为批处理几乎没有实现的支持网络的功能(当然,如果你说你能用TELNET下载到文件的我是很佩服的..一_一..),但也不是完全没有办法,毕竟WINDOWS里面能用的东西这么多,没有完不成的事情....在这种挑战的勾引下,我完成了用批处理下载文件的功能....现在让我一步一步回放我的思路,揭开用批处理下载文件的奥秘...三.解决-腹稿如果用批处理来下载文件的话,肯定会马上想到Cscript脚本(或者是JAVA脚本),那是当然,太多的批处理脚本实现一些本身并不可能实现的功能的时候都是采用ECHO出一个其他脚本的方法来解决.可是我们的目的就在于用批处理实现下载的功能,如果要用VBS来帮忙的话不如直接写VBS了.这个想法顺即告吹....再来,记得以前有流行过一阵用RUNDLL32来加载DLL中的API,似乎和我们需要的目的沾边,因为下载文件能用的API太多了,如果RUNDLL能调用,那最好不过了.于是我打开MSDN,找了一个API: URLDownloadToFileURLDownloadToFile函数原型:代码HRESULT URLDownloadToFile(LPUNKNOWN pCaller,LPCTSTR szURL,LPCTSTR szFileName,DWORD dwReserved,LPBINDSTATUSCALLBACK lpfnCB);URLDownloadToFile函数的一些信息:引用Header Urlmon.hImport library Urlmon.libMinimum availability Internet Explorer 3.0Minimum operating systems Windows NT 4.0, Windows 95根据这些,我们可以知道,这个API是在URLMON.DLL文件中的一个导出函数,简单的实现了把一个文件从WEB服务器下载本机的功能,其实用这个函数还不错的,至少它帮我们处理了断点续传,缓存等等的功能,比起直接使用SOCKET函数来实现或者用WININET里的函数来实现简单多得多了.URLDownloadToFile有五个参数:第一个参数是仅当调用者是一个ActiveX对象才使用,一般为NULL.第二个参数就是要下载文件的目标URL,完整路径.第三个是本地保存路径,也是完整路径第四个是保留,必须为0第五个是指向一个IBindStatusCallback接口的指针,这就类似一种回调机制,你可以参考这些来活动当前下载进度,选择是否继续下载等等.这里面我们只关心第二和第三个参数.其他的通通设置成0.(当然你写C的时候最好设置为NULL)嗯,敲了点键盘介绍了这个函数,是因为整篇的文档都和这个函数息息相关,有了这个函数,就可以呼叫RUNDLL32来调用它,但是很可惜,这个美好的计划马上也破裂了...我去微软看了他们的164787号文档(/default.aspx?...kb;en-us;164787),该文档阐述了RUNDLL32的调用方式和能被他调用的函数的格式:它们是这么说的:引用Rundll and Rundll32 programs do not allow you to call any exported function from any DLL. For example, you can not use these utility programs to call the Win32 API (Application Programming Interface) calls exported from the system DLLs. The programs only allow you to call functions from a DLL that are explicitly written to be called by them.这个是规定的格式:代码void CALLBACKEntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);很不幸,我们的URLDownloadToFile小兄弟并没有符合这些条件,被RUNDLL32无情的抛弃了(汗一滴..)...但是我们并没有因此而嫌弃它(汗一滴AGAIN..),毕竟,在后来实现的过程里,它是为我们的工作省下了不少功夫.到此,用RUNDLL32运行计划流产....(寒...)想了一根烟功夫,现在URLDownloadToFile有了,怎么才能调用这个函数呢?总不能模仿汇编PUSH 5个参数进栈,然后CALL吧,那这个函数的地址还要用LoadLibrary()和GetProcAddress()计算得来,那这两个函数的地址.....还是放弃...等等,如果用一个EXE来实现的话就简单很多了(至少EXE是不需要任何解释器的),对,写一个EXE来下载文件.可我们的目的是用BAT来下载呢,BAT文件能包裹EXE的数据吗?答案是肯定的...往下看..记得以前看过一篇文档<<Do All in Cmd Shell>>里面介绍过一种方法.先卖个关子.大家都知道,如果用ECHO加上重定向符来写文件的话,只能写入ASCII的一部分,也就可以显示出来的那些ASCII(也就是ASCII值小于128的那些),对于那些无法显示的字符就没有办法了.但是这让我们想起一个工具,一个微软历史上同样古老的,批处理的兄弟--DEBUG!现在思路清晰了:可以让批处理把ECHO不能显示的字符转化为16进制数据(比如EXE中的那些数据)保存在批处理中,然后用DEBUG写道文件里,最后用BAT调用生成的EXE,下载文件!(想完了这里,我感觉还是太麻烦,不知道哪位牛人对这个实现还有什么更加简单的办法吗??)四.解决-实战倘若就此编写一个可下载文件的EXE,然后直接用BAT包裹,定然会被同行耻笑,不单是因为那几千个字节的数据拖着大大臃肿的BAT文件,更加让为这种简单的想法立刻现形,为了不达到这些负面效果,也为了让这篇文档不至于干瘪瘪的让人感觉没什么看头(事实上是因为早些时候看过watercloud的一篇大作感悟颇深),我决定手工写一串16进制代码来代替机器编译的EXE.既美观了界面,又增强了技术性.....(一_一...简直是在卖作...)现在当务之急是要一个可以下载文件的EXE程序,实现这个目标只要一个URLDownloadToFile 即可,放在最后实现,先来写一个PE框架:大家都知道PE文件的格式吧,不懂的就去看看那个著名的电信黑客罗某某的书.(Who!?...~)先给出我们的PE框架,基于XP的FileAlignment对齐大小最小就支持到0x200(也就是10进制的512字节,以下有在前面加上0x的都表示16进制数值),我们的框架就打出512字节(注意,我下面留有空白表示各个PE部分,结合下面的文档,大家方便理解),这个框架里没有任何的代码或者数据:(ZV友情提示:下面是最枯燥的部分,各位手握锥子,要有一不怕苦,二不怕痛的精神看完它....)(如果定力不高的朋友,或者堆PE文件再熟悉不过的朋友,可以字节转到"JMP S1"处往下看.) (如果只想知道到底怎么回事,或者对这篇作文报浏览态度的朋友,可以直接转到"JMP S2"处继续浏览)(睡着了的继续睡觉....)代码Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F00000000 4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 MZ.............. 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 ............@...==============================================================================00000040 50 45 00 00 4C 01 02 00 00 00 00 00 00 00 00 00 PE..L........... 00000050 00 00 00 00 70 00 0F 010B 01 00 00 00 02 00 00 ....p........... 00000060 00 00 00 00 00 00 00 00 79 01 00 00 00 00 00 00 ........y....... 00000070 00 00 00 00 00 00 40 00 00 10 00 00 00 02 00 00 ......@......... 00000080 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 ................ 00000090 00 30 00 00 00 02 00 00 00 00 00 00 02 00 00 00 .0.............. 000000A0 00 01 00 00 00 00 00 00 00 01 00 00 00 10 00 00 ................ 000000B0 00 00 00 00 02 00 00 0000 00 00 00 00 00 00 00 ................ 000000C0 28 11 00 00 28 00 00 00==============================================================================00 00 00 00 00 00 00 00 (...(........... 000000D0 00 02 00 00 00 10 00 00 00 02 00 00 00 01 00 00 ................ 000000E0 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 60 ............`..` 000000F0 00 00 00 00 00 00 00 00 02 00 00 00 00 20 00 00 ............. .. 00000100 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000110 00 00 00 00 60 00 00 60 00 00 00 00 00 00 00 00 ....`..`........00000120 58 11 00 00 00 00 00 00 50 11 00 00 00 00 00 00 X.......P....... 00000130 00 00 00 00 6E 11 00 00 20 11 00 00 00 00 00 00 ....n... ....... 00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000150 58 11 00 00 00 00 00 0000 00 00 00 00 00 00 00 ................ 00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................这里简单介绍一下PE文件格式的组成:大致来分呢,PE格式文件可以分为这三个部分(就是上述框架中用"=="分割的三个部分): 引用+++++++++++++++++++++++++DOS信息部分 ++++++++++++++++++++++++++++++++++++++++++++++++++PE信息部分 ++++++++++++++++++++++++++++++++++++++++++++++++++数据部分 +++++++++++++++++++++++++下面来简单介绍每一部分的结构,首先的"DOS信息部分":引用++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++ ++ +[DOS文件头][0x40] + ++ +++++++++++++++++++++++++++++++++++++++ ++ + <==DOS信息部分+ +++++++++++++++++++++++++++++++++++++++ ++ +[DOS块][0x70,可变] + ++ +++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++这部分我觉得是最冗余的地方,首先DOS文件头的结构:代码typedef struct _IMAGE_DOS_HEADER { // DOS .EXE headerWORD e_magic; // Magic numberWORD e_cblp; // Bytes on last page of fileWORD e_cp; // Pages in fileWORD e_crlc; // RelocationsWORD e_cparhdr; // Size of header in paragraphsWORD e_minalloc; // Minimum extra paragraphs neededWORD e_maxalloc; // Maximum extra paragraphs neededWORD e_ss; // Initial (relative) SS valueWORD e_sp; // Initial SP valueWORD e_csum; // ChecksumWORD e_ip; // Initial IP valueWORD e_cs; // Initial (relative) CS valueWORD e_lfarlc; // File address of relocation tableWORD e_ovno; // Overlay numberWORD e_res[4]; // Reserved wordsWORD e_oemid; // OEM identifier (for e_oeminfo)WORD e_oeminfo; // OEM information; e_oemid specificWORD e_res2[10]; // Reserved wordsLONG e_lfanew; // File address of new exe header} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;其中最重要的就是e_lfanew,它指向了下面的"PE信息部分"的起始地址(也就是俗称的PE头部).其他的是一些DOS下运行这个PE文件必须的结构,比如看注解就明白,什么代码初始化堆栈段,初始化堆栈指针,入口IP,CS等等,都是在WIN32上没有用的东西,我就不翻译拉,这些都是说DOS下的,如果这个PE文件一开始就打定在WINDOWS下运行,这些乱写都无所谓,你甚至可以把你的名字都写进去(.....一_一..).当然,你这么作后这个文件就不能在DOS下运行了..不然当机是几乎可以肯定的....(寒....).需要记的除了e_lfanew是指向PE头的指针外还要记得这个DOS文件头结构长0x40,也就是64个字节.还有第一个参数e_magic,这个地方永远是"0x40 0x5a",也就是字符的"MZ".DOS块部分保存的就是一段DOS下可以执行的代码,比如现在大多编译器就简单的输出一个"This program cannot be run in DOS mode"的字符串,和"DOS信息部分"一样,如果你不打算在DOS执行这个EXE文件,那么这里完全可以删除,为什么?因为WIN32的PE装载器只关心"DOS信息部分"的e_lfanew指向的而已.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++。