2012-04-09 41 views
13

Tôi đã tạo một tệp lô tự động sao chép tệp .sql vào đường dẫn của máy chủ Jasper đã cài đặt (có thể là bất kỳ thư mục cài đặt phần mềm nào).Làm thế nào để tạo một tập tin thực thi cho cả Program Files và Program Files (x86)?

Đây là lô của tôi script--

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

rằng đang làm việc khi jasper được cài đặt trong Program Files (x86). Làm thế nào tôi có thể khái quát hóa nó cho cả tệp chương trình và tệp chương trình (x86).

+0

Còn về "Archivos de programa" thì sao? –

+0

C: \ PROGRA ~ 2 có thể là bất kỳ thư mục nào, bạn không biết gì về việc tạo tên 8.3 trên máy người dùng cuối ... – Anders

+0

Tôi không thể tìm thấy bất kỳ thứ gì để sao lưu vào lúc này, nhưng tôi khá chắc chắn rằng C: \ PROGRA ~ 1 luôn luôn trỏ đến thư mục C: \ Program Files, cũng như sau .. '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' .. Tôi có thể sai mặc dù .. – wasatchwizard

Trả lời

17

Bạn muốn sử dụng các biến môi trường để tìm kiếm những thứ như thế này. Trên Windows 32 bit, %ProgramFiles% là bạn của bạn.

Trên Windows 64 bit, mọi thứ phức tạp hơn một chút, vì ứng dụng có thể được cài đặt cả trong %ProgramFiles%%ProgramFiles(x86)%.

Nếu bạn không thể tra cứu vị trí của Jasper theo cách khác (đăng ký? Cài đặt chương trình được cài đặt?), Đặt cược tốt nhất của bạn là xem cả hai địa điểm và chọn nơi bạn tìm thấy thư mục mong muốn.

Sửa Saw the NSIS thẻ - bạn đang tạo một trình cài đặt? Trong trường hợp đó, hằng số $ProgramFiles có thể hữu ích.

+0

Có, tôi đang tạo một trình cài đặt bằng kịch bản NSIS, Làm thế nào tôi có thể viết kịch bản trên cho NSIS. – Sharad

+0

Nếu tôi sử dụng $ ProgramFiles, nó chỉ tìm kiếm thư mục Program Files và nếu thư mục Jasper của tôi nằm trong thư mục Program Files (x86) thì nó không hoạt động. – Sharad

2

Trong NSIS bạn có thể thường chỉ giả vờ x64 mà không tồn tại và chỉ sử dụng $programfiles

Trong một tập tin thực thi; nếu %ProgramFiles(x86)% được xác định thì bạn có thể giả định rằng bạn đang sử dụng hệ thống 64 bit và% ProgramFiles (x86)% là thư mục 32 bit và% ProgramFiles% là thư mục 64 bit. Bạn cũng có thể kiểm tra PROCESSOR_ *: PROCESSOR_ARCHITEW6432 được định nghĩa cho một tập tin batch 32 bit chạy trên một hệ thống 64 bit. PROCESSOR_ARCHITECTURE là AMD64 cho tệp hàng loạt bit x86-64/AMD64 (Hãy nhớ rằng PROCESSOR_ARCHITECTURE không chỉ là x86 hoặc AMD64, còn có cả IA64 và NT4 nhiều giá trị hơn)

Bạn cũng nên nhớ rằng các biến có thể thay đổi bởi người sử dụng hoặc có thể không tồn tại ở tất cả vì vậy nếu bạn đang tạo ra các lô với NSIS nó có lẽ là tốt hơn để sử dụng đường dẫn đầy đủ NSIS cung cấp cho bạn ...

+0

Làm thế nào tôi có thể giải quyết vấn đề UAC vì exe mà tôi đã tạo ra các công trình trên một số hệ thống không phải cho tất cả các hệ thống? – Sharad

+0

Vấn đề là gì? – Anders

+0

Thực ra là trình cài đặt mà tôi đã tạo, không hoạt động đối với tất cả các hệ thống. Nó cho phép lỗi. – Sharad

25

Đây là một cách để làm điều đó, mà tôi đã sao chép từ nguồn này: 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

Tôi tin rằng đây sẽ là một câu trả lời "chính xác hơn" vì tôi đã cố gắng sử dụng các câu lệnh "IF EXISTS" bằng cách sử dụng '% ProgramFiles%' và '%% ProgramFiles (x86)%' nhưng nó sẽ không hoạt động chính xác. Điều này giải quyết vấn đề bởi vì nó xác định thư mục nào đã có sẵn và chỉ thực hiện chương trình với đường dẫn tệp chính xác. Tuy nhiên, phương pháp khác được chấp nhận là câu trả lời không đủ "thông minh" để xác định xem có hệ thống x86 hay x64 ở đâu không. Cảm ơn bạn rất nhiều cho việc này. – Travis

1

cách đơn giản như thế nào,

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) 

tôi có một tập lệnh được thiết lập như thế này và hoạt động hoàn hảo cho cả hai hệ thống.

xin lỗi vì khoảng trống đôi nó không muốn giữ định dạng đúng.

0

Sau đây là cách tôi làm điều đó:

GOTO %PROCESSOR_ARCHITECTURE% 

:AMD64 
<64Bit code> 
EXIT 

:X86 
<32bit code> 
EXIT 
0

Có vẻ như @RenniePet Câu trả lời là tốt. Đối với một thay thế ở đây là cách tôi đã làm nó. Không có gì quá hiệu quả và nôi với nhau từ các câu trả lời here, chủ yếu là từ câu trả lời của @ Samuel.Với giải pháp này chỉ cấu trúc thư mục đang được dựa vào: không có biến môi trường tham chiếu.

@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 
Các vấn đề liên quan