web-dev-qa-db-fra.com

Comment créer un fichier batch qui fonctionne à la fois pour Program Files et Program Files (x86)?

J'ai créé un fichier batch qui copie automatiquement un fichier .sql dans le chemin du serveur Jasper installé (il peut s'agir de n'importe quel répertoire d'installation du logiciel).

Ceci est mon script batch--

C:\PROGRA ~ 2\JASPER ~ 1.0\mysql\bin\mysql.exe -u root -proot <create_database.sql

qui fonctionne lorsque jasper est installé dans Program Files (x86). Comment puis-je le généraliser à la fois pour Program Files et Program Files (x86).

13
Sharad

Vous souhaitez utiliser des variables d'environnement pour rechercher des éléments comme celui-ci. Sous Windows 32 bits, %ProgramFiles% Est votre ami.

Sous Windows 64 bits, les choses sont un peu plus compliquées, car l'application peut être installée à la fois dans %ProgramFiles% Et %ProgramFiles(x86)%.

Si vous ne pouvez pas rechercher l'emplacement de Jasper d'une autre manière (registre? Paramètres du programme installé?), Votre meilleur pari est de regarder dans les deux endroits et de prendre celui où vous trouvez le répertoire attendu.

Modifier Vu la balise nsis - créez-vous un programme d'installation? Dans ce cas, la constante $ ProgramFiles pourrait être utile.

18
Anders Lindahl

Voici une façon de le faire, que j'ai copiée à partir de cette source: 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."
25
RenniePet

Dans NSIS, vous pouvez généralement simplement prétendre que x64 n'existe pas et utiliser simplement $programfiles

Dans un fichier batch; si % ProgramFiles (x86)% est défini, vous pouvez supposer que vous êtes sur un système 64 bits et que% ProgramFiles (x86)% est le dossier 32 bits et% ProgramFiles% est le dossier 64 bits . Vous pouvez également vérifier que PROCESSOR_ *: PROCESSOR_ARCHITEW6432 est défini pour un fichier de commandes 32 bits exécuté sur un système 64 bits. PROCESSOR_ARCHITECTURE est AMD64 pour un fichier batch x86-64/AMD64 bit (N'oubliez pas que PROCESSOR_ARCHITECTURE n'est pas seulement x86 ou AMD64, il y a aussi IA64 et pour NT4 encore plus de valeurs)

Vous devez également garder à l'esprit que les variables peuvent être modifiées par l'utilisateur ou peuvent ne pas exister du tout, donc si vous générez le lot avec NSIS, il est probablement préférable d'utiliser les chemins complets que NSIS vous donne ...

3
Anders

que diriez-vous de quelque chose de simple comme,

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)

j'ai un script configuré comme celui-ci et fonctionne parfaitement pour les deux systèmes.

désolé pour le double espacement, il ne voulait pas garder le format correct.

1
JayF_ITAnalyst

Voici comment je le fais:

GOTO %PROCESSOR_ARCHITECTURE%

:AMD64
<64Bit code>
EXIT

:X86
<32bit code>
EXIT
0
Adam

On dirait que la réponse @RenniePet est bonne. Pour une alternative, voici comment je l'ai fait. Pas trop efficace et regroupé à partir des réponses ici , principalement de la réponse de @ Samuel. Avec cette solution, seule la structure du répertoire est utilisée: il n'y a pas de variables d'environnement de référence.

@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
0
Chris Murphy