2014-11-23 4 views
5

32 비트 OS에서는 32 비트 모드로 실행하거나 64 비트 OS에서는 64 비트 모드로 실행하고 싶습니다. 이 프로그램은 으로 만들어졌습니다. Exe Converter v2.1.4에 배트하기 때문에 기본적으로 배치 파일입니다. 일반적으로 32 비트 OS에서 배치 파일을 실행하면 32 비트 모드로 실행되며 64 비트 OS에서 실행하면 64 비트 모드로 실행됩니다. 문제는, 사용 Exe 변환기 v2.1.4에 박쥐 프로그램이 32 또는 64 비트인지 선택할 수 있습니다. 32 비트를 선택해야합니다. 그렇지 않으면 32 비트 OS에서 실행되지 않을 것입니다. .vbs 파일을 사용하여 .Run.ShellExecute을 사용하여 프로그램을 다시 시작했지만 결과적으로 변환기에서 설정된 것과 동일한 아키텍처가 생성되었습니다. 나는 또한 cmd /c%WINDIR%\System32\cmd.exe /c 그리고 또한 %WINDIR%\SysWOW64\cmd.exe /c을 시도했지만 그 방법을 찾지 못했습니다. 저는 Windows 8.0 x64를 사용하고 VM은 Windows 8.1 x64입니다.배치 파일을 32 비트 모드의 배치 파일에서 실행하는 방법

답변

2
c:\windows\sysnative 

32 비트 프로그램의 경우 System32에 대한 액세스 권한을 부여합니다.

32 비트

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

64 비트 그냥 직접 폴더에 접근, 말 있잖아 - 예를 들어 C : \ WINDOWS를 \ system32를가 SYSTEM32와 C에 액세스 : \ WINDOWS를 \ syswow64로는 syswow64로는 액세스합니다.

요점은 32 비트 프로그램 만 작성해야한다는 것입니다. 64 비트 프로그램은 대부분 내부적으로 32 비트입니다 (메모리 주소는 64 비트 만 나머지는 32 비트로 유지됩니다). 64 비트는 서버 앱용입니다. 일반 프로그램에는 32 비트를 사용하십시오.

EDIT

32 비트 프로그램은 32 비트 메모리 어드레스 필요 미사용 때문에 32 비트 (오프셋)이다 (베이스 어드레스는 항상 윈도우에서 0)되는 64 비트 어드레싱 모드와 32 비트 .

64 비트 프로그램은 64 비트 오프셋 메모리 주소가있는 32 비트입니다 (64 비트 모드에서는 기본 주소의 크기가 항상 0이고 수십 년 동안은 아무 것도 모르기 때문에). 64 비트 프로그램은 일반적으로 과학 또는 비디오 처리 작업을 위해 선택할 때 64 비트 명령어를 사용하여 전체 64 비트 프로그램이 될 수 있습니다. 그러나 64 비트는 모두 너무 많은 메모리를 씹고 Windows 및 다른 라이브러리는 32 비트 값을 예상합니다.

일반 원칙은 작업을 수행하기 위해 아무 것도하지 않아도된다는 것입니다. 사람들이 32 비트/64 비트에 대해 생각하기 시작하면 문제가 생깁니다. 비트 니스를 무시한다면 마이크로 소프트는 모든 작업을 정상적으로 작동하게 만듭니다.

시작 - 실행 (Winkey + R) 대화 상자에 iexpress를 입력하면 자신의 bat2exe를 만들 수 있습니다.

+0

당신이에 관심이있을 수 http://social.msdn.microsoft.com/Forums/en-US/adcae113-4758-481a-a367-60d5d14d97d6/this-를 사용 서드 파티 도구가 아닌 명령 행에서 exe 파일로 변환하는 방법은 무엇입니까? forum = script –

+0

64 비트 OS에서 iexpress를 사용해 보았습니다. 그리고 그것은 효과가 있었지만 동일한 프로그램이 32 비트 OS에서 실행될 수 있는지 궁금합니다. 내 프로그램이 64 비트 모드에서 실행되기를 원하는 레지스트리 요소는 32 비트 배치 파일에서 호출 된 reg.exe로 액세스 할 수 없기를 바랍니다. 직접 배치 파일을 실행하거나 64 비트 모드 (또는 iExpress)로 컴파일하지 않으면 "HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Run"에 값을 추가 할 수 없습니다. – SkYWAGz

+0

'reg 플래그 /? '참조 –

4

당신은 당신의 배치 파일의 맨 위에 다음 사용할 수 있습니다

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

다음 당신은 예를 %SystemPath%\findstr.exe를 들어, 배치 파일에 %SystemPath%와의 Windows System32 디렉터리의 모든 콘솔 응용 프로그램을 호출해야합니다. 물론 cmd%SystemPath%\cmd.exe으로 시작하여 배치 파일 내에서 항상 64 비트 명령 줄 인터프리터를 실행할 수도 있습니다.

어떻게 작동합니까?

환경 변수 SystemPath은 먼저 Windows의 System32 디렉터리로 설정됩니다.

32 비트 실행 파일로 압축 된 배치 파일은 실제로 모든 32 비트 Windows의 System32 디렉터리에서 실행되지만 64 비트 Windows에서는 %SystemRoot%\SysWOW64 디렉터리에서 실행됩니다.

그러므로 배치 파일은 Windows x64에만 해당되는 환경 변수 ProgramFiles (x86)이 있는지 확인합니다. 따라서 Windows x86에서 세 번째 줄의 조건은 false이고 SystemPath은 변경되지 않습니다. 그러나 시스템 경로은 32 비트 실행 파일에서 %SystemRoot%\System32의 응용 프로그램을 각각 cmd.exe으로 호출하고 %SystemRoot%\SysWOW64으로 리디렉션하지 않고 64 비트 Windows에서 %SystemRoot%\Sysnative으로 수정되었습니다.

자세한 내용은 MSDN (Microsoft Developer Network)의 문서를 참조하십시오.

그러나 더 나은 %TEMP%에 배치 파일을 추출하여 32 비트 실행 파일 안에 모든 수행하고 실행하는 것 중 하나와

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

32 비트 Windows 경우 환경 변수 의 ProgramFiles (86)은 존재하지 않거나 또는

(64 비트 Windows)입니다.

Windows x64 (32 비트 또는 64 비트 cmd.exe)에서 시작될 때마다 독립적으로 항상 64 비트 콘솔 응용 프로그램을 실행하기 위해 배치 파일의 맨 위에 사용할 수있는 코드가 하나 더 있습니다. Windows에서

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

파일이 %SystemRoot%\Sysnative에있는 경우는 추가로 체크 X64. 이 경우 배치 파일은 32 비트 cmd.exe으로 실행되며이 경우에만 을 사용해야합니다. 그렇지 않으면 %SystemRoot%\System32은 64 비트 cmd.exe으로 배치 파일을 시작할 때 Windows 64에서 사용할 수 있습니다.이 파일은 64 비트 콘솔 응용 프로그램이 포함 된 디렉토리입니다.

참고 : %SystemRoot%\Sysnative은 (는) 디렉토리가 아닙니다. 그것은 %SystemRoot%\Sysnativecd 할 수 없습니다 또는 if exist %SystemRoot%\Sysnative

+0

도움이되었지만 배치 파일을 직접 실행하면 사라졌습니다. "% windir % \ Sysnative"가 존재하지 않습니다. – SkYWAGz

+0

Windows 7 x64 및 Windows XP x86에서 테스트 한 배치 파일이 예상대로 작동합니다. – Mofi

+0

cd % windir % \ Sysnative를 입력하면 실패합니다. – SkYWAGz

관련 문제