2012-10-09 234 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

權限被拒絕的錯誤現在已經消失**但**(實際上我可能早就提到過了)應用程序不會被終止......當/如果我手動關閉應用程序,其餘操作只會繼續。 –