Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Работа с WMIC (http://forum.oszone.net/showthread.php?t=308489)

svoboda1984 27-11-2015 02:16 2579262

Работа с 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, необходима проверка на количество строк и использование функции. Уверен, что есть способ проще, ведь я в скриптах новичок. Лазил во многих темах по форуму, всё очень расплывчато и не тот результат. Мне необходимо понимать текст программы для использования его в будущем.

Elven 27-11-2015 14:09 2579371

Код:

@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 Cpct=%%B
set DvcLctr=%%C
set PrtNmbr=%%D
set Spd=%%E
set /a mmr=!mmr!+1
echo Memory !mmr!: !BnkLbl! !DvcLctr! !PrtNmbr! !Spd! !Cpct!
))


svoboda1984 27-11-2015 17:54 2579420

Спасибо 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 27-11-2015 19:17 2579432

Цитата:

Цитата svoboda1984
set /a res=Cpct/1073741824+1 »

2147483647 -- максимальное число для вычислений (2Гб - 1). Или получите ошибку:
Цитата:

Неверное число. Числа ограничены 32 битами точности.
Так что придется изобретать велосипед, считать по разрядам или вызывать внешние утилиты.

svoboda1984 27-11-2015 21:52 2579468

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) { }

svoboda1984 28-11-2015 00:37 2579500

Фух, придумал. Есть недочёты, но на данном этапе это почти идеальный вариант.

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-