Batch (.bat) - запустить скрипт в зависимости от системы 32 / 64bit [дубликат]

Это решено для меня,

$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

Выход: 2018-04-18

44
задан 5YrsLaterDBA 7 September 2012 в 20:15
поделиться

22 ответа

Я обычно делаю следующее:

:Check_Architecture
if /i "%processor_architecture%"=="x86" (
    IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
        REM Run 32 bit command

    ) ELSE (
        REM Run 64 bit command
    )           
) else (
        REM Run 64 bit command
)
0
ответ дан Adil Hindistan 27 August 2018 в 07:15
поделиться

Многие команды DOS в разных версиях Windows похожи, но могут поддерживать разные параметры. Кроме того, новые версии Windows могут поддерживать новые команды или удалять старые версии. Таким образом, если вы хотите написать командный файл, который может работать на разных типах машин, может оказаться полезным определить версию Windows, на которой запущен командный файл. Таким образом, командный файл может выполнять команды, соответствующие операционной системе.

Следующий командный файл определяет, работает ли на компьютере Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP , Windows 2000 или Windows NT. Его можно легко модифицировать для поддержки других версий Windows по мере необходимости или для установки переменной среды на основе обнаруженной версии Windows. Обратите внимание, что для того, чтобы этот командный файл правильно различался между более новыми версиями Windows Server и потребительскими версиями Windows, он более запутан, чем пакетные файлы, которые вы можете увидеть в другом месте. Я объяснил приведенные ниже рассуждения.

1) Откройте окно «Блокнот».

2) Скопируйте следующий текст в Блокнот (вы можете получить доступ к печатной версии этого наконечника, поскольку некоторые строки завертываются ):

@echo off

ver | find "2003" > nul
if %ERRORLEVEL% == 0 goto ver_2003

ver | find "XP" > nul
if %ERRORLEVEL% == 0 goto ver_xp

ver | find "2000" > nul
if %ERRORLEVEL% == 0 goto ver_2000

ver | find "NT" > nul
if %ERRORLEVEL% == 0 goto ver_nt

if not exist %SystemRoot%\system32\systeminfo.exe goto warnthenexit

systeminfo | find "OS Name" > %TEMP%\osname.txt
FOR /F "usebackq delims=: tokens=2" %%i IN (%TEMP%\osname.txt) DO set vers=%%i

echo %vers% | find "Windows 7" > nul
if %ERRORLEVEL% == 0 goto ver_7

echo %vers% | find "Windows Server 2008" > nul
if %ERRORLEVEL% == 0 goto ver_2008

echo %vers% | find "Windows Vista" > nul
if %ERRORLEVEL% == 0 goto ver_vista

goto warnthenexit

:ver_7
:Run Windows 7 specific commands here.
echo Windows 7
goto exit

:ver_2008
:Run Windows Server 2008 specific commands here.
echo Windows Server 2008
goto exit

:ver_vista
:Run Windows Vista specific commands here.
echo Windows Vista
goto exit

:ver_2003
:Run Windows Server 2003 specific commands here.
echo Windows Server 2003
goto exit

:ver_xp
:Run Windows XP specific commands here.
echo Windows XP
goto exit

:ver_2000
:Run Windows 2000 specific commands here.
echo Windows 2000
goto exit

:ver_nt
:Run Windows NT specific commands here.
echo Windows NT
goto exit

:warnthenexit
echo Machine undetermined.

:exit

3) Сохраните файл как% WINDIR% \ whichvers.bat

4) Теперь из командной строки введите:

whichvers

Это покажет, какую версию Windows вы используете.

ПРИМЕЧАНИЯ:

  1. Обоснование использования команды SYSTEMINFO вместо того, чтобы полагаться на Команда VER состоит в том, что Windows Server 2008 «разделяет» номера версий с другими версиями Windows (см. Microsoft). Таким образом, полагаясь на «номер версии» 6.0 для обнаружения Windows Vista или 6.1 для обнаружения Windows 7, невозможно отличить машину от Windows Server 2008 или Windows Server 2008 R2.
  2. Создание% TEMP% \ osname .txt заключается исключительно в том, что я не смог разместить результаты systeminfo | найдите «OS Name» непосредственно в команде for / f - ему не нравятся команды с каналами. Вы можете найти более простой способ справиться с захватом информации из SYSTEMINFO - если да, прокомментируйте.
  3. Переменная среды% vers% имеет ведущие пробелы. Я мог бы удалить их с помощью более длинного командного файла, но в этом случае он не нужен.
  4. Пакетный файл обнаруживает для SYSTEMINFO, поскольку он предполагает, что если он выходит за рамки более старых обнаружений операционной системы, запущенная версия Windows даже старше и не будет иметь этой утилиты. В 64-разрядной версии Windows 7 она по-прежнему находится в папке% SystemRoot% \ system32 - если более поздние версии Windows становятся только 64-разрядными, этот пакетный файл может быть обновлен.

Вернитесь на страницу Windows XP и DOS.

0
ответ дан Dannnno 27 August 2018 в 07:15
поделиться

Я действительно не понимаю некоторые из приведенных здесь ответов (извините за это). Например, опрос с высоким рейтингом не возвращает архитектуру Windows, а дает вам процессорную архитектуру.

Самый безопасный вариант - запрашивать значение BuildLabEx из реестр.

Определить x86 (intel) или x86-64 (amd)

reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".x86fre."   && set "_ARCH_=x86" || set "_ARCH_=x86-64"

Определить x86 (intel ), x86-64 (amd) или arm

set "_ARCH_=unknown"
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".x86fre."   && set "_ARCH_=x86" 
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".amd64fre." && set "_ARCH_=x86-64" 
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".armfre."   && set "_ARCH_=arm" 

Альтернативный вариант (упомянутый ранее)

if defined ProgramFiles(x86) ( set "_ARCH_=x86-64" ) else ( set "_ARCH_=x86" )

Проблема с последним, когда вы испортите свои переменные, вы не можете использовать этот метод. Проверка наличия папки также вызовет проблемы, когда есть остатки предыдущей установки (или какой-то пользователь специально создал папку).

0
ответ дан FifthAxiom 27 August 2018 в 07:15
поделиться

Это правильный способ выполнить проверку по ссылке на базу знаний Microsoft ( http://support.microsoft.com/kb/556009 ), которую я имею повторно отредактирован в одну строку кода.

Он не полагается на какие-либо переменные среды или имена папок и вместо этого проверяет непосредственно в реестре.

Как показано в полном пакетный файл под ним устанавливает переменную среды OS, равную 32BIT или 64BIT, которую вы можете использовать по желанию.

@echo OFF

reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT

if %OS%==32BIT echo This is a 32bit operating system
if %OS%==64BIT echo This is a 64bit operating system
57
ответ дан informatik01 27 August 2018 в 07:15
поделиться

FYI, попробуйте и уйдите от использования% PROCESSOR_ARCHITECTURE%, поскольку SCCM внесла изменения в версию 2012, которая всегда запускает пакеты / программы под 32-разрядным процессом (он может установить x64, но переменные среды появятся как x86). Теперь я использую:

IF EXIST «% SystemDrive% \ Program Files (x86)» GOTO X64

Джек

-1
ответ дан Jack Fetter 27 August 2018 в 07:15
поделиться

Это однострочный, который будет иметь %errorlevel% из 0 для 64-битного, 1 для не-64-разрядных. Я не могу ручаться за то, что он работает со всеми версиями Windows, но демонстрирует один метод его определения. Вы можете добавить несколько запросов findstr, если знаете все возможности поиска.

set | findstr /i processo.*64 > nul 2>&1

В основном вы сбрасываете переменные среды и используете регулярное выражение для поиска чего-то, что имеет «processo« + »64« где-то в своей строке. Трубы предназначены только для подавления соответствующих линий. Если бы я изменил его на set | findstr /i processo.*64 > nul 2>&1 на моей текущей установке, это было бы результатом:

 C:\Windows\System32>set | findstr /i processo.*64
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 158 Stepping 9, GenuineIntel

Это однострочный просмотр, чтобы узнать, работает ли ваш процессор это 64-разрядный AMD

set | findstr /i processo.*amd.*64 > nul 2>&1

. Вы можете принять их как отправную точку и уточнить для своих требований. Я закончил использовать это над известными именами переменных среды из-за того, что он был более надежным в разных основных версиях Windows, с которыми я работал.

0
ответ дан kayleeFrye_onDeck 27 August 2018 в 07:15
поделиться

Правильный путь , поскольку SAM записывает ранее:

reg Query "HKLM \ Hardware \ Description \ System \ CentralProcessor \ 0" / v "Идентификатор" | find / i "x86"> NUL & amp; & amp; set OS = 32BIT || установите OS = 64BIT

, но с / v «Идентификатор» немного правильнее.

-1
ответ дан kgimpel 27 August 2018 в 07:15
поделиться
*** Start ***

@echo off

Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0

REG.exe Query %RegQry% > checkOS.txt

Find /i "x86" < CheckOS.txt > StringCheck.txt

If %ERRORLEVEL% == 0 (
    Echo "This is 32 Bit Operating system"
) ELSE (
    Echo "This is 64 Bit Operating System"
)

*** End ***

ссылка http://support.microsoft.com/kb/556009

5
ответ дан Mahesh 27 August 2018 в 07:15
поделиться

После долгих проб и ошибок, мне удалось получить несколько разных рабочих примеров, но кикер был, когда пакет был запущен на 64-битной ОС на 32-разрядной CMD. В конце концов, это была самая простая проверка, которую я мог бы приступить к работе, которая работает на Win2k-Win8 32/64. Также большое спасибо Филу, который помог мне в этом.

set bit64=n
if /I %Processor_Architecture%==AMD64 set bit64=y
if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" set bit64=y
1
ответ дан MidLifeXis 27 August 2018 в 07:15
поделиться

Я использую одно из следующего:

:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)

:64BIT
echo 64-bit...
GOTO END

:32BIT
echo 32-bit...
GOTO END

:END

или я устанавливаю переменную bit, которую я позже использую в своем скрипте для запуска правильной установки.

:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (set bit=x64) ELSE (set bit=x86)

или ...

:CheckOS
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x86) else (set bit=x64)

Надеюсь, что это поможет.

38
ответ дан Nic Hartley 27 August 2018 в 07:15
поделиться

«ProgramFiles (x86)» - это переменная среды, автоматически определяемая cmd.exe (как 32-разрядная, так и 64-разрядная версии) только для 64-разрядных компьютеров Windows, поэтому попробуйте следующее:

@ECHO OFF

echo Check operating system ...
if defined PROGRAMFILES(X86) (
    echo 64-bit sytem detected
) else (
    echo 32-bit sytem detected
)
pause
3
ответ дан panako 27 August 2018 в 07:15
поделиться
set bit=64
IF NOT DEFINED PROGRAMFILES(X86) (
set "PROGRAMFILES(X86)=%PROGRAMFILES%"
set bit=32
)
REM Example 1: REG IMPORT Install%bit%.reg (all compatibility)
REM Example 2: CD %PROGRAMFILES(X86)% (all compatibility)
0
ответ дан Riccardo La Marca 27 August 2018 в 07:15
поделиться

Вот хорошая краткая версия:

set isX64=False && if /I "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( set isX64=True ) else ( if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" ( set isX64=True ) )

echo %isX64%

Не используйте каталог «Program Files (x86)» в качестве доказательства чего-либо: непослушное программное обеспечение может легко создать этот каталог на 32-битной машине , Вместо этого используйте переменные среды PROCESSOR_ARCHITECTURE и PROCESSOR_ARCHITEW6432.

0
ответ дан Rory 27 August 2018 в 07:15
поделиться
If $SYSTEM_os_arch==x86 ( 
  Echo OS is 32bit
 ) else ( 
  ECHO OS is 64bit
)
-1
ответ дан Sourabh Kumar Sharma 27 August 2018 в 07:15
поделиться
PROCESSOR_ARCHITECTURE=x86

Появится на Win32, а для Win64 появится

PROCESSOR_ARCHITECTURE=AMD64

.

Если вы извращаете 32-битный cmd.exe процесс, то Windows представляет две переменные среды:

PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
3
ответ дан Steve-o 27 August 2018 в 07:15
поделиться

Вы можете использовать следующее расположение реестра, чтобы проверить, работает ли компьютер на 32 или 64 бит операционной системы Windows:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0

В правой панели вы увидите следующие записи реестра:

Identifier     REG_SZ             x86 Family 6 Model 14 Stepping 12
Platform ID    REG_DWORD          0x00000020(32)

Вышеуказанные x86 и 0x00000020(32) указывают, что версия операционной системы 32 бит.

0
ответ дан Sundeep 27 August 2018 в 07:15
поделиться

Если сценарий может работать под Администратором, он может использовать команду wmi.

FOR /f "tokens=2 delims==" %%f IN ('wmic os get osarchitecture /value ^| find "="') DO SET "OS_ARCH=%%f"
IF "%OS_ARCH%"=="32-bit" GOTO :32bit
IF "%OS_ARCH%"=="64-bit" GOTO :64bit

ECHO OS Architecture %OS_ARCH% is not supported!
EXIT 1

:32bit
ECHO "32 bit Operating System"
GOTO :SUCCESS

:64bit
ECHO "64 bit Operating System"
GOTO :SUCCESS

:SUCCESS
EXIT 0
1
ответ дан S_R 27 August 2018 в 07:15
поделиться

Ни один из ответов здесь не работал в моем случае (64-битный процессор, но 32-разрядная ОС), поэтому вот решение, которое сработало для меня:

(set | find "ProgramFiles(x86)" > NUL) && (echo "%ProgramFiles(x86)%" | find "x86") > NUL && set bits=64 || set bits=32
0
ответ дан teh_senaus 27 August 2018 в 07:15
поделиться

Кажется, что вы работаете только в следующих случаях:

echo "%PROCESSOR_ARCHITECTURE%"

Я нашел этот скрипт , который будет делать конкретные вещи в зависимости от архитектуры ОС (x64 или x86):

@echo off
echo Detecting OS processor type

if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto 64BIT
echo 32-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\i386\DPMAgentInstaller_x86 /q
goto END
:64BIT
echo 64-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\amd64\DPMAgentInstaller_x64 /q
:END

"C:\Program Files\Microsoft Data Protection Manager\DPM\bin\setdpmserver.exe" -dpmservername sa

Попробуйте найти способ без GOTO, пожалуйста ...

Для людей, которые работают с Unix-системами, uname -m выполнит трюк.

22
ответ дан ThierryB 27 August 2018 в 07:15
поделиться
set "_os=64"
if "%PROCESSOR_ARCHITECTURE%"=="x86" (if not defined PROCESSOR_ARCHITEW6432 set "_os=32")

На основании: https://blogs.msdn.microsoft.com/david.wang/2006/03/27/howto-detect-process-bitness/

и http://ss64.com/nt/syntax-64bit.html

-2
ответ дан user6239162 27 August 2018 в 07:15
поделиться

Выполните следующее в командной строке:

Пуск -> Выполнить -> Введите cmd и введите приведенную ниже команду в черный ящик:

wmic os get osarchitecture
4
ответ дан user66001 27 August 2018 в 07:15
поделиться

Вот мой личный фаворит, логическая бомба:)

::32/64Bit Switch
ECHO %PROCESSOR_ARCHITECTURE%|FINDSTR AMD64>NUL && SET ARCH=AMD64 || SET ARCH=x86
ECHO %ARCH%
PAUSE

С помощью AND (&&) и OR (||) это IF THEN ELSE Batch Construct.

1
ответ дан zzeroo 27 August 2018 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: