原链接: http://www.cnblogs.com/waxdoll/archive/2005/09/18/239410.html
先来废话:
.NET框架的主要目标之一就是简化部署,为此使用.NET开发的应用程序支持XCOPY部署,这在以前是不可想象的(当然说的是微软系列)。在.NET之前,安装一个组件(例如一个COM组件)意味着不仅要把组件复制到适当的目录,而且还要执行注册表修改之类的操作。但现在有了.NET,安装一个组件的全部操作就是将程序集复制到客户应用程序的bin目录,由于程序集包含完整的自我描述信息,应用程序可以立即开始使用程序集。这一切之所以成为可能,是因为编译器将标识符和元数据信息嵌入到了编译好的模块之中,而CLR利用这些信息来装入程序集的适当版本。标识符包含了装入和运行模块、查找程序集引用的其他模块所需的所有信息。这种安装也称为无干扰(Zero-Impact)安装,因为系统不会因为修改注册表、配置组件而受到影响;另外,无干扰安装也使得组件卸载操作不会对系统产生任何意外的影响,卸载组件时只要从特定的目录删除某些文件就可以了。
如何进行XCOPY部署呢?
以一个WinForm应用程序为例,在命令行中使用XCOPY命令将必要的文件复制到客户端的特定目录即可。 在命令行中输入XCOPY/?可以看到如下信息,这是XCOPY的使用方法:
XCOPY命令选项 XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
[/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
[/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
[/EXCLUDE:file1[+file2][+file3]...]
source 指定要复制的文件。
destination 指定新文件的位置和/或名称。
/A 只复制有存档属性集的文件,
但不改变属性。
/M 只复制有存档属性集的文件,
并关闭存档属性。
/D:m-d-y 复制在指定日期或指定日期以后更改的文件。
如果没有提供日期,只复制那些源时间
比目标时间新的文件。
/EXCLUDE:file1[+file2][+file3]...
指定含有字符串的文件列表。每一个字符串
必须在文件的单独行中。如果有任何
字符串与要被复制的文件的绝对路径
相符,那个文件将不会得到复制。
例如,指定如 \obj\ 或 .obj 的字符串会排除
目录 obj 下面的所有文件或带有
.obj 扩展名的文件。
/P 创建每个目标文件前提示。
/S 复制目录和子目录,除了空的。
/E 复制目录和子目录,包括空的。
与 /S /E 相同。可以用来修改 /T。
/V 验证每个新文件。
/W 提示您在复制前按键。
/C 即使有错误,也继续复制。
/I 如果目标不存在,又在复制一个以上的文件,
则假定目标一定是一个目录。
/Q 复制时不显示文件名。
/F 复制时显示完整的源和目标文件名。
/L 显示要复制的文件。
/G 允许将没有经过加密的文件复制到
不支持加密的目标。
/H 也复制隐藏和系统文件。
/R 覆盖只读文件。
/T 创建目录结构,但不复制文件。
不包括空目录或子目录。/T /E 包括
空目录和子目录。
/U 只复制已经存在于目标中的文件。
/K 复制属性。一般的 Xcopy 会重置只读属性。
/N 用生成的短名复制。
/O 复制文件所有权和 ACL 信息。
/X 复制文件审核设置(隐含 /O)。
/Y 复制文件审核设置(隐含 /O)。
现存目标文件。
/-Y 导致提示以确认改写一个
现存目标文件。
/Z 用重新启动模式复制网络文件。
包含XCOPY命令的批处理文件的实际应用:
在开发.NET WinForm应用程序时,如何在局域网内部部署应用程序?使用包含XCOPY命令的批处理文件也许是最方便的方法,在客户端机器上建立批处理文件还可以实现软件的自动更新功能,下面的例子即实现客户端的自动更新。有一个小问题先解决以下,客户端机器的环境设置千差万别,操作系统也可能从Win9X到Win2003都有,从客户端机器访问服务器需要输入用户名和密码,有的甚至无法保存该用户名密码,这时候怎么办?需要在批处理文件中激活到服务器的网络连接,这时候可以利用IPC$(注意IPC$是NT/2000后才有的功能)。IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。可以使用net use \\(Server IP或Server Name)\ipc$ password /user:user 来建立到服务器(Server IP或Server Name)的连接,但是应该注意的一点是,使用IPC$在同一时间内,两个IP之间只允许建立一个连接,所以在使用该命令建立连接之前最好使用net use * /del 删除可能存在的到服务器的连接。下面是一个完整的批处理文件:
完整的批处理文件示例 @ECHO ————————————————————
@ECHO 开始准备更新……
@ECHO ————————————————————
@ECHO 删除到服务器的所有连接……
@NET USE * /del /Y
@ECHO ————————————————————
@ECHO 激活到服务器的连接……
@NET USE \\waxdoll\ipc$ password /user:user
@ECHO ————————————————————
@ECHO 正准备复制文件,请稍候……
@ECHO ————————————————————
@XCOPY \\waxdoll\Debug E:\WinForm /Y/E
@ECHO ————————————————————
@ECHO 更新完成!
@ECHO ————————————————————
@Pause
Life is like a boat, and I'm at sea.