最近需要实现将文件拷贝到操作系统的虚拟目录下,因为记得创建网站的时候,IS2010有看过一个<IISROOTFolder>变量,心想既然IS提供了这个变量,我只要把文件的目标位置设置成这个变量就可以了吧。
结果XP,server 2003系统都可以拷贝成功,但由于Windows 7 ,Windows Server 2008 操作系统的虚拟目录是默认设置成%SystemDrive%\inetpub\wwwroot,而IS提供的<IISROOTFolder>变量却无法自动将%SystemDriver%解析成系统盘符,所以拷贝过程会报错。
经过摸索,可以用以下方式解决:
1. 思路:通过获取虚拟目录的路径在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp 的PathWWWRoot键值中的位置,如果该键值中存在%SystemDriver%的字符串,就通过脚本解析成系统盘符,然后将文件拷贝到最后解析后的虚拟目录中。
2.工程类型:IS 2010 ,installscript
3.定义的变量 :
STRING szKey, szDefaultPath, szFindMe,svValue,svReturnString,svResult,svSubStr;
NUMBER i,AllReturn,PartlReturn;
4.具体脚本:
//获取虚拟目录在注册表中的位置
if (RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE) = 0) then
nvType=REGDB_STRING_EXPAND;
nvSize=-1;
szKey="SOFTWARE\\Microsoft\\InetStp";
RegDBGetKeyValueEx (szKey, "PathWWWRoot", nvType, ReturnName, nvSize );
endif;
szFindMe = "SystemDrive";
i = StrFind (ReturnName, szFindMe);
if (i>0) then //大于0表示找到
GetEnvVar ( "SystemDrive", svValue ); //转化成实际的系统盘符
AllReturn = StrLength(ReturnName); //获取整个注册表值的总长度
PartlReturn = StrLength("SystemDriver"); //获取SystemDriver的长度
StrSub(svSubStr, ReturnName,PartlReturn+1,AllReturn ); //返回从SystemDriver+1位到总长度中间的所有字符串,即”\inetpub\wwwroot”
ReturnName=svValue+svSubStr; //得到解析的虚拟目录的路径
XCopyFile(SUPPORTDIR^"crossdomain.xml",ReturnName,LAAW_OPTION_WAIT|LAAW_OPTION_HIDDEN|COMP_UPDATE_DATE|COMP_UPDATE_VERSION);
else
//i小于等于0,表示得到的注册表的键值不包含“SystemDrive”,直接将文件拷贝到得到的路径中
XCopyFile(SUPPORTDIR^"crossdomain.xml",ReturnName,LAAW_OPTION_WAIT|LAAW_OPTION_HIDDEN|COMP_UPDATE_DATE|COMP_UPDATE_VERSION);
endif;
版权声明:转载请以链接形式注明原始出处。