Это решено для меня,
$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;
Выход: 2018-04-18
Я обычно делаю следующее:
: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
)
Многие команды 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 вы используете.
ПРИМЕЧАНИЯ:
Вернитесь на страницу Windows XP и DOS.
Я действительно не понимаю некоторые из приведенных здесь ответов (извините за это). Например, опрос с высоким рейтингом не возвращает архитектуру 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" )
Проблема с последним, когда вы испортите свои переменные, вы не можете использовать этот метод. Проверка наличия папки также вызовет проблемы, когда есть остатки предыдущей установки (или какой-то пользователь специально создал папку).
Это правильный способ выполнить проверку по ссылке на базу знаний 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
FYI, попробуйте и уйдите от использования% PROCESSOR_ARCHITECTURE%, поскольку SCCM внесла изменения в версию 2012, которая всегда запускает пакеты / программы под 32-разрядным процессом (он может установить x64, но переменные среды появятся как x86). Теперь я использую:
IF EXIST «% SystemDrive% \ Program Files (x86)» GOTO X64
Джек
Это однострочный, который будет иметь %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
blockquote>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, с которыми я работал.
Правильный путь , поскольку SAM записывает ранее:
reg Query "HKLM \ Hardware \ Description \ System \ CentralProcessor \ 0" / v "Идентификатор" | find / i "x86"> NUL & amp; & amp; set OS = 32BIT || установите OS = 64BIT
blockquote>, но с / v «Идентификатор» немного правильнее.
*** 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 ***
После долгих проб и ошибок, мне удалось получить несколько разных рабочих примеров, но кикер был, когда пакет был запущен на 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
Я использую одно из следующего:
: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)
Надеюсь, что это поможет.
«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
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)
Вот хорошая краткая версия:
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.
If $SYSTEM_os_arch==x86 (
Echo OS is 32bit
) else (
ECHO OS is 64bit
)
PROCESSOR_ARCHITECTURE=x86
Появится на Win32, а для Win64 появится
PROCESSOR_ARCHITECTURE=AMD64
.
Если вы извращаете 32-битный cmd.exe
процесс, то Windows представляет две переменные среды:
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
Вы можете использовать следующее расположение реестра, чтобы проверить, работает ли компьютер на 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 бит.
Если сценарий может работать под Администратором, он может использовать команду 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
Ни один из ответов здесь не работал в моем случае (64-битный процессор, но 32-разрядная ОС), поэтому вот решение, которое сработало для меня:
(set | find "ProgramFiles(x86)" > NUL) && (echo "%ProgramFiles(x86)%" | find "x86") > NUL && set bits=64 || set bits=32
Кажется, что вы работаете только в следующих случаях:
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
выполнит трюк.
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/
Выполните следующее в командной строке:
Пуск -> Выполнить -> Введите cmd
и введите приведенную ниже команду в черный ящик:
wmic os get osarchitecture
Вот мой личный фаворит, логическая бомба:)
::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.