2016-09-01 4 views
1

Я видел несколько пакетных скриптов, работающих таким образом, включая все вокруг stackoverflow.Получите результат команды WMIC и сохраните ее в переменной

Мой вопрос прост: почему часть MEM не работает?

@echo OFF 

SET CPU="$CPU" 

echo CPU: %NUMBER_OF_PROCESSORS% 

FOR /F "delims=" %%i IN ('wmic computersystem get TotalPhysicalMemory') DO set MEM=%%i 

echo MEM: %MEM% 
+0

Просьба сообщить о «не работает»! Я думаю, что вы столкнулись с проблемой, полученной из преобразования Unicode-ANSI вывода 'wmic' с помощью' for/F', который оставляет осирожденные символы возврата каретки, что мешает правильному анализу текста; взгляните на это сообщение для решения: [Разбор вывода wmic в сценарии оболочки] (http://stackoverflow.com/a/19351263). – aschipfl

ответ

1

Это просто. wmic computersystem get TotalPhysicalMemory выводит три строки текста:

TotalPhysicalMemory 
12867309568 
<blank line> 

Так ваш для цикла делает три итерации. В первом MEM установлено значение TotalPhysicalMemory, а во втором - 12867309568, и, наконец, оно становится. Таким образом, ваш выход пуст.

Это очень некрасиво, но будет решить вашу проблему:

@echo OFF 
setlocal enabledelayedexpansion 
SET CPU="$CPU" 
echo CPU: %NUMBER_OF_PROCESSORS% 
FOR /F "delims= skip=1" %%i IN ('wmic computersystem get TotalPhysicalMemory') DO (
    set MEM=%%i 
    goto STOP 

) 
:STOP 
echo MEM: !MEM! 

skip=1 будет игнорировать TotalPhysicalMemory и goto STOP будет разорвать петлю после первой итерации.

+0

Собственно, команда была отредактирована, чтобы упростить вопрос. Намерение: 'wmic computersystem получить TotalPhysicalMemory | Findstr -v "Total"» И результат скрипта для моего (протестировано на 4 серверах): G: \> get_numphycpu.bat CPU: 6 MEM: –

+0

Кстати, спасибо за ответ , Это сработало, и я понял почему :) –

+0

@DavidLago вы также можете проверить мой ответ с форматированием вывода WMIC с помощью цикла 'For/Do' – Hackoo

5

Вы можете сделать что-то подобное с форматированием вывода WMIC с For/Do петли так:

@echo off 
Call :GetTotalPhysicalMemory 
echo TotalPhysicalMemory = %MEM% & pause 
exit 
::*********************************************** 
:GetTotalPhysicalMemory 
for /f "tokens=2 delims==" %%a in (' 
    wmic computersystem get TotalPhysicalMemory /value 
') do for /f "delims=" %%b in ("%%a") do (
    Set "MEM=%%b" 
) 
exit /b 
::*********************************************** 
Смежные вопросы