最近,工作中用到了vbs脚本,发现了一个很坑的问题,需要用vbs脚本去覆盖应用下的dll,但是如果文件是只读属性的,就会报800A0046,没有权限错误,如果该应用正在运行,也会报同样错误,vbs基本没怎么用过,经过多天的学习,终于写了一个可以运行的脚本,供大家分享.
基本功能:
1:判断指定应用是否运行,如果运行,则等待4S,4S后如果仍在运行,则停止该脚本.
2:在复制文件前,先去目标路径下,将要覆盖的文件去除只读属性.
3:使用递归方法,读取将要拷贝的文件,并替换路径,得到目标路径.
具体实现
1:判断指定应用是否运行,如果运行,则等待4S,4S后如果仍在运行,则停止该脚本.
Sub ValidateAppRunning() Num=0 IEIsAlive=True strComputer = "." Do Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\" & strComputer & " ootcimv2") Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'notepad.exe'") If colProcessList.Count>0 Then IEIsAlive=True Num= Num + 1 WScript.Sleep 1000 If Num > 4 Then WScript.Echo "4s后,notepad.exe仍未关闭" If Num > 4 Then Wscript.Quit Else IEIsAlive=False WScript.Echo "notepad没运行" End If Loop While IEIsAlive End Sub
2:在复制文件前,先去目标路径下,将要覆盖的文件去除只读属性.
Sub SetFileAttributes(path) Set fs1= CreateObject("Scripting.FileSystemObject") Set file=fs1.GetFile(path) file.Attributes=0 End Sub
3:使用递归方法,读取将要拷贝的文件,并替换路径,得到目标路径.
Function digui(path) Set fs= CreateObject("Scripting.FileSystemObject") Set folder = fs.getfolder(path) Set subfolders = folder.subfolders Set Files = folder.Files For Each objFile In Files path=Replace(objFile,"Temp","") If fs.Fileexists(path) Then SetFileAttributes(path) Next For Each j In subfolders digui (j.path) '递归查找子目录 Next End Function
终于,一个简易的拷贝脚本完成了.