我试图卸载一个应用程序,卸载后我想清理一些文件夹。这是我用来卸载的命令。
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
)
我的问题是,即使我取消卸载仍然删除文件夹。
任何人都可以建议我在哪里做错了。
提前致谢。
答案 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 更改的值取决于处理。
下一个问题是,您正在if
上for/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% == 0
和ftp.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"
)