1

ディレクトリ内の (読み取り専用) ファイルを安全に上書きし、そのサブディレクトリのいずれかにあるすべてのファイルを削除するには、特定のアプリを (.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 秒) 待機するのではなく、最後の 2 つのコマンドを、タスクキルが完了したとき (つまり、最終的なプロンプトがユーザーによって解決された後にアプリが閉じられたとき) にのみ実行したいと考えています。

それを行う方法はありますか?

4

1 に答える 1

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
于 2012-10-09T21:40:27.680 に答える