Archivo por lotes SI EXISTE, todos los bucles se ejecutan

Archivo por lotes SI EXISTE, todos los bucles se ejecutan

Estoy ejecutando un archivo por lotes que verifica si Java\jre6 está presente, luego se ejecutará un tipo de comando y luego, por último, una declaración else, pero encuentro que todos los stmts se ejecutan juntos.

echo.
echo. 
GOTO:Java

:Java
IF EXIST C:\Program Files\Java\jre6(
echo. Java Version 1.6 present
start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java 6 thereeee"

if "%PROCESSOR_ARCHITECTURE%"=="x86" (
XCOPY "%CD%\Sec\*.*"  "%ProgramFiles%\Java\jre6\lib\security\" /s /Y
XCOPY "%CD%\Jar\*.*"  "%ProgramFiles%\Java\jre6\lib\ext\" /s /Y
)
else(
XCOPY "%CD%\Sec\*.*"  "%ProgramFiles(x86)%\Java\jre6\lib\security\" /s /Y
XCOPY "%CD%\Jar\*.*"  "%ProgramFiles(x86)%\Java\jre6\lib\ext\" /s /Y
)
start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Your Settings have been installed successfully for 6"
)

IF EXIST C:\Program Files\Java\jre7(
echo. Java Version 1.7 present
start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java 7 thereeee"
if "%PROCESSOR_ARCHITECTURE%"=="x86" (
XCOPY "%CD%\Jar\*.*"  "%ProgramFiles%\Java\jre7\lib\ext\" /s /Y
XCOPY "%CD%\Sec7\*.*"  "%ProgramFiles%\Java\jre7\lib\security\" /s /Y
)
else
(
XCOPY "%CD%\Jar\*.*"  "%ProgramFiles(x86)%\Java\jre7\lib\ext\" /s /Y
XCOPY "%CD%\Sec7\*.*"  "%ProgramFiles(x86)%\Java\jre7\lib\security\" /s /Y
)
start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Your Settings have been installed successfully for 7"
)

IF EXIST C:\Program Files\Java\jre8(
echo. Java Version 1.8 present
start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java 8 thereeee"
if "%PROCESSOR_ARCHITECTURE%"=="x86" (
XCOPY "%CD%\Sec\*.*"  "%ProgramFiles%\Java\jre8\lib\security\" /s /Y
XCOPY "%CD%\Jar\*.*"  "%ProgramFiles%\Java\jre8\lib\ext\" /s /Y
)
else(
XCOPY "%CD%\Sec\*.*"  "%ProgramFiles(x86)%\Java\jre8\lib\security\" /s /Y
XCOPY "%CD%\Jar\*.*"  "%ProgramFiles(x86)%\Java\jre8\lib\ext\" /s /Y
)
start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Your Settings have been installed successfully for 8"
) 
ELSE (
echo. Java NOT present
start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java is not Installed In your system , install Java 1.8 and try to execute settings again"
GOTO:EXIT
)

:EXIT

Respuesta1

Problemas críticos que deben solucionarse:

  • El nombre del archivo IF EXIST debe ir entre comillas si contiene espacios (o caracteres venenosos como &).
  • Debe haber un espacio antes (al comenzar un bloque de código.
  • ), ELSEy (deben aparecer todos en la misma línea
  • Su lógica es incorrecta: siempre ejecutará el código "Java NO presente" a menos que exista la versión 1.8. Debes hacer que toda la construcción sea una gran cadena IF... ELSE IF..., o bien GOTO:SomeLabel al final de cada bloque IF.

Sugerencias adicionales:

  • ECHO.no es confiable. Hay circunstancias inusuales en las que puede fallar. Es mejor acostumbrarse a utilizarlo ECHO(, ya que siempre funciona. Sé que parece "incorrecto", como si confundiría los bloques de código, pero en realidad es muy confiable.
  • ECHO(solo es necesario cuando no tiene nada más que espacios en blanco (o la posibilidad de solo espacios en blanco) que se están haciendo ECHO. Pero ciertamente no está de más usar siempre esa forma.
  • Es posible tener varias versiones de JRE instaladas en la misma máquina. Podría considerar invertir el orden para que siempre prepare la versión más reciente encontrada.
  • A menos que tenga un código adicional que no se muestra cerca de la parte superior, GOTO :JAVA no es necesario
  • A menos que tenga código adicional después de :EXIT, entonces es mejor usar GOTO :EOFo EXIT /Bsimplemente salir de su script, sin necesidad de una etiqueta en la parte inferior.
  • La sangría es tu amiga. Es útil ver la lógica de su código y lo hace mucho más fácil de entender.
echo(
echo( 
GOTO:Java

REM Presumably the GOTO above is conditional, and there is more code that goes here

:Java
IF EXIST "C:\Program Files\Java\jre6" (
  echo( Java Version 1.6 present
  start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java 6 thereeee"

  if "%PROCESSOR_ARCHITECTURE%"=="x86" (
    XCOPY "%CD%\Sec\*.*"  "%ProgramFiles%\Java\jre6\lib\security\" /s /Y
    XCOPY "%CD%\Jar\*.*"  "%ProgramFiles%\Java\jre6\lib\ext\" /s /Y
  ) else (
    XCOPY "%CD%\Sec\*.*"  "%ProgramFiles(x86)%\Java\jre6\lib\security\" /s /Y
    XCOPY "%CD%\Jar\*.*"  "%ProgramFiles(x86)%\Java\jre6\lib\ext\" /s /Y
  )
  start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Your Settings have been installed successfully for 6"
) else IF EXIST "C:\Program Files\Java\jre7" (
  echo( Java Version 1.7 present
  start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java 7 thereeee"
  if "%PROCESSOR_ARCHITECTURE%"=="x86" (
    XCOPY "%CD%\Jar\*.*"  "%ProgramFiles%\Java\jre7\lib\ext\" /s /Y
    XCOPY "%CD%\Sec7\*.*"  "%ProgramFiles%\Java\jre7\lib\security\" /s /Y
  ) else (
    XCOPY "%CD%\Jar\*.*"  "%ProgramFiles(x86)%\Java\jre7\lib\ext\" /s /Y
    XCOPY "%CD%\Sec7\*.*"  "%ProgramFiles(x86)%\Java\jre7\lib\security\" /s /Y
  )
  start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Your Settings have been installed successfully for 7"
) else IF EXIST "C:\Program Files\Java\jre8" (
  echo( Java Version 1.8 present
  start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java 8 thereeee"
  if "%PROCESSOR_ARCHITECTURE%"=="x86" (
    XCOPY "%CD%\Sec\*.*"  "%ProgramFiles%\Java\jre8\lib\security\" /s /Y
    XCOPY "%CD%\Jar\*.*"  "%ProgramFiles%\Java\jre8\lib\ext\" /s /Y
  ) else (
    XCOPY "%CD%\Sec\*.*"  "%ProgramFiles(x86)%\Java\jre8\lib\security\" /s /Y
    XCOPY "%CD%\Jar\*.*"  "%ProgramFiles(x86)%\Java\jre8\lib\ext\" /s /Y
  )
  start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Your Settings have been installed successfully for 8"
) ELSE (
  echo( Java NOT present
  start /wait /d "%CD%\Message" cscript MessageBox.vbs  "Java is not Installed In your system , install Java 1.8 and try to execute settings again"
  goto :EXIT
)
REM Presumably there is more code here

:EXIT
REM Presumably there is cleanup code here

Hay mucho más que haría para mejorar el código, pero eso es suficiente por ahora.

información relacionada