Сначала я рассмотрю концептуальные проблемы в вашей настройке:
Прежде всего, как сказал «Vinay B R», убедитесь, что ваша папка «temp» находится под папкой Windows% TEMP%. Таким образом, вы можете оставить файлы там, если вам не удастся их удалить.
Почему именно вы хотите удалить пакетные файлы, когда закончите? Не ожидается, что вы очистите себя в папке% TEMP%.
Если вы хотите, чтобы пользователь не запускал их снова, вы можете назвать их с другим расширением файла (например, «.tmp» вместо .bat), выполнить их, используя этот метод здесь описано , , затем оставьте их позади:
cmd < "%TEMP%foo.tmp"
Если вы пытаетесь удалить файлы, потому что не хотите, чтобы пользователь имел к ним доступ, то удалив их, вы защитите себя только от случайных пользователей.
Если вы все еще хотите удалить файлы, то:
По всей вероятности, ваш собственный процесс блокирует вашу папку. Использование Process Explorer, скорее всего, будет указывать на msiexec.exe или cmd.exe. Без сомнения, вы можете вручную удалить папку после выхода из MSI и SQL, верно? Если так, то ваш собственный процесс не заканчивается сразу же. Узнайте почему. Возможно, SQL занимает больше времени, чем вы думаете?
В качестве альтернативы методу Алиостада, вот «другой вкус», перечисленный в этой статье . Однако, как он писал, для вас было бы лучше определить, почему он заблокирован.
Process.Start("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del " +
Application.ExecutablePath);
Application.Exit();
Вот рабочий пример на C #. Если у ваших пользователей будет установлен .NET, вы можете вызвать это как настраиваемое действие с помощью WiX DTF (установите WiX, затем в Visual Studio выберите «Новый проект» -> «Установщик Windows XML -> C # Custom Action Project»).:
// Note: This can also be used to delete this .exe (i.e.
// System.Windows.Forms.Application.ExecutablePath).
//
public static void AsynchDeleteFolder(string myTempFolderPath)
{
ProcessStartInfo info = new ProcessStartInfo();
// Don't create a visible DOS box.
info.WindowStyle = ProcessWindowStyle.Hidden;
info.CreateNoWindow = true;
// Wait 3 seconds ("/T 3").
info.Arguments = @"/C choice /C Y /N /D Y /T 3 & rmdir /S /Q """ +
myTempFolderPath + @"""";
info.FileName = "cmd.exe";
Process.Start(info);
}
Если вы предпочитаете выполнять только соответствующую часть в виде пакетного файла, то вы можете избежать окна DOS, следуя этому методу .:
' Filename: Run_a_batch_file_with_no_popup_dos_box.vbs
'
' Invoke like this from the command line:
' wscript.exe Run_a_batch_file_with_no_popup_dos_box.vbs "c:\path with spaces to my file name.bat"
'
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & WScript.Arguments.Item(0) & Chr(34), 0
Set WshShell = Nothing