2014-05-23 44 views
0

在卸载时,我运行一个可执行文件来创建自删除批处理文件来做一些目录清理。它一直很棒,已经有很多年了。自删除批处理文件删除目录没有完全删除,并在Windows 7上不能退出

我遇到了一个情况,我需要做类似的事情,在安装时做一些清理工作。我有一个创建并运行,我从2013年的InstallShield产生的setup.exe启动一个批处理文件,以下是相关序列的不同的.NET控制台应用程序:

  1. 安装程序创建一个目录,并提取了一些文件,其中之一是setup.exe。
  2. 运行最终运行setup.exe的exe文件。
  3. Setup.exe执行安装,并在退出之前调用LaunchApp来运行我的控制台应用程序DirectoryDe​​lete.exe,并将该目录作为参数删除。
  4. DirectoryDe​​lete.exe在要删除的目录的父目录中创建一个批处理文件并运行它。

例如所得命令行是:

DirectoryDe​​lete.exe -dir “C:\用户\ AUser \应用程序数据\本地\ TEMP \ STD1234.tmp”

所得批处理文件是:

@echo off 
:repeatExe 
del "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\setup.exe" 
if exist "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\setup.exe" goto repeatExe 
:repeatDir 
rmdir "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp" /s /q 
if exist C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\nul goto repeatDir 
del %~F0&exit 

所以,基本上批处理文件在setup.exe上等待完成,然后静静地删除目录,然后自己删除。

但是,发生的事情是目录的内容被删除,但目录和批处理文件都不会被删除。它看起来像批处理文件卡在一个循环 - 可能阻止自己。当我尝试自己删除目录(命令行或资源管理器)时,它说另一个进程正在使用它(批处理文件的cmd.exe)。如果我尝试重新运行批处理文件,它很忙。如果我杀死了cmd.exe,那么我可以手动清理。

由于这种技术在卸载时工作得很好,所以我很困惑它为什么在我的安装过程中不能正常工作。一切都在提升特权下运行。我最好的猜测是它与上下文有关 - 从setup.exe启动的控制台应用程序。

任何帮助或想法将不胜感激。

编辑:

我得到的批处理文件,退出并删除自身,但目录仍没有被删除。我通过添加几行来修改批处理文件:

@echo off 
:repeatExe 
del "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\setup.exe" 
if exist "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\setup.exe" goto repeatExe 
:repeatDir 
if not exist "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\DeleteDirectory.exe" goto cleaned 
rmdir "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp" /s /q 
if exist C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\nul goto repeatDir 
:cleaned 
rmdir "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp" /s /q 
del %~F0&exit 

我的想法是查找另一个我知道在那里的文件。如果它已被删除,那么我知道rmdir做了部分工作。这样,我至少可以打破这个循环,并在删除目录时再拍摄一遍,然后清理出去。

我所知道的是rmdir失败,因此在原始bat文件中创建了一个无限循环。现在,如果我自己运行批处理文件,即使在安装过程创建的目录中,一切正常......

对于rmdir/s不起作用将意味着文件正在使用中,文件被锁定或权限问题。对于工作目录也会有困惑吗?

+0

从它工作的时间点和不工作的时间点之间有什么不同?这是Windows的特定版本,特定的环境......等 –

+0

这可能不是它,而是等待批处理文件完成的DirectoryDe​​lete.exe?另一件事情可能并非如此,命令窗口的当前目录等于临时目录? – MicroVirus

+0

通过添加/删除程序从我的卸载应用程序启动时,工作/非工作环境中的差异是有效的。从安装程序的setup.exe启动时,它不起作用。 – GTAE86

回答

0

我想出了问题所在:rmdir/s失败,因为当前目录设置为我试图删除的目录。显然,在卸载操作过程中并非如此。现在

@echo off 
pushd "%~dp0" 
:repeatExe 
del "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\setup.exe" 
if exist "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\setup.exe" goto repeatExe 
:repeatDir 
rmdir "C:\Users\AUser\AppData\Local\Temp\STD1234.tmp" /s /q 
if exist C:\Users\AUser\AppData\Local\Temp\STD1234.tmp\nul goto repeatDir 
del %~F0&exit 

正常工作:

我改变了我的批处理文件来拉升至DeleteDirectory.exe从启动目录。