2014-11-23 14 views
5

Tôi muốn chương trình của mình chạy ở chế độ 32 bit nếu trong hệ điều hành 32 bit hoặc ở chế độ 64 bit nếu nó ở trong hệ điều hành 64 bit. Chương trình đó được tạo ra với Bat To Exe Converter v2.1.4, do đó, nó cơ bản là một tập tin thực thi. Thông thường khi tôi chạy một tập tin thực thi trên một hệ điều hành 32 bit nó chạy ở chế độ 32 bit và khi tôi chạy nó trên một hệ điều hành 64 bit nó chạy ở chế độ 64 bit, phải không? Vấn đề là, bằng cách sử dụng Bat To Exe Converter v2.1.4 Tôi có thể chọn nếu chương trình là 32 hoặc 64 bit. Vì vậy, tôi phải chọn 32 hoặc khác tôi không nghĩ rằng nó sẽ chạy trên một hệ điều hành 32 bit. Tôi đã thử sử dụng các tệp .vbs để khởi chạy lại chương trình bằng cách sử dụng .Run.ShellExecute nhưng kết quả là kiến ​​trúc giống với cấu trúc được đặt trong bộ chuyển đổi. Tôi cũng đã thử cmd /c%WINDIR%\System32\cmd.exe /c và cũng %WINDIR%\SysWOW64\cmd.exe /c nhưng tôi không thể tìm thấy cách để thực hiện. Tôi sử dụng Windows 8.0 x64 và máy ảo của tôi là Windows 8.1 x64.Cách chạy tập tin batch ở chế độ 64 bit từ một tập tin batch ở chế độ 32 bit

Trả lời

2
c:\windows\sysnative 

Cấp quyền truy cập vào System32 cho các chương trình 32 bit.

32 Bit

C:\Windows\System32 accesses syswow64 
c:\windows\sysnative accesses System32 

64 Bit chỉ làm những gì đang nói, truy cập vào các thư mục trực tiếp - ví dụ như C: \ windows \ system32 truy cập System32 và C: \ Windows \ SysWOW64 truy cập SysWOW64.

Vấn đề là bạn chỉ nên viết chương trình 32 bit. Các chương trình 64 bit chủ yếu là 32 bit trong nội bộ (chỉ các địa chỉ bộ nhớ là 64 bit mọi thứ khác vẫn còn 32 bit). 64 bit dành cho ứng dụng máy chủ. Sử dụng 32 bit cho các chương trình chung.

EDIT

32 chương trình Bit là 32 bit với một quyết chế độ 64 bit trong đó 32 bit (địa chỉ cơ sở luôn luôn là 0 trong Windows) là không sử dụng vì vậy chỉ 32 bit (offset) là bắt buộc cho các địa chỉ bộ nhớ .

64 Chương trình bit là 32 bit với địa chỉ bộ nhớ bitmap 64 bit (Tôi không biết kích thước của địa chỉ cơ sở ở chế độ 64 bit vì chúng luôn là 0 và không liên quan trong nhiều thập kỷ). Một chương trình 64 bit có thể trở thành một chương trình 64 bit đầy đủ, chỉ bằng cách sử dụng các hướng dẫn 64 bit khi nó chọn, nói chung cho các nhiệm vụ xử lý khoa học hoặc video. Nhưng 64 bit tất cả mọi thứ nhai quá nhiều bộ nhớ và Windows 'và thư viện khác mong đợi các giá trị 32 bit.

Hiệu trưởng chung là bạn không cần phải làm gì để đạt được nhiệm vụ của mình. Mọi người gặp rắc rối khi họ bắt đầu suy nghĩ về 32bit/64bit. Nếu bạn bỏ qua bitness, Microsoft đã đặt tất cả công việc vào để làm cho nó hoạt động.

Nếu bạn gõ iexpress trong hộp thoại Bắt đầu - Chạy (Winkey + R), bạn sẽ có thể tạo bat2exe của riêng mình.

+0

Bạn có thể quan tâm đến việc này http://social.msdn.microsoft.com/Forums/en-US/adcae113-4758-481a-a367-60d5d14d97d6/this- là-how-to-turn-vbs-và-js-files-into-exe-files-from-the-command-line-không-bên thứ ba-công cụ? forum = scripting –

+0

Tôi đã thử iexpress trên hệ điều hành 64 bit của mình và nó hoạt động, nhưng tôi tự hỏi nếu chương trình tương tự có thể chạy trong một hệ điều hành 32 bit. Tôi muốn chương trình của tôi để chạy trong 64 bit chế độ công cụ đăng ký becausesome là không thể truy cập với reg.exe được gọi là từ một tập tin batch 32 bit. Tôi không thể thêm một giá trị vào "HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Run" trừ khi tôi trực tiếp chạy tập tin thực thi hoặc tôi biên dịch nó ở chế độ 64 bit (hoặc với iExpress). – SkYWAGz

+0

Xem 'reg flags /?' –

4

Bạn có thể sử dụng sau ở phía trên của tập tin thực thi của bạn:

@echo off 
set "SystemPath=%SystemRoot%\System32" 
if not "%ProgramFiles(x86)%"=="" set "SystemPath=%SystemRoot%\Sysnative" 

Tiếp theo, bạn cần phải gọi mọi ứng dụng giao diện điều khiển trong System32 thư mục của Windows với %SystemPath% trong tập tin batch của bạn, ví dụ %SystemPath%\findstr.exe. Tất nhiên bạn cũng có thể bắt đầu cmd với %SystemPath%\cmd.exe để chạy luôn trình thông dịch dòng lệnh 64 bit từ bên trong tệp lô.

Cách hoạt động?

Biến môi trường SystemPath được đặt trước thành thư mục System32 của Windows.

Tệp lô được đóng gói thành tệp thực thi 32 bit chạy ngay bây giờ tất cả ứng dụng bảng điều khiển thực sự từ thư mục System32 trên Windows 32 bit, nhưng từ thư mục %SystemRoot%\SysWOW64 trên Windows 64 bit.

Do đó, tệp lô sẽ kiểm tra tiếp theo nếu biến môi trường ProgramFiles (x86) tồn tại trong trường hợp này chỉ trên Windows x64. Do đó, điều kiện trên dòng thứ ba là sai trên Windows x86 và SystemPath không thay đổi. Nhưng SystemPath được sửa đổi thành %SystemRoot%\Sysnative trên Windows 64 bit để gọi các ứng dụng trong %SystemRoot%\System32 từ thực thi 32 bit tương ứng cmd.exe mà không cần chuyển hướng đến %SystemRoot%\SysWOW64.

Để biết thêm chi tiết, xem File System Redirector bài viết trong Microsoft Developer Network (MSDN).

Nhưng tốt hơn là nên làm điều đó tất cả các bên trong phiên bản 32-bit thực thi mà trích xuất các tập tin batch để %TEMP% và chạy nó hoặc với

%SystemRoot%\System32\cmd.exe /C "%TEMP%\ExtractedBatch.bat" 

cho Windows 32-bit nơi biến môi trường ProgramFiles (x86) không tồn tại hoặc với

%SystemRoot%\Sysnative\cmd.exe /C "%TEMP%\ExtractedBatch.bat" 

trên Windows 64 bit. Dưới đây là một trong nhiều mã có thể được sử dụng ở trên cùng của một tập tin thực thi để chạy luôn các ứng dụng giao diện điều khiển 64 bit độc lập khi được khởi động trên Windows x64 với 32-bit hoặc với 64232 bit cmd.exe.

@echo off 
set "SystemPath=%SystemRoot%\System32" 
if not "%ProgramFiles(x86)%"=="" (
    if exist %SystemRoot%\Sysnative\* set "SystemPath=%SystemRoot%\Sysnative" 
) 

Trên Windows x64, nó được kiểm tra bổ sung nếu có tệp trong %SystemRoot%\Sysnative. Trong trường hợp này, tập tin thực thi được thực hiện với 32 bit cmd.exe và chỉ trong trường hợp này, %SystemRoot%\Sysnative cần được sử dụng. Nếu không, %SystemRoot%\System32 cũng có thể được sử dụng trên Windows x64 như khi tệp lô được bắt đầu với 64 bit cmd.exe, đây là thư mục chứa các ứng dụng giao diện điều khiển 64 bit.

Lưu ý: %SystemRoot%\Sysnative không phải là một thư mục. Nó không thể cd để %SystemRoot%\Sysnative hoặc sử dụng if exist %SystemRoot%\Sysnative

+0

Nó đã giúp nhưng tôi vẫn bị mất, khi tôi chạy tập tin batch trực tiếp nó "% windir% \ Sysnative" không tồn tại – SkYWAGz

+0

File batch hoạt động như mong đợi, được thử nghiệm trên Windows 7 x64 và Windows XP x86. – Mofi

+0

Khi tôi nhập cd% windir% \ Sysnative nó không thành công. – SkYWAGz

Các vấn đề liên quan