BATCH - IF-операторы, использующие переменные для пути к файлу - PullRequest
1 голос
/ 20 марта 2012

У меня есть пакетный скрипт, я думаю, что моя проблема связана с круглыми скобками, но я не уверен, как обойти это

Вот и все

REM  Detect if the OS is x86 or x64
IF DEFINED PROGRAMFILES(x86) (
  REM x64
  SET "_PROGRAMFILES=%PROGRAMFILES(x86)%"
  GOTO MAIN_PROGRAM
) ELSE (
  REM x86
  SET "_PROGRAMFILES=%PROGRAMFILES%"
  GOTO MAIN_PROGRAM
)
:MAIN_PROGRAM
SET "MY_EXE=%_PROGRAMFILES%\MYFOLDER\MYEXE.exe"
IF EXIST "%MY_EXE%" (
    ECHO YES
) ELSE (
    ECHO NO
)

Запустить это наx86 и все в порядке, поскольку путь для проверки - C: \ Program Files \ MYFOLDER \ MYEXE.exe

Запустите его на x64, и он разразится "не ожидается в это время"

I 'Я вполне уверен, что это связано с путем C: \ Program Files (x86) \

Как я могу обойти (x86), вот в чем проблема


NEW

    REM Is the OS x86

    IF "%PROCESSOR_ARCHITECTURE%" == "x86" (

      SET "_PROGRAMFILES=%PROGRAMFILES%"
      SET "_ARCH=x86"  

      ECHO CPU Architecture is: "%_ARCH%"
      ECHO Program Files Directory is: "%_PROGRAMFILES%"

      GOTO MAIN_PROGRAM

    ) 

    REM Is the OS AMD64

    IF "%PROCESSOR_ARCHITECTURE%" == "AMD64" (

      SET "_PROGRAMFILES=%PROGRAMFILES(x86)%"
      SET "_ARCH=x86"

      ECHO CPU Architecture is: "%_ARCH%"
      ECHO Program Files Directory is: "%_PROGRAMFILES%"

      GOTO MAIN_PROGRAM

    )


    GOTO ERROR_OS_ARCH

    :ERROR_OS_ARCH

    CLS

    cWnd.exe /SHOW @

    ECHO.
    ECHO Error 100: Operating System Architecture not Supported. Contact your IT Department
    ECHO.

    EXIT /B

Ответы [ 2 ]

1 голос
/ 06 апреля 2012

Это довольно просто, я думаю ...

Как определить ОС:

FOR /F "tokens=1 skip=1" %%a IN ( 'wmic os get OSArchitecture' ) DO (IF /I '%%a'== '64-bit' (set osArch=64) ELSE (IF /I '%%a'== '32-bit' (set osArch=32)))

Далее добраться до нужной папки программных файлов:

FOR /F "tokens=1,2 delims==" %%a IN ( '^set "ProgramFiles"' ) DO set _PROGRAMFILES=%%a

Реально вам просто нужна вышеупомянутая строка.

Попробуйте это ...

FOR /F "tokens=1,2 delims==" %%a IN ( 
'^set "ProgramFiles"' 
) DO set _PROGRAMFILES=%%a
GOTO MAIN_PROGRAM

:MAIN_PROGRAM
SET "MY_EXE=%_PROGRAMFILES%\MYFOLDER\MYEXE.exe"
IF EXIST "%MY_EXE%" (
    ECHO YES
) ELSE (
    ECHO NO
)
1 голос
/ 21 марта 2012

У меня были некоторые проблемы с оператором else ... вы могли бы просто сделать это с двумя операторами if.

IF DEFINED PROGRAMFILES(x86) (
  REM x64
  SET "_PROGRAMFILES=%PROGRAMFILES(x86)%"
  GOTO MAIN_PROGRAM
)
IF NOT DEFINED PROGRAMFILES(x86) (
  REM x86
  SET "_PROGRAMFILES=%PROGRAMFILES%"
  GOTO MAIN_PROGRAM
)

Или это также может быть использование () в имени переменной:ПРОГРАММЫ (x86) и пакет становится запутанным.возможно попробуйте изменить это имя переменной на PROGRAMFILES_x86 .Просто как бы плеваться здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...