![]() |
Работа с WMIC
Здраствуйте. Нуждаюсь в помощи. С помощью WMIC мне необходимо получить информацию и вывести её в таком виде:
Memory 1: BANK 0 ChannelA-DIMM0 CMX4GX3M2A1600C9 1333Mhz 2Gb Memory 2: BANK 2 ChannelB-DIMM0 CMX4GX3M2A1600C9 1333Mhz 2Gb Подскажите, как это можно осуществить максимально эффективным способом. Я пробовал через редактирование txt файла с выведенными в него данными командой: for /F "tokens=2 delims==" %%J in ('WMIC MemoryChip get BankLabel /Value^|FindStr .') do echo %%J>>1.txt for /F "tokens=2 delims==" %%J in ('WMIC MemoryChip get DeviceLocator /Value^|FindStr .') do echo %%J>>1.txt for /F "tokens=2 delims==" %%J in ('WMIC MemoryChip get PartNumber /Value^|FindStr .') do echo %%J>>1.txt for /F "tokens=2 delims==" %%J in ('WMIC MemoryChip get Speed /Value^|FindStr .') do echo %%J>>1.txt for /F "tokens=2 delims==" %%J in ('WMIC MemoryChip get Capacity /Value^|FindStr .') do ( set num1=%%J set /a res=num1/1073741824+1 echo !res!>>1.txt ) Очень большой код получается, ведь планок может быть и 3 и 4, необходима проверка на количество строк и использование функции. Уверен, что есть способ проще, ведь я в скриптах новичок. Лазил во многих темах по форуму, всё очень расплывчато и не тот результат. Мне необходимо понимать текст программы для использования его в будущем. |
Код:
@echo OFF |
Спасибо Elven, работает. Но осталась одна проблема, с которой в данном примере я совершенно не понимаю, как биться, всё из-за особенностей переменных в bat. Необходимо параметр Capacity перевести в удобной число, то бишь в гигабайты. set /a res=Cpct/1073741824+1. Как это сделать?, учитывая этот пример. Либо можно вывести отдельно, передать в файл и дописать в конец получившихся строк. Вроде бы несложно, но надо дописать соответствующий элемент в конец соответствующей строки. А я даже понятия не имею, как это осуществить. Посижу, подумаю, но если вы догадаетесь раньше, прошу напишите ответ.
Интересно ещё одно, если написать так: @echo OFF SETLOCAL ENABLEDELAYEDEXPANSION set mmr=0 for /f "skip=1 delims=" %%i in ('WMIC MemoryChip get BankLabel^,DeviceLocator^,PartNumber^,Speed^,Capacity') do ( for /f "tokens=1-5 delims=" %%A in ("%%i") do ( set BnkLbl=%%A set /a mmr=!mmr!+1 echo Memory !mmr!: !BnkLbl! )) Вывод получится тем же. Он записывает в переменную всю строку, что не даёт работать с каждым отдельным её элементом. |
Цитата:
Цитата:
|
Foreigner, моё число - это и есть 2Гб -1, я проверял, всё вычисляет. Дело даже не в этом. У меня есть функция на JS, которая позволяет вычислять большие числа. Я не знаю, как это приспособить к строке наиболее эффективно, хотя некоторые догадки есть. Придётся записывать в файл данные из полученной информации без памяти, после считывать по строке и добавлять к ней искомые 2Гб.
Вот, кстати и код для вычислений больших чисел: for /F "tokens=2 delims==" %%J in ('WMIC DiskDrive get Size /Value^|FindStr .') do set Num1=%%J set Num2=1073741824 ::set /p=%Num1% / %Num2%=<NUL call :Math %Num1% / %Num2% echo Size, Gb: %Result:~0,6% :Math if %2==/ call :_Math %~1 Div %~3& Exit /B Exit /B :_Math set Result=& (For /F "delims=" %%a in ('cscript //nologo /e:jscript "%~f0" "%~1" "%~2" "%~3"') do set "Result=%%a"& Exit /B)& Exit /B */try { switch (WScript.Arguments(1)) { case "Div": WScript.Echo (+WScript.Arguments(0) / +WScript.Arguments(2)); break; } } catch (e) { } |
Фух, придумал. Есть недочёты, но на данном этапе это почти идеальный вариант.
for /F "tokens=2 delims==" %%J in ('WMIC MemoryChip get Capacity /Value^|FindStr .') do ( set A=%%J set /a Res=A/1073741824+1 ) WMIC MemoryChip get BankLabel,DeviceLocator,PartNumber,Speed>>1.txt for /F "delims=" %%J in ('find /c /v "" "1.txt"') do set n=%%J set /a MIN=2 set /a MAX=%n:~18% set /a CNT=1 set /a Num=1 for /F "tokens=*" %%J in ('type 1.txt') do ( if !CNT! GEQ %MIN% ( if !CNT! LEQ %MAX% echo Memory!Num!: %%JMhz %Res% Gb ) set /a CNT=!CNT!+1 set /a Num=!CNT!-1 ) del 1.txt pause |
Время: 22:11. |
Время: 22:11.
© OSzone.net 2001-