batch file从SFX运行时的行为不同

所以我写了一个batch file,将客户端转换成云服务,我看到了一些奇怪的行为。

所以这基本上寻找一个特定的文件夹,是否存在它使用GOTO继续前进。 当我使用WinRAR将其压缩到SFX并指示它运行batch file时,它从不检测文件夹,但是,当我运行batch file本身时,总是检测文件夹,无论是否存在。 我一直试图弄清楚这几天,我只是不明白为什么会发生这种情况。

@ECHO Off CD %~dp0 Goto DisableLocal :DisableLocal IF EXIST "%ProgramFiles%\Server\" ( GOTO Server ) ELSE ( GOTO Config ) 

对于在64位Windows上执行的32位应用程序,环境变量ProgramFiles被Windows设置为环境变量ProgramFiles(x86)的值,如Microsoft在MSDN文章WOW64 Implementation Details中所述 。

WinRAR SFX存档是使用x86 SFX模块创建的。 SFX存档也可以使用x64 SFX模块创建,但是这个SFX存档只能在Windows x64上执行。

如果使用x86 SFX模块创建归档文件,批处理文件将在32位环境中使用32位cmd.exe执行。

所以更好的做法是调整批处理代码,并在64位Windows上为32位执行添加检测。

 @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, ie " (x86)". SET "serverPath=%ProgramFiles:~0,-6%\server\" IF EXIST "%serverPath%" GOTO server :Config ECHO Need configuration. GOTO :EOF :server ECHO server path is: %serverPath%