2

So I wrote a batch file to convert clients over to a cloud service and I'm seeing some weird behavior from it.

So this basically looks for a specific folder and whether or not it exists it uses GOTO to move on. When I compress this using WinRAR into a SFX and instruct it to run the batch file it NEVER detects the folder, however, when I run the batch file itself, it ALWAYS detects the folder, whether its there or not. I've been trying to figure this out for a few days now and I just don't understand why this is happening.

@ECHO Off
CD %~dp0
Goto DisableLocal


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

2 に答える 2

0

64 ビット Windows で実行される 32 ビット アプリケーションの場合、Microsoft が MSDN の記事WOW64 実装の詳細で説明しているように、Windows によって環境変数ProgramFilesが環境変数ProgramFiles(x86)の値に設定されます。

WinRAR SFX アーカイブは、明らかに x86 SFX モジュールを使用して作成されています。SFX アーカイブは x64 SFX モジュールを使用して作成することもできますが、この SFX アーカイブは Windows x64 でのみ実行できます。

cmd.exex86 SFX モジュールを使用してアーカイブを作成すると、32 ビット環境でバッチ ファイルが 32 ビットで実行されます。

そのため、バッチ コードを調整し、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, 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%
于 2016-07-01T06:53:09.260 に答える
0

私は同じ問題を抱えています。私はこの方法を試していますが、Windows 32 ビットで動作するかどうかはわかりません。

@ECHO Off
IF DEFINED ProgramW6432 (
    SET "ServerPath=%ProgramW6432%\Server\"
) ELSE (
    SET "ServerPath=%ProgramFiles%\Server\"
)

CD %~dp0
Goto DisableLocal

:DisableLocal
 IF EXIST "%ServerPath%" (
   GOTO Server
) ELSE (
GOTO Config
)
于 2018-05-03T06:30:36.847 に答える