2012-10-09 152 views
1

我需要优雅地终止(通过.bat或.vbs)特定的应用程序,以便安全地覆盖其目录中的(只读)文件,然后删除其子目录中的所有文件-directories。按顺序执行任务

我想到这样的事情:

@echo off 
taskkill /t /im App.exe 
ping -n 5 127.0.0.1 > nul 
xcopy /y /r "C:\Some path\My File.ext" "C:\App path" 
Del /f /q "C:\App path\App sub-directory\*.*" 

与其等待的时间固定量(5秒在上面的例子)我想的2级最后的命令要被执行当taskkill是完整的(即应用程序在用户解决了最终提示后关闭)。

有没有办法做到这一点?

+0

FTR,你的榜样等待只有4秒,因为1秒的延迟是由于之间的间隔2个回应请求。 ;) –

+0

呵呵......我没想到你错过了那个细节;) –

回答

3

在批处理,你可以做这样的:

@echo off 

setlocal EnableDelayedExpansion 

for /f "tokens=2" %%p in ('tasklist /fi "imagename eq App.exe" /fo list ^| find "PID:"') do set pid=%%p 

taskkill /t /pid %pid% 

:wait 
ping -n 2 127.0.0.1 >nul 
tasklist /fi "pid eq %pid%" /fo list | find "PID:" 
if %errorlevel% equ 0 goto wait 

xcopy /y /r "C:\Some path\My File.ext" "C:\App path" 
del /f /q "C:\App path\App sub-directory\*.*" 

endlocal 

我喜欢的VBScript这一点,虽然。

Set wmi = GetObject("winmgmts://./root/cimv2") 
Set sh = CreateObject("WScript.Shell") 
query = "SELECT * FROM Win32_Process WHERE Name = 'App.exe'" 

For Each p In wmi.ExecQuery(query) 
    ' p.Terminate would forcibly terminate the process (like "taskkill /t /f") 
    sh.Run "taskkill /t /pid " & p.ProcessId, 0, False 
Next 

Do While wmi.ExecQuery(query).Count > 0 
    WScript.Sleep 100 
Loop 

Set fso = CreateObject("Scripting.FileSystemObject") 
If fso.FileExists("C:\App path\My File.ext") Then 
    fso.DeleteFile "C:\App path\My File.ext", True 
End If 
fso.CopyFile "C:\Some path\My File.ext", "C:\App path\", True 
fso.DeleteFile "C:\App path\App sub-directory\*.*", True 

而不是删除目标文件的,你也可以删除只读标志:

Set f = fso.GetFile("C:\App path\My File.ext") 
f.Attributes = f.Attributes And Not 1 
+0

@AW ......像往常一样给予大力支持,谢谢! .bat是**优秀**,但.vbs返回权限拒绝错误...实际上很奇怪,因为“真正的”力量参数应该照顾R-O文件,对吧?可能在/ R开关中使用“xcopy.exe”可能会解决这个问题?再次感谢:) –

+0

当目标文件设置了只读标志时,'CopyFile()'将失败。您必须首先删除文件或取消设置标志(请参阅更新后的答案)。当目的地是一个文件夹时,'CopyFile()'也会失败,出现“Permission Denied”错误,但是路径没有尾部的反斜杠。 –

+0

权限被拒绝的错误现在已经消失**但**(实际上我可能早就提到过了)应用程序不会被终止......当/如果我手动关闭应用程序,其余操作只会继续。 –