2016-06-30 5 views
2

Also schrieb ich eine Batch-Datei, um Clients zu einem Cloud-Dienst zu konvertieren, und ich sehe ein seltsames Verhalten davon.Batch-Datei verhält sich anders, wenn es von einem SFX lief

Also das im Grunde nach einem bestimmten Ordner sucht und ob es existiert GOTO, um fortzufahren. Wenn ich dies mit WinRAR in einen SFX komprimiere und ihn anwiese, die Batch-Datei auszuführen, entdeckt es NIEMALS den Ordner, aber wenn ich die Batch-Datei selbst ausführe, erkennt es IMMER den Ordner, ob er da ist oder nicht. Ich habe versucht, dies jetzt für ein paar Tage herauszufinden, und ich verstehe einfach nicht, warum das passiert.

@ECHO Off 
CD %~dp0 
Goto DisableLocal 


:DisableLocal 
IF EXIST "%ProgramFiles%\Server\" (
    GOTO Server 
) ELSE (
GOTO Config 
) 
+0

Wie erstellt die SFX-Datei mit einer GUI oder mit der Befehlszeile von winrar? und wusstest du die SFX-Optionen oder nicht? – Hackoo

+0

Ich habe die GUI verwendet. Herausgefunden, was es tut, aber ich weiß immer noch nicht warum. Wenn ich den SFX starte und ihn laufe, behandelt er% ProgramFiles% als 32-Bit, so dass es auf/Program Files (x86)/verweist, wenn ich nur die Batch-Datei starte, dessen 64-Bit. – ENorum

Antwort

0

Für 32-Bit-Anwendungen ausgeführt auf 64-Bit-Windows die Umgebungsvariable Program wird auf den Wert der Umgebungsvariablen Programfiles (x86) gesetzt von Windows als Microsoft WOW64 Implementation Details in MSDN-Artikel erklärt.

Das WinRAR SFX-Archiv wird offensichtlich mit dem x86 SFX-Modul erstellt. Das SFX-Archiv kann auch mit dem x64 SFX-Modul erstellt werden, aber dieses SFX-Archiv kann nur unter Windows x64 ausgeführt werden.

Die Stapeldatei wird mit 32-Bit cmd.exe in einer 32-Bit-Umgebung ausgeführt, wenn das x86-SFX-Modul beim Erstellen des Archivs verwendet wird.

Es ist also besser, den Stapelcode anzupassen und eine Erkennung für 32-Bit-Ausführung auf 64-Bit-Windows hinzuzufügen.

@ECHO OFF 
CD /D "%~dp0" 
GOTO DisableLocal 

:DisableLocal 
SET "ServerPath=%ProgramFiles%\Server\" 
IF EXIST "%ServerPath%" GOTO Server 

REM Is batch file processed in 32-bit environment on 64-bit Windows? 
REM This is not the case if there is no variable ProgramFiles(x86) 
REM because variable ProgramFiles(x86) exists only on 64-bit Windows. 
IF "%ProgramFiles(x86)%" == "" GOTO Config 

REM On 64-bit Windows 7 and later 64-bit Windows there is the variable 
REM ProgramW6432 with folder path of 64-bit program files folder. 
IF NOT "%ProgramW6432%" == "" (
    SET "ServerPath=%ProgramW6432%\Server\" 
    IF EXIST "%ProgramW6432%\Server\" GOTO Server 
) 

REM For Windows x64 prior Windows 7 x64 and Windows Server 2008 R2 x64 
REM get 64-bit program files folder from 32-bit program files folder 
REM with removing the last 6 characters from folder path, i.e. " (x86)". 
SET "ServerPath=%ProgramFiles:~0,-6%\Server\" 
IF EXIST "%ServerPath%" GOTO Server 

:Config 
ECHO Need configuration. 
GOTO :EOF 

:Server 
ECHO Server path is: %ServerPath%