批处理文件条件 - 仅当 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。 :-)
谢谢大家的帮助。
我 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。 :-)
谢谢大家的帮助。