函数需要调用cmd和winrar.exe,一般只能以管理组启动这些程序,合适的权限分配下才能正常使用这个函数。需要使得匿名账户有执行权限,和ntfs文件系统的读写权限。没有自己服务器的还是算了。有些虚拟主机程式是支持解压缩和压缩的,实现的道理类似,无外乎就是winrar的使用。
要想实现这种功能,首先要得到Rar程序的解压缩核心文件支持(可以下载WinRar软件,再把其中的Rar.exe文件单独“拿”出来。),并且还需要Windows操作系统自带的cmd.exe程序(这个程序用来执行Rar.exe文件。操作系统自带的,NT内核的操作系统可以在操作系统安装目录下的System32文件夹下找到它;Windows 9X的操作系统可以在操作系统安装目录下的System文件夹下找到它。),然后把它们上传到同一目录中。
<%
'描述:只有压缩功能,没有解压功能;需要cmd.exe和Rar.exe两个执行程序
'参数说明:Rar(ByVal CmdDir,ByVal RarNameDir,RarSourceDir)
'CmdDir为cmd.exe和Rar.exe两个执行程序的[共同]存放绝对路径;
'RarNameDir为压缩后保存文件名称,要绝对路径;
'比如:E:\WebSite\Rar\AA\MMGG 那么表示压缩为MMGG.rar,保存在E:\WebSite\Rar\AA\路径下
'RarSourceDir要压缩的[文件]或[文件夹],要绝对路径;
'比如:E:\WebSite\Rar\AA表示压缩名为"AA"的整个文件夹;E:\WebSite\Rar\AA\表示压缩文件夹"AA"里的[所有文件](不包括里面的文件夹)
'******************************************************
Sub Rar(ByVal CmdDir,ByVal RarNameDir,RarSourceDir)
Dim Cmd,Shell
Cmd=CmdDir&"cmd.exe /c "&CmdDir&"Rar.exe a -ep1 -o+ " '// -ep1 -o+分别为两个开关命令具体可参考WinRar的帮助
Cmd=Cmd&RarNameDir&" "&RarSourceDir
On Error Resume Next
Set Shell = Server.CreateObject("WScript.Shell")
If Err or IsObject(Shell)=False Then
If Err Then Err.Clear
Response.Write "没有操作Shell权限..."
Response.End
End If
On Error Resume Next
Shell.Run Cmd,1,True
If Err Then
Err.Clear
Response.Write "压缩文件时出错,可能没有操作权限"
Response.End
End If
End Sub
%>
示例:
<%
Dim CmdDir,RarNameDir,RarSource
CmdDir=Server.MapPath("RAR")&"\" '//cmd.exe和rar.exe存放的路径
RarNameDir=Server.MapPath("AA")&"\MMGG" '//压缩为"MMGG.rar"
RarSourceDir=Server.MapPath("AA")&"" '//将整个"AA"文件夹压缩
Call Rar(CmdDir,RarNameDir,RarSourceDir)
%>
一个错误的解决办法:
Microsoft VBScript 运行时错误 错误 '800a0046'
没有权限
这个是因为cmd.exe和rar.exe没有执行的权限,这是NTFS的权限限制造成的。
自己在cmd终端窗口用cmd /? 什么都一目了然了。C:\>cmd /?
启动 Windows 2000 命令解释器一个新的实例
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
/C 执行字符串指定的命令然后终断
/K 执行字符串指定的命令但保留
/S 在 /C 或 /K 后修改字符串处理(见下)
/Q 关闭回应
/D 从注册表中停用执行 AutoRun 命令(见下)
/A 使向内部管道或文件命令的输出成为 ANSI
/U 使向内部管道或文件命令的输出成为 Unicode
/T:fg 设置前景/背景颜色(详细信息,请见 COLOR /?)
/E:ON 启用命令扩展(见下)
/E:OFF 停用命令扩展(见下)
/F:ON 启用文件和目录名称完成字符 (见下)
/F:OFF 停用文件和目录名称完成字符(见下)
/V:ON 将 c 作为定界符启动延缓环境变量扩展。如: /V:ON 会
允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法
在输入时扩展变量,这与在一个 FOR 循环内不同。
/V:OFF 停用延缓的环境扩展。
请注意,如果字符串有引号,可以接受用命令分隔符 '&&' 隔开
的多个命令。并且,由于兼容原因,/X 与 /E:ON 相同,/Y 与
/E:OFF 相同,并且 /R 与 /C 相同。忽略任何其它命令选项。
如果指定了 /C 或 /K,命令选项后的命令行其余部分将作为命令行处
理;在这种情况下,会使用下列逻辑处理引号字符("):
1. 如果符合下列所有条件,那么在命令行上的引号字符将被
保留:
- 不带 /S 命令选项
- 整整两个引号字符
- 在两个引号字符之间没有特殊字符,特殊字符为下列中的
一个: <>()@^|
- 在两个引号字符之间有至少一个空白字符
- 在两个引号字符之间有至少一个可执行文件的名称。
2. 否则,老办法是,看第一个字符是否是一个引号字符,如果
是,舍去开头的字符并删除命令行上 的最后一个引号字符,
保留最后一个引号字符之后的文字。
如果 /D 未在命令行上被指定,当 CMD.EXE 开始时,它会寻找
以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或
两个都存在,这两个变量会先被执行。
WshShell.Run
Run 方法创建一个新的进程,该进程以 intWindowStyle 窗口样式执行 strCommand。
语法
WshShell.Run (strCommand, [intWindowStyle], [blnWaitOnReturn])
参数
strCommand
在 strCommand 参数内部的环境变量被自动扩展。
intWindowStyle
这是为新进程在 STARTUPINFO 结构内设置的 wShowWindow 元素的值。其意义与 ShowWindow 中的 nCmdShow 参数相同,可取以下值之一。名称 值 含义
SW_HIDE
0 隐藏窗口并激活另一窗口。
SW_MINIMIZE
6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。
SW_RESTORE
9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。
SW_SHOW
5 以当前大小和位置激活并显示窗口。
SW_SHOWMAXIMIZED
3 激活窗口并以最大化显示该窗口。
SW_SHOWMINIMIZED
2 激活窗口并以最小化显示该窗口。
SW_SHOWMINNOACTIVE
7 最小化显示窗口。活动窗口保持活动。
SW_SHOWNA
8 以当前状态显示窗口。活动窗口保持活动。
SW_SHOWNOACTIVATE
4 按窗口最近的大小和位置显示。活动窗口保持活动。
SW_SHOWNORMAL
1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。