2012-04-09 16 views
13

Utworzono plik wsadowy, który automatycznie kopiuje plik .sql na ścieżkę zainstalowanego serwera Jasper (może to być dowolny katalog instalacyjny oprogramowania).Jak utworzyć plik wsadowy, który działa zarówno w przypadku plików programu, jak i plików programu (x86)?

To jest mój SERII script--

C: \ progra ~ 2 \ JASPER ~ 1.0 \ mysql \ bin \ mysql.exe -u korzeń -proot < create_database.sql

który pracuje przy Jasper jest zainstalowany w Program Files (x86). Jak mogę uogólnić to zarówno dla plików programu, jak i plików programu (x86).

+0

Co z "Archivos de programa"? –

+0

C: \ PROGRA ~ 2 może być dowolnym folderem, nie wiesz nic o generowaniu nazw 8.3 na komputerze użytkowników końcowych ... – Anders

+0

Nie mogę znaleźć niczego, co by to zrobiło, ale jestem całkiem pewny, że C: \ PROGRA ~ 1 zawsze wskaże folder C: \ Program Files, a także poniższe. 'C: \ PROGRA ~ 1 == C: \ Program Files' ' C: \ PROGRA ~ 2 == C: \ Program Files (x86) ' ' C: \ PROGRA ~ 3 == C: \ ProgramData' 'C: \ DOCUME ~ 1 == C: \ Documents and Settings' ' C : \ SYSTEM ~ 1 == C: \ System Volume Information' .. Mogę się mylić chociaż .. – wasatchwizard

Odpowiedz

17

Chcesz używać zmiennych środowiskowych do wyszukiwania takich rzeczy. W 32-bitowym systemie Windows, %ProgramFiles% jest twoim przyjacielem.

W 64-bitowych systemach Windows rzeczy są nieco bardziej skomplikowane, ponieważ aplikacja może być zainstalowana zarówno w %ProgramFiles% i %ProgramFiles(x86)%.

Jeśli nie możesz wyszukać lokalizacji Jaspera w inny sposób (ustawienia? Zainstalowanych programów?), Najlepiej jest poszukać w obu miejscach i wybrać miejsce, w którym znajduje się oczekiwany katalog.

Edit Widziałem NSIS tag - ty tworzenia instalatora? W takim przypadku przydatna może być stała $ProgramFiles.

+0

Tak, tworzę instalator za pomocą skryptu NSIS, Jak mogę napisać powyższy skrypt dla NSIS. – Sharad

+0

Jeśli użyję $ ProgramFiles, wyszukuję tylko katalog Program Files i jeśli mój katalog Jaspera znajduje się w katalogu Program Files (x86), to nie działa. – Sharad

2

W NSIS można zazwyczaj tylko udawać, że 64 nie istnieje i wystarczy użyć $programfiles

w pliku wsadowym; jeśli zdefiniowano %ProgramFiles(x86)%, można założyć, że znajdujesz się w systemie 64-bitowym, a% ProgramFiles (x86)% jest folderem 32-bitowym, a% ProgramFiles% - folderem 64-bitowym. Możesz także sprawdzić PROCESSOR_ *: PROCESSOR_ARCHITEW6432 jest zdefiniowany dla 32-bitowego pliku wsadowego działającego w 64-bitowym systemie. PROCESSOR_ARCHITECTURE to AMD64 dla pliku wsadowego bitowego x86-64/AMD64 (pamiętaj, że PROCESSOR_ARCHITECTURE to nie tylko x86 lub AMD64, jest też IA64, a dla NT4 jeszcze więcej wartości)

Należy również pamiętać, że zmienne mogą być zmieniony przez użytkownika lub może w ogóle nie istnieć, więc jeśli generujesz partię z NSIS, prawdopodobnie lepiej jest użyć pełnych ścieżek NSIS daje ci ...

+0

Jak mogę rozwiązać problem UAC, ponieważ exe, który utworzyłem działa na niektórych systemach nie dla wszystkich systemów? – Sharad

+0

Na czym polega problem? – Anders

+0

W rzeczywistości instalator, który utworzyłem, nie działa we wszystkich systemach. Daje błąd uprawnień. – Sharad

25

Oto jeden sposób robienia tego, który skopiowałem z tego źródła: 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

Wierzę, że byłaby to "bardziej poprawna" odpowiedź, ponieważ próbowałem użyć instrukcji "IF EXISTS" przy użyciu "% ProgramFiles%" i "%% ProgramFiles (x86)%", ale nie działałoby poprawnie. Rozwiązało to problem, ponieważ określił, który katalog był dostępny i po prostu wykonał program z poprawną ścieżką pliku. Druga metoda, która została przyjęta jako odpowiedź, nie jest jednak wystarczająco "inteligentna", aby określić, czy istnieje system x86 lub x64, w którym jest taki system. Bardzo ci za to dziękuję. – Travis

1

jak o coś prostego jak,

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) 

Mam skonfigurowany skrypt i działa idealnie dla obu systemów.

Przepraszam za podwójny odstęp, który nie chciał zachować poprawności formatu.

0

Oto jak to zrobić:

GOTO %PROCESSOR_ARCHITECTURE% 

:AMD64 
<64Bit code> 
EXIT 

:X86 
<32bit code> 
EXIT 
0

Wygląda @RenniePet odpowiedź jest dobra. Alternatywą jest tutaj sposób, w jaki to zrobiłem. Żadne nie jest zbyt wydajne i nie zawierało odpowiedzi z odpowiedzi here, głównie z odpowiedzi @ Samuela.Dzięki temu rozwiązaniu bazuje się tylko na strukturze katalogów: nie ma zmiennych środowiskowych odniesienia.

@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 
Powiązane problemy