2012-04-09 7 views
13

He creado un archivo por lotes que copia automáticamente un archivo .sql en la ruta del servidor Jasper instalado (podría ser cualquier directorio de instalación de software).¿Cómo crear un archivo de proceso por lotes que funcione tanto para Archivos de programa como para Archivos de programa (x86)?

Ésta es mi lote script--

C: \ ARCHIV ~ 2 \ JASPER ~ 1,0 \ mysql \ bin \ mysql.exe u root -proot < create_database.sql

que está trabajando cuando jasper está instalado en Archivos de programa (x86). ¿Cómo puedo generalizarlo para Archivos de programa y Archivos de programa (x86)?

+0

¿Qué pasa con "Archivos de programa"? –

+0

C: \ PROGRA ~ 2 puede ser cualquier carpeta, no sabe nada acerca de la generación de nombres 8.3 en la máquina de los usuarios finales ... – Anders

+0

No puedo encontrar nada para respaldarlo en este momento, pero estoy bastante seguro de que C: \ PROGRA ~ 1 siempre va a apuntar a la carpeta C: \ Archivos de programa, así como lo siguiente ... 'C: \ PROGRA ~ 1 == C: \ Archivos de programa' ' C: \ PROGRA ~ 2 == C: \ Archivos de programa (x86) ' ' C: \ PROGRA ~ 3 == C: \ ProgramData' 'C: \ DOCUME ~ 1 == C: \ Documents and Settings' ' C : \ SYSTEM ~ 1 == C: \ System Volume Information' .. Podría estar equivocado .. – wasatchwizard

Respuesta

17

Quiere usar variables de entorno para buscar cosas como esta. En Windows 32bit, %ProgramFiles% es tu amigo.

En Windows de 64 bits, las cosas son un poco más complicadas, ya que la aplicación se puede instalar tanto en %ProgramFiles% como en %ProgramFiles(x86)%.

Si no puede buscar la ubicación de Jasper de otra manera (configuración de programa de instalación del registro), su mejor opción es buscar en ambos lugares y buscar uno donde encuentre el directorio esperado.

Editar vi la etiquetansis - estás creando un instalador? En ese caso, la constante $ProgramFiles podría ser útil.

+0

Sí, estoy creando un instalador usando el script NSIS, ¿Cómo puedo escribir el script anterior para NSIS. – Sharad

+0

Si uso $ ProgramFiles, solo busco el directorio Program Files y si mi directorio Jasper está en el directorio Program Files (x86), no funciona. – Sharad

2

En NSIS por lo general puede pretender que x64 no existe y sólo tiene que utilizar $programfiles

En un archivo por lotes; si se define %ProgramFiles(x86)%, puede asumir que está en un sistema de 64 bits y que% ProgramFiles (x86)% es la carpeta de 32 bits y% ProgramFiles% es la carpeta de 64 bits. También puede verificar PROCESSOR_ *: PROCESSOR_ARCHITEW6432 se define para un archivo por lotes de 32 bits que se ejecuta en un sistema de 64 bits. PROCESSOR_ARCHITECTURE es AMD64 para un archivo por lotes de bits x86-64/AMD64 (recuerde que PROCESSOR_ARCHITECTURE no es solo x86 o AMD64, también hay IA64 y para NT4 aún más valores)

También debe tener en cuenta que las variables pueden ser cambiado por el usuario o puede que no exista en absoluto así que si está generando el lote con NSIS, probablemente sea mejor usar las rutas completas que NSIS le brinda ...

+0

¿Cómo puedo resolver el problema de UAC porque el exe que he creado funciona en algún sistema no para todo el sistema? – Sharad

+0

¿Cuál es el problema? – Anders

+0

En realidad, el instalador que he creado no funciona para todos los sistemas. Da el error de permiso. – Sharad

25

Aquí hay una forma de hacerlo, que he copiado de esta fuente: http://social.msdn.microsoft.com/Forums/zh/winforms/thread/69dc2aac-9956-40a0-9826-da48b9003a8e

SET ProgFiles86Root=%ProgramFiles(x86)% 
IF NOT "%ProgFiles86Root%"=="" GOTO win64 
SET ProgFiles86Root=%ProgramFiles% 
:win64 

"%ProgFiles86Root%\name of program" "arguments, etc." 
+1

Creo que esta sería una respuesta "más correcta" ya que estaba tratando de usar declaraciones "SI EXISTE" usando '% ProgramFiles%' y '%% ProgramFiles (x86)%' pero no funcionaría correctamente. Esto resolvió el problema porque determinaba qué directorio estaba disponible y acababa de ejecutar el programa con la ruta de archivo correcta. El otro método que se aceptó como la respuesta, sin embargo, no es lo suficientemente "inteligente" como para determinar si hay un sistema x86 o x64 donde este es. Muchas gracias por esto. – Travis

1

cómo sobre algo tan simple como,

if exist "C:\Program Files (x86)" goto 64bit 

goto 32bit 

:32bit 

(whatever u want to happen for the 32bit system) 

:64bit 

(whatever u want to happen for the 64bit system) 

tengo un script configurado así y funciona perfectamente para ambos sistemas.

lo siento por espacio doble, no quería mantener el formato correcto.

0

Aquí es cómo lo hago:

GOTO %PROCESSOR_ARCHITECTURE% 

:AMD64 
<64Bit code> 
EXIT 

:X86 
<32bit code> 
EXIT 
0

parece que @RenniePet respuesta es buena. Para una alternativa aquí está la forma en que lo hice. Ninguno demasiado eficiente y cribado juntos de las respuestas here, principalmente de la respuesta de @ Samuel.Con esta solución solo se confía en la estructura del directorio: no hay variables de entorno de referencia.

@echo off 
dir "C:\Program Files (x86)\\." > NUL 2>&1 
if errorlevel 0 (
    set PROGRAMS_HOME="C:\Program Files (x86)" 
    GOTO HomeSet 
) 
dir "C:\Program Files\\." > NUL 2>&1 
if errorlevel 0 (
    set PROGRAMS_HOME="C:\Program Files" 
    GOTO HomeSet 
) 
GOTO NotWindows 
:HomeSet 
set PROGRAMS_HOME=%PROGRAMS_HOME:"=% 
echo PROGRAMS_HOME set to *%PROGRAMS_HOME%* 
:NotWindows 
Cuestiones relacionadas