批处理脚本中的/ wait命令问题

时间:2014-07-07 13:47:25

标签: windows batch-file

我试图卸载一个应用程序,卸载后我想清理一些文件夹。这是我用来卸载的命令。

if %errorlevel% == 0 (
 start /wait /d "%folder%"\test setup.exe
 FOR /f "delims=" %%a IN (ftp.txt) DO (
  if %errorlevel% == 0 (call :skip)
 )

 :skip
 rd /s /q "%location%"
 rd /s /q "%folder%"\agent
)

我的问题是,即使我取消卸载仍然删除文件夹。

任何人都可以建议我在哪里做错了。

提前致谢。

3 个答案:

答案 0 :(得分:1)

第一个问题:块(a parenthesised series of statements)内的标签终止块(这可能与版本有关)因此,无论块的其余部分是什么,都将执行标签后面的命令。

第二个问题:例程:skip由不平衡)终止。这本身可能是无害的,但终止例行程序。 <{1}}将在返回之前继续call :skip或文件结束。

第三个问题:在块语句exit中,解析整个块并执行然后。块中的任何(a parenthesised series of statements)将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于%var%。< / p>

因此,FOR ... DO (block)将在遇到IF (something) else (somethingelse)时使用%variables%的值执行。

解决此问题的两种常见方法是1)使用IF并使用setlocal enabledelayedexpansion代替!var!来访问已更改的%var%或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

所以 - 在您的情况下,第二个var将在您向我们展示的代码段中的第一个if %errorlevel% == 0处应用errorlevel的值, not 更改的值取决于处理。

下一个问题是,您正在iffor/f,并且似乎对从ftp.txt收集的数据无效 - ftp.txt根本没有使用例程,它所做的就是%%a中的每一行尝试call :skip一次。

所以 -

ftp.txt
如果取消卸载,假设if %errorlevel% == 0 ( start /wait /d "%folder%"\test setup.exe if not errorlevel 1 (call :skip) ) goto :eof :skip rd /s /q "%location%" rd /s /q "%folder%"\agent goto :eof 设置为非零,

可以完成这项工作。请注意,格式errorlevel适用于errorlevel的运行时值,而if [not] errorlevel n适用于分析时值。

如果不知道if %errorlevel% == 0ftp.txt应该用于什么,我不知道如何处理它们......

答案 1 :(得分:0)

尝试此修改:

if %errorlevel% == 0 (
start /wait /d "%folder%"\test setup.exe
FOR /f "delims=" %%a IN (ftp.txt) DO (
if %errorlevel% == 0 (call :skip) )
goto done
:skip
rd /s /q "%location%"
rd /s /q "%folder%"\agent ) 
:done

答案 2 :(得分:0)

看看这是否适合您 - 如果setup.exe返回non-zero错误级别,则会跳过文件夹删除。

  start "Title" /wait /d "%folder%\test" setup.exe
  if not errorlevel 1 (
    rd /s /q "%location%"
    rd /s /q "%folder%\agent"
  )