批处理文件条件 - 仅当 FOR 循环为真时才执行下一条语句

Batch file conditions - Execute next statement only if FOR loop is true

我 built/adapted 一个脚本,用于在安装新版本之前卸载任何以前版本的 Java。脚本如下;

1 - 卸载任何以前版本的 JAVA

SET regVar32=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WinDOws\CurrentVersion\Uninstall
SET regVar64=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WinDOws\CurrentVersion\Uninstall\

SET myCMD=REG QUERY %regVar32% /s /f *java*
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO ( msiexec /x {%%i} /qn /norestart )

SET myCMD=REG QUERY %regVar64% /s /f *java*
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO ( msiexec /x {%%i} /qn /norestart )

2 - 清理注册表

3 - 清理文件和文件夹

4 - 安装新版本 JAVA

问题是脚本没有任何条件,如果例程 1 没有找到任何要卸载的东西,它将继续执行其他子例程。 我想要做的是,如果上面的例程 1 没有任何东西可以卸载 GOTO :INSTALL 并安装新的 JAVA 而没有 运行 2 和 3.

希望我解释得足够清楚 ;-) 在此先感谢您的帮助。

(for /f .... do (msiexec .... )) || goto :install

如果 for 命令没有找到任何要处理的行,它会提高错误级别。使用条件执行你可以检测到它并直接跳转到所需的标签。

换句话说,您想知道步骤 1-卸载中的两个 for 命令是否处理了任何文件。你可以这样做:

SET anyFileUninstalled=false

SET myCMD=REG QUERY %regVar32% /s /f *java*
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO ( 
   msiexec /x {%%i} /qn /norestart
   SET anyFileUninstalled=true
)

SET myCMD=REG QUERY %regVar64% /s /f *java*
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO ( 
   msiexec /x {%%i} /qn /norestart
   SET anyFileUninstalled=true
)

if %anyFileUninstalled% neq true goto install

所以在你们这里​​的一些帮助下,我终于能够把它做好。这是它的结局;

ECHO -------------------------------------------------------
ECHO UNISTALL ANY PREVIOUS VERSIONS OF JAVA 32 Bit
ECHO -------------------------------------------------------
SET uinstallState=false
SET jver="Java 7"
SET regVar32=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
SET myCMD=REG QUERY %regVar32% /s /f %jver%
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO (
 SET uinstallState=true
 ECHO Uninstall Key: {%%i}
 ECHO Condition: %uinstallState%
  )

ECHO -------------------------------------------------------
ECHO UNISTALL ANY PREVIOUS VERSIONS OF JAVA 64 Bit
ECHO -------------------------------------------------------
SET uinstallState=false
SET jver="Java 7"
SET regVar64=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
SET myCMD=REG QUERY %regVar64% /s /f %jver%
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO (
 SET uinstallState=true
 ECHO Uninstall Key: {%%i}
 ECHO Condition: %uinstallState%
  )
IF %uinstallState% NEQ true GOTO INSTALL

所以现在如果没有要卸载的东西,它会跳过子程序2和3,直接进入INSTALL。 :-)

谢谢大家的帮助。