【问题标题】:Sequentially execute tasks顺序执行任务
【发布时间】:2012-10-09 20:35:33
【问题描述】:

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

我有这样的想法:

@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 秒),我希望在 taskkill 完成时(即应用程序在最终关闭后关闭)执行最后的 2 个命令提示已被用户解决)。

有没有办法做到这一点?

【问题讨论】:

  • FTR,您的示例仅等待 4 秒,因为 1 秒延迟是由于 2 个回显请求之间的间隔。 ;)
  • 呵呵...我没想到你会错过那个细节;)

标签: vbscript batch-file cmd


【解决方案1】:

你可以这样做:

@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

【讨论】:

  • @AW... 一如既往的大力支持,谢谢! .bat 是 优秀 但 .vbs 返回 Permission Denied Error ......实际上很奇怪,因为“True”强制参数应该处理 R-O 文件,对吗?可能将“xcopy.exe”与 /R 开关一起使用可能会解决问题?再次感谢:)
  • 当目标文件设置了只读标志时,CopyFile() 将失败。您必须先删除文件或取消设置标志(请参阅更新的答案)。当目标是文件夹但路径没有尾部反斜杠时,CopyFile() 也会失败并出现 Permission Denied 错误。
  • Permission Denied 错误现在消失了但是(实际上我可以在前面提到这一点)应用程序没有被终止...其余操作仅在以下情况下继续/如果我手动关闭应用程序。
  • +1,但请确保更新 VBScript 以实际终止进程,而不是无限循环。 :)
  • @AW: 非常感谢 AWesome 的支持,但是正如我在第一篇文章中提到的,我需要优雅地 终止应用程序和后者.vbs 脚本强制终止它。你能解决这个问题吗?谢谢你的耐心:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2021-09-01
  • 2019-12-06
  • 2017-05-13
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多