Назад | Перейти на главную страницу

Как установить переменные в файле bat и передать их переменным php?

Я работаю над сценарием в Windows, чтобы получить системную информацию, я хочу сохранить результат каждой команды в переменной bat, а затем передать их в переменные php.

Вот сценарий, который я пробовал:

for /f  "tokens=1 delims=[" %a in ('ver') do SET OS=%a
for /f  "skip=1 tokens=1 delims=|" %a in ('wmic os get Name') do SET version=%a
for /f  "tokens=2 delims=[" %a in ('ver') do SET kernel= %a
for /f  "skip=1 tokens=1 delims= " %a in ('wmic os get osarchitecture') do SET arq=%a
for /f  "skip=1 tokens=1 delims= " %a in ('wmic computersystem get numberofprocessors') do SET numero_cpu=%a
for /f  "skip=1 tokens=1 delims= " %a in ('wmic cpu get manufacturer') do SET fabricante_cpu=%a
for /f  "skip=1 tokens=1,2 delims=" %a in ('wmic cpu get Name') do SET nombre_cpu=%a
for /f  "skip=1 tokens=1 delims=" %a in ('wmic cpu get CurrentClockSpeed') do SET frequence_cpu=%a
for /f  "skip=1 tokens=1 delims=" %a in ('wmic bios get name') do SET name_bios=%a
for /f  "skip=1 tokens=1 delims=" %a in ('wmic bios get version') do SET version_bios=%a
for /f  "skip=1 tokens=1 delims=" %a in ('wmic bios get serialnumber') do SET serial_bios=%a
for /f  "skip=1 tokens=1 delims=" %a in ('wmic bios get manufacturer') do SET fabricant_bios=%a
for /f  "skip=1 tokens=1 delims=" %a in ('wmic NIC get Description') do SET red=%a 
for /f  "skip=1 tokens=1 delims=" %a in ('wmic SOUNDDEV get productname') do SET audio=%a
for /f  "skip=1 tokens=1 delims=" %a in ('wmic PATH Win32_videocontroller GET description') do SET video= %a

ECHO %OS%:%version%:%kernel%:%arq%:%numero_cpu%:%fabricante_cpu%:%nombre_cpu%:%frequence_cpu%:%name_bios%:%version_bios%:%serial_bios%:%fabricant_bios%:%red%audio%:%video%:

Спасибо!

wmic поведение: каждая строка вывода заканчивается на 0x0D0D0A вместо обычного 0x0D0A. Это вызывает проблемы при разборе wmic вывод с for /F цикл: даже на вид пустой строка содержит ведущую 0x0D (возврат каретки) и, следовательно, там идентифицируется первый токен.

Доказательство (примечание сбежало ^, запятая):

==>for /F "delims=" %g in ('wmic os get caption^, name /value') do @echo 1st="%g"
"st="
"st="
"st="Caption=Microsoft Windows 8.1
"st="Name=Microsoft Windows 8.1|C:\Windows|\Device\Harddisk1\Partition2
"st="
"st="
"st="

==>

Решается с помощью дополнительного (вложенного) цикла, который используется в :getwmic подпрограмма (подпрограмма, выбранная для ограничения множественного кодирования). В for параметры цикла

  • %%g получить name=value только линии (см. /value переключатель и findstr);
  • %%G чтобы получить желаемое значение (2-й токен %%H) и убрать окончание возврат каретки в возвращаемом значении.

Передайте два строковых параметра в :getwmic процедура (ссылка %1 и %2 там):

  • простой wmic запрос (заключенный в двойные кавычки), запрашивающий единственное свойство wmi класс, например "wmic os get Name";
  • переменная среды название запрашиваемое свойство должно быть присвоено, например version.

Следующий сценарий дает только несколько примеров; все set команды просто echoed для отладки; удалить все echo не раньше, чем отлаживается. Обратите внимание, что

  • OS переменная уже существует; поэтому рассмотрим другое имя (OSx);
  • использовать set "variable=value" синтаксис с двойными кавычками, чтобы избежать некоторых символов специального значения в пакетном сценарии, например |, &, <, > и т.д., и убедитесь, что нет (случайно забытых) конечных пробелов;
  • | труба сбежала с ^ в for /f ... /value ^|findstr "="').

Сценарий:

@ECHO OFF >NUL

for /f "tokens=1 delims=[" %%a in ('ver') do echo SET "OSx=%%a"
for /f "tokens=2 delims=[]" %%a in ('ver') do echo SET "kernel=%%a%"

call :getwmic  "wmic os get Name" version
for /f "tokens=1 delims=|" %%a in ("%version%") do echo SET "version=%%a%

call :getwmic "wmic os get osarchitecture" arq
call :getwmic "wmic computersystem get numberofprocessors" numero_cpu
call :getwmic "wmic cpu get manufacturer" fabricante_cpu
call :getwmic "wmic cpu get Name" nombre_cpu
call :getwmic "wmic PATH Win32_videocontroller GET description" video

goto :yoursequel

:getwmic
for /F "delims=" %%g in ('%~1 /value ^|findstr "="') do (
  for /F "tokens=1* delims==" %%G in ("%%g") do echo set "%~2=%%H"
)
exit /B

:yoursequel
ECHO %OS%:%version%:%kernel%:%arq%:%numero_cpu%:%fabricante_cpu%:%nombre_cpu%:%frequence_cpu%:%name_bios%:%version_bios%:%serial_bios%:%fabricant_bios%:%red%audio%:%video%:

Ресурсы (обязательное чтение):